From 73cfb24a7b444d3db0806094e7a567e9087ee62f Mon Sep 17 00:00:00 2001 From: lecheel Date: Fri, 28 Feb 2025 09:22:04 +0800 Subject: [PATCH 1/7] feat: add Xai LLM integration - Implements the `Xai` struct and `LLM` trait for interacting with the X.AI API. - Includes error handling for missing API key. - Supports streaming responses and termination. --- .gitignore | 12 +++-- src/config.rs | 24 +++++++++ src/lib.rs | 2 + src/llm.rs | 3 ++ src/xai.rs | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 src/xai.rs diff --git a/.gitignore b/.gitignore index 7428e84..7d62961 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,9 @@ -/target -.undodir -tenere.archive +__pycache__ +debug +release +*.tgz +*.mp3 +tags +tmp +target +build diff --git a/src/config.rs b/src/config.rs index 00cb77e..b670f10 100644 --- a/src/config.rs +++ b/src/config.rs @@ -19,12 +19,31 @@ pub struct Config { pub llamacpp: Option, pub ollama: Option, + + pub xai: Option, } pub fn default_llm_backend() -> LLMBackend { LLMBackend::ChatGPT } +// XAI +#[derive(Deserialize, Debug, Clone)] +pub struct XaiConfig { + pub url: String, + pub xai_api_key: Option, + pub model: String, +} + +impl XaiConfig { + pub fn default_model() -> String { + String::from("grok-2") + } + + pub fn default_url() -> String { + String::from("https://api.xai/v1/chat/completions") + } +} // ChatGPT #[derive(Deserialize, Debug, Clone)] pub struct ChatGPTConfig { @@ -141,6 +160,11 @@ impl Config { std::process::exit(1) } + if app_config.llm == LLMBackend::Xai && app_config.xai.is_none() { + eprintln!("Config for XAI is not provided"); + std::process::exit(1) + } + app_config } } diff --git a/src/lib.rs b/src/lib.rs index 24035c8..92d9d94 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,3 +31,5 @@ pub mod chat; pub mod llamacpp; pub mod ollama; + +pub mod xai; diff --git a/src/llm.rs b/src/llm.rs index 5da3750..9916274 100644 --- a/src/llm.rs +++ b/src/llm.rs @@ -3,6 +3,7 @@ use crate::config::Config; use crate::event::Event; use crate::llamacpp::LLamacpp; use crate::ollama::Ollama; +use crate::xai::Xai; use async_trait::async_trait; use serde::Deserialize; use std::sync::atomic::AtomicBool; @@ -45,6 +46,7 @@ pub enum LLMBackend { ChatGPT, LLamacpp, Ollama, + Xai, } pub struct LLMModel; @@ -55,6 +57,7 @@ impl LLMModel { LLMBackend::ChatGPT => Box::new(ChatGPT::new(config.chatgpt.clone())), LLMBackend::LLamacpp => Box::new(LLamacpp::new(config.llamacpp.clone().unwrap())), LLMBackend::Ollama => Box::new(Ollama::new(config.ollama.clone().unwrap())), + LLMBackend::Xai => Box::new(Xai::new(config.xai.clone().unwrap())), } } } diff --git a/src/xai.rs b/src/xai.rs new file mode 100644 index 0000000..3343756 --- /dev/null +++ b/src/xai.rs @@ -0,0 +1,144 @@ +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use tokio::time::{sleep, Duration}; + +use crate::event::Event; +use async_trait::async_trait; +use regex::Regex; +use tokio::sync::mpsc::UnboundedSender; + +use crate::config::XaiConfig; +use crate::llm::{LLMAnswer, LLMRole, LLM}; +use reqwest::header::HeaderMap; +use serde_json::{json, Value}; +use std; +use std::collections::HashMap; + +#[derive(Clone, Debug)] +pub struct Xai { + client: reqwest::Client, + xai_api_key: String, + model: String, + url: String, + messages: Vec>, +} + +impl Xai { + pub fn new(config: XaiConfig) -> Self { + let xai_api_key = match std::env::var("XAI_API_KEY") { + Ok(key) => key, + Err(_) => config + .xai_api_key + .ok_or_else(|| { + eprintln!( + r#"Can not find the xai api key +You need to define one whether in the configuration file or as an environment variable"# + ); + + std::process::exit(1); + }) + .unwrap(), + }; + + Self { + client: reqwest::Client::new(), + xai_api_key, + model: config.model, + url: config.url, + messages: Vec::new(), + } + } +} + +#[async_trait] +impl LLM for Xai { + fn clear(&mut self) { + self.messages = Vec::new(); + } + + fn append_chat_msg(&mut self, msg: String, role: LLMRole) { + let mut conv: HashMap = HashMap::new(); + conv.insert("role".to_string(), role.to_string()); + conv.insert("content".to_string(), msg); + self.messages.push(conv); + } + + async fn ask( + &self, + sender: UnboundedSender, + terminate_response_signal: Arc, + ) -> Result<(), Box> { + let mut headers = HeaderMap::new(); + headers.insert("Content-Type", "application/json".parse()?); + headers.insert( + "Authorization", + format!("Bearer {}", self.xai_api_key).parse()?, + ); + + let mut messages: Vec> = vec![ + (HashMap::from([ + ("role".to_string(), "system".to_string()), + ( + "content".to_string(), + "You are a helpful assistant.".to_string(), + ), + ])), + ]; + + messages.extend(self.messages.clone()); + + let body: Value = json!({ + "model": self.model, + "messages": messages, + "stream": true, + }); + + let response = self + .client + .post(&self.url) + .headers(headers) + .json(&body) + .send() + .await?; + + match response.error_for_status() { + Ok(mut res) => { + sender.send(Event::LLMEvent(LLMAnswer::StartAnswer))?; + let re = Regex::new(r"data:\s(.*)")?; + + while let Some(chunk) = res.chunk().await? { + let chunk = std::str::from_utf8(&chunk)?; + + for captures in re.captures_iter(chunk) { + if let Some(data_json) = captures.get(1) { + if terminate_response_signal.load(Ordering::Relaxed) { + sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; + return Ok(()); + } + + if data_json.as_str() == "[DONE]" { + sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; + return Ok(()); + } + + let answer: Value = serde_json::from_str(data_json.as_str())?; + + let msg = answer["choices"][0]["delta"]["content"] + .as_str() + .unwrap_or("\n"); + + if msg != "null" { + sender.send(Event::LLMEvent(LLMAnswer::Answer(msg.to_string())))?; + } + + sleep(Duration::from_millis(100)).await; + } + } + } + } + Err(e) => return Err(Box::new(e)), + } + + Ok(()) + } +} From 4ca395305fbb49f82527e9141a911ca3cfcc03d9 Mon Sep 17 00:00:00 2001 From: lecheel Date: Fri, 28 Feb 2025 10:11:12 +0800 Subject: [PATCH 2/7] feat: add Gemini LLM integration - Implements the `Gemini` struct and `LLM` trait for interacting with the Gemini API. - Includes error handling for missing API key. - Supports streaming responses and termination. --- Cargo.lock | 3003 ------------------------------------------------- Cargo.toml | 2 + src/config.rs | 27 + src/gemini.rs | 357 ++++++ src/lib.rs | 2 + src/llm.rs | 3 + 6 files changed, 391 insertions(+), 3003 deletions(-) delete mode 100644 Cargo.lock create mode 100644 src/gemini.rs diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 0800c46..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,3003 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "ansi-to-tui" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67555e1f1ece39d737e28c8a017721287753af3f93225e4a445b29ccb0f5912c" -dependencies = [ - "nom", - "ratatui", - "simdutf8", - "smallvec", - "thiserror", -] - -[[package]] -name = "ansi_colours" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14eec43e0298190790f41679fe69ef7a829d2a2ddd78c8c00339e84710e435fe" -dependencies = [ - "rgb", -] - -[[package]] -name = "anstream" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" - -[[package]] -name = "anstyle-parse" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" - -[[package]] -name = "arboard" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" -dependencies = [ - "clipboard-win", - "core-graphics", - "image", - "log", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "parking_lot", - "windows-sys 0.48.0", - "x11rb", -] - -[[package]] -name = "async-trait" -version = "0.1.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide 0.7.4", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bat" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab792c2ad113a666f08856c88cdec0a62d732559b1f3982eedf0142571e669a" -dependencies = [ - "ansi_colours", - "anyhow", - "bincode", - "bugreport", - "bytesize", - "clap", - "clircle", - "console", - "content_inspector", - "encoding_rs", - "etcetera", - "flate2", - "git2", - "globset", - "grep-cli", - "home", - "indexmap", - "itertools", - "nu-ansi-term", - "once_cell", - "path_abs", - "plist", - "regex", - "semver", - "serde", - "serde_derive", - "serde_with", - "serde_yaml", - "shell-words", - "syntect", - "terminal-colorsaurus", - "thiserror", - "toml", - "unicode-width 0.1.13", - "walkdir", - "wild", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2", -] - -[[package]] -name = "bstr" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" -dependencies = [ - "memchr", - "regex-automata", - "serde", -] - -[[package]] -name = "bugreport" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535120b8182547808081a66f1f77a64533c780b23da26763e0ee34dfb94f98c9" -dependencies = [ - "git-version", - "shell-escape", - "sys-info", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytemuck" -version = "1.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" - -[[package]] -name = "bytesize" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" - -[[package]] -name = "cassowary" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" - -[[package]] -name = "castaway" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" -dependencies = [ - "rustversion", -] - -[[package]] -name = "cc" -version = "1.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", - "terminal_size", -] - -[[package]] -name = "clap_derive" -version = "4.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "clipboard-win" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" -dependencies = [ - "error-code", -] - -[[package]] -name = "clircle" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d9334f725b46fb9bed8580b9b47a932587e044fadb344ed7fa98774b067ac1a" -dependencies = [ - "cfg-if", - "windows", -] - -[[package]] -name = "colorchoice" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" - -[[package]] -name = "compact_str" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", -] - -[[package]] -name = "console" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width 0.2.0", - "windows-sys 0.59.0", -] - -[[package]] -name = "content_inspector" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" -dependencies = [ - "memchr", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossterm" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" -dependencies = [ - "bitflags 2.6.0", - "crossterm_winapi", - "futures-core", - "mio", - "parking_lot", - "rustix", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "error-code" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" - -[[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 = "fdeflate" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "flate2" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" -dependencies = [ - "crc32fast", - "miniz_oxide 0.8.0", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "gethostname" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" -dependencies = [ - "libc", - "windows-targets 0.48.5", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "git-version" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" -dependencies = [ - "git-version-macro", -] - -[[package]] -name = "git-version-macro" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "git2" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" -dependencies = [ - "bitflags 2.6.0", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "globset" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "grep-cli" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47f1288f0e06f279f84926fa4c17e3fcd2a22b357927a82f2777f7be26e4cec0" -dependencies = [ - "bstr", - "globset", - "libc", - "log", - "termcolor", - "winapi-util", -] - -[[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 = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" - -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - -[[package]] -name = "hyper-util" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "image" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" -dependencies = [ - "bytemuck", - "byteorder-lite", - "num-traits", - "png", - "tiff", -] - -[[package]] -name = "indexmap" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "indoc" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" - -[[package]] -name = "instability" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - -[[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" - -[[package]] -name = "js-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.158" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" - -[[package]] -name = "libgit2-sys" -version = "0.17.0+1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", -] - -[[package]] -name = "libz-sys" -version = "1.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "lru" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -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 = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", - "simd-adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi", - "libc", - "log", - "wasi", - "windows-sys 0.52.0", -] - -[[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 = "nu-ansi-term" -version = "0.50.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.6.0", - "block2", - "libc", - "objc2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.6.0", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2", - "objc2", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc2-encode" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.6.0", - "block2", - "libc", - "objc2", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.6.0", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.6.0", - "block2", - "objc2", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "object" -version = "0.36.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "onig" -version = "6.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f" -dependencies = [ - "bitflags 1.3.2", - "libc", - "once_cell", - "onig_sys", -] - -[[package]] -name = "onig_sys" -version = "69.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "path_abs" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ef02f6342ac01d8a93b65f96db53fe68a92a15f41144f97fb00a9e669633c3" -dependencies = [ - "std_prelude", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "plist" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" -dependencies = [ - "base64", - "indexmap", - "quick-xml", - "serde", - "time", -] - -[[package]] -name = "png" -version = "0.17.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.7.4", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-xml" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" -dependencies = [ - "memchr", -] - -[[package]] -name = "quinn" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" -dependencies = [ - "bytes", - "rand", - "ring", - "rustc-hash", - "rustls", - "slab", - "thiserror", - "tinyvec", - "tracing", -] - -[[package]] -name = "quinn-udp" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" -dependencies = [ - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -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", -] - -[[package]] -name = "ratatui" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" -dependencies = [ - "bitflags 2.6.0", - "cassowary", - "compact_str", - "crossterm", - "indoc", - "instability", - "itertools", - "lru", - "paste", - "strum", - "time", - "unicode-segmentation", - "unicode-truncate", - "unicode-width 0.2.0", -] - -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[package]] -name = "reqwest" -version = "0.12.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "windows-registry", -] - -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - -[[package]] -name = "rustix" -version = "0.38.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.23.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" -dependencies = [ - "base64", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" - -[[package]] -name = "rustls-webpki" -version = "0.102.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "serde" -version = "1.0.209" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.209" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" -dependencies = [ - "serde", - "serde_derive", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "shell-escape" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" - -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "simdutf8" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "std_prelude" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -dependencies = [ - "futures-core", -] - -[[package]] -name = "syntect" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874dcfa363995604333cf947ae9f751ca3af4522c60886774c4963943b4746b1" -dependencies = [ - "bincode", - "bitflags 1.3.2", - "flate2", - "fnv", - "once_cell", - "onig", - "plist", - "regex-syntax", - "serde", - "serde_derive", - "serde_json", - "thiserror", - "walkdir", - "yaml-rust", -] - -[[package]] -name = "sys-info" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "tenere" -version = "0.11.2" -dependencies = [ - "ansi-to-tui", - "arboard", - "async-trait", - "bat", - "clap", - "crossterm", - "dirs", - "futures", - "ratatui", - "regex", - "reqwest", - "serde", - "serde_json", - "strum", - "strum_macros", - "tokio", - "toml", - "tui-textarea", - "unicode-width 0.2.0", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "terminal-colorsaurus" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "858625398bdd5da7a96e8ad33a10031a50c3a5ad50d5aaa81a2827369a9c216c" -dependencies = [ - "cfg-if", - "libc", - "memchr", - "mio", - "terminal-trx", - "windows-sys 0.59.0", -] - -[[package]] -name = "terminal-trx" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a5b836e7f4f81afe61b5cd399eee774f25edcfd47009a76e29f53bb6487833" -dependencies = [ - "cfg-if", - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "terminal_size" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" -dependencies = [ - "rustix", - "windows-sys 0.48.0", -] - -[[package]] -name = "thiserror" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tiff" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -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.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tui-textarea" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a5318dd619ed73c52a9417ad19046724effc1287fb75cdcc4eca1d6ac1acbae" -dependencies = [ - "crossterm", - "ratatui", - "unicode-width 0.2.0", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode-truncate" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" -dependencies = [ - "itertools", - "unicode-segmentation", - "unicode-width 0.1.13", -] - -[[package]] -name = "unicode-width" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" - -[[package]] -name = "unicode-width" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "vcpkg" -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 = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" - -[[package]] -name = "web-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "weezl" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" - -[[package]] -name = "wild" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1" -dependencies = [ - "glob", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" -dependencies = [ - "windows-core", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-implement" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result 0.2.0", - "windows-strings", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - -[[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 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -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 = "winnow" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" -dependencies = [ - "memchr", -] - -[[package]] -name = "x11rb" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" -dependencies = [ - "gethostname", - "rustix", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index b75498b..2bfab4e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,8 @@ tokio = { version = "1", features = ["full"] } toml = { version = "0.8" } tui-textarea = "0.7" unicode-width = "0.2" +uuid = { version = "1.4", features = ["v4"] } +chrono = "0.4" [profile.release] lto = "fat" diff --git a/src/config.rs b/src/config.rs index b670f10..6bc9eb6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -21,6 +21,8 @@ pub struct Config { pub ollama: Option, pub xai: Option, + + pub gemini: Option, } pub fn default_llm_backend() -> LLMBackend { @@ -44,6 +46,25 @@ impl XaiConfig { String::from("https://api.xai/v1/chat/completions") } } + +// GEMINI +#[derive(Deserialize, Debug, Clone)] +pub struct GeminiConfig { + pub url: String, + pub gemini_api_key: Option, + pub model: String, +} + +impl GeminiConfig { + pub fn default_model() -> String { + String::from("flash-2.0-flash") + } + + pub fn default_url() -> String { + String::from("https://generativelanguage.googleapis.com/v1beta/models") + } +} + // ChatGPT #[derive(Deserialize, Debug, Clone)] pub struct ChatGPTConfig { @@ -165,6 +186,12 @@ impl Config { std::process::exit(1) } + if app_config.llm == LLMBackend::Gemini && app_config.xai.is_none() { + eprintln!("Config for GEMINI is not provided"); + std::process::exit(1) + } + + app_config } } diff --git a/src/gemini.rs b/src/gemini.rs new file mode 100644 index 0000000..be191a6 --- /dev/null +++ b/src/gemini.rs @@ -0,0 +1,357 @@ +// gemini.rs +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use tokio::time::{sleep, Duration}; +use crate::event::Event; +use async_trait::async_trait; +use regex::Regex; +use tokio::sync::mpsc::UnboundedSender; +use crate::config::GeminiConfig; +use crate::llm::{LLMAnswer, LLMRole, LLM}; +use reqwest::header::HeaderMap; +use serde_json::{json, Value}; +use std; +use std::collections::HashMap; + +// Configuration file example +// +// [gemini] +// base_url = "https://generativelanguage.googleapis.com/v1beta/models" +// model = "gemini-2.0-flash" +// + +#[derive(Clone, Debug)] +pub struct Gemini { + client: reqwest::Client, + gemini_api_key: String, + model: String, + url: String, + messages: Vec>, +} + +impl Gemini { + pub fn extract_text_from_gemini_response(json_response: &Value) -> Option { + json_response + .get("candidates")? + .as_array()? + .first()? + .get("content")? + .get("parts")? + .as_array()? + .first()? + .get("text")? + .as_str() + .map(String::from) + } + pub fn new(config: GeminiConfig) -> Self { + let gemini_api_key = match std::env::var("GEMINI_API_KEY") { + Ok(key) => key, + Err(_) => config + .gemini_api_key + .ok_or_else(|| { + eprintln!( + r#"Can not find the gemini api key +You need to define one whether in the configuration file or as an environment variable"# + ); + std::process::exit(1); + }) + .unwrap(), + }; + + let base_url = if config.url.is_empty() { + GeminiConfig::default_url() + } else { + config.url.clone() + }; + + let fix_url = format!("{}/{}:generateContent", base_url, config.model); + Self { + client: reqwest::Client::new(), + gemini_api_key, + model: config.model, + url: fix_url, + messages: Vec::new(), + } + } +} + +#[async_trait] +impl LLM for Gemini { + fn clear(&mut self) { + self.messages = Vec::new(); + } + + fn append_chat_msg(&mut self, msg: String, role: LLMRole) { + let mut conv: HashMap = HashMap::new(); + conv.insert("role".to_string(), role.to_string()); + conv.insert("content".to_string(), msg); + self.messages.push(conv); + } + + async fn ask( + &self, + sender: UnboundedSender, + terminate_response_signal: Arc, + ) -> Result<(), Box> { + // Check if the URL contains "openai" to determine API format + let is_openai_compatible = self.url.contains("openai"); + + if is_openai_compatible { + // Use OpenAI-compatible format + self.ask_openai_format(sender, terminate_response_signal).await + } else { + // Use native Gemini API format + self.ask_gemini_format(sender, terminate_response_signal).await + } + } +} + +impl Gemini { + async fn ask_openai_format( + &self, + sender: UnboundedSender, + terminate_response_signal: Arc, + ) -> Result<(), Box> { + let mut headers = HeaderMap::new(); + headers.insert("Content-Type", "application/json".parse()?); + headers.insert( + "Authorization", + format!("Bearer {}", self.gemini_api_key).parse()?, + ); + + let mut messages: Vec> = vec![ + (HashMap::from([ + ("role".to_string(), "system".to_string()), + ( + "content".to_string(), + "You are a helpful assistant.".to_string(), + ), + ])), + ]; + messages.extend(self.messages.clone()); + + let body: Value = json!({ + "model": self.model, + "messages": messages, + "stream": true, + }); + + let response = self + .client + .post(&self.url) + .headers(headers) + .json(&body) + .send() + .await?; + + match response.error_for_status() { + Ok(mut res) => { + sender.send(Event::LLMEvent(LLMAnswer::StartAnswer))?; + let re = Regex::new(r"data:\s(.*)")?; + while let Some(chunk) = res.chunk().await? { + let chunk = std::str::from_utf8(&chunk)?; + for captures in re.captures_iter(chunk) { + if let Some(data_json) = captures.get(1) { + if terminate_response_signal.load(Ordering::Relaxed) { + sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; + return Ok(()); + } + if data_json.as_str() == "[DONE]" { + sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; + return Ok(()); + } + let answer: Value = serde_json::from_str(data_json.as_str())?; + let msg = answer["choices"][0]["delta"]["content"] + .as_str() + .unwrap_or("\n"); + if msg != "null" { + sender.send(Event::LLMEvent(LLMAnswer::Answer(msg.to_string())))?; + } + sleep(Duration::from_millis(100)).await; + } + } + } + sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; + } + Err(e) => { + eprintln!("Error in OpenAI format request: {:?}", e); + return Err(Box::new(e)); + } + } + Ok(()) + } + + async fn ask_gemini_format( + &self, + sender: UnboundedSender, + terminate_response_signal: Arc, + ) -> Result<(), Box> { + // Format the URL with API key as query parameter + let url = if self.url.contains("?") { + format!("{}&key={}", self.url, self.gemini_api_key) + } else { + format!("{}?key={}", self.url, self.gemini_api_key) + }; + + // Convert messages to Gemini format + let contents = self.convert_messages_to_gemini_format(); + + // Create request body + let body: Value = json!({ + "contents": contents, + "generationConfig": { + "temperature": 0.7, + "topK": 32, + "topP": 0.95, + "maxOutputTokens": 8192 + } + }); + + //println!("Sending request to URL: {}", url); + // Make the request + let response = self + .client + .post(&url) + .header("Content-Type", "application/json") + .json(&body) + .send() + .await?; + + // Process the response + match response.error_for_status() { + Ok(res) => { + sender.send(Event::LLMEvent(LLMAnswer::StartAnswer))?; + + let response_text = res.text().await?; + let json_response: Value = serde_json::from_str(&response_text)?; + + // Extract text from Gemini response + if let Some(text) = Self::extract_text_from_gemini_response(&json_response) { + // Simulate streaming by breaking text into chunks + for (_i, chunk) in text.chars().collect::>().chunks(5).enumerate() { + if terminate_response_signal.load(Ordering::Relaxed) { + break; + } + + // Simulate SSE format for compatibility with OpenAI handler + let delta_json = json!({ + "id": format!("chatcmpl-{}", uuid::Uuid::new_v4()), + "object": "chat.completion.chunk", + "created": chrono::Utc::now().timestamp(), + "model": self.model.clone(), + "choices": [{ + "index": 0, + "delta": { + "content": chunk.iter().collect::() + }, + "finish_reason": null + }] + }); + + // Convert to SSE format + let sse_message = format!("data: {}\n\n", delta_json.to_string()); + + // Process using the same regex as ChatGPT handler + let re = Regex::new(r"data:\s(.*)")?; + for captures in re.captures_iter(&sse_message) { + if let Some(data_json) = captures.get(1) { + let answer: Value = serde_json::from_str(data_json.as_str())?; + let msg = answer["choices"][0]["delta"]["content"] + .as_str() + .unwrap_or("\n"); + + if msg != "null" { + sender.send(Event::LLMEvent(LLMAnswer::Answer(msg.to_string())))?; + } + + sleep(Duration::from_millis(10)).await; + } + } + } + + // Send [DONE] message in SSE format + let sse_done = "data: [DONE]\n\n"; + let re = Regex::new(r"data:\s(.*)")?; + for captures in re.captures_iter(sse_done) { + if let Some(data_json) = captures.get(1) { + if data_json.as_str() == "[DONE]" { + sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; + } + } + } + } else { + // Handle parsing error + sender.send(Event::LLMEvent(LLMAnswer::Answer( + "Error: Unable to parse Gemini response".to_string() + )))?; + sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; + } + } + Err(e) => { + let error_message = format!("Error with Gemini request: {:?}", e); + sender.send(Event::LLMEvent(LLMAnswer::Answer(error_message)))?; + sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; + return Err(Box::new(e)); + } + } + Ok(()) + } + + // Helper function to convert messages to Gemini format + fn convert_messages_to_gemini_format(&self) -> Vec { + let mut contents: Vec = Vec::new(); + let mut current_role = ""; + let mut current_parts: Vec = Vec::new(); + + // Add system message if needed + let has_system_message = self.messages.iter().any(|msg| msg["role"] == "system"); + if !has_system_message { + contents.push(json!({ + "role": "user", + "parts": [{"text": "You are a helpful assistant."}] + })); + contents.push(json!({ + "role": "model", + "parts": [{"text": "I'm a helpful assistant."}] + })); + } + + // Process all messages + for msg in &self.messages { + let role = &msg["role"]; + let content = &msg["content"]; + + let gemini_role = match role.as_str() { + "system" => "user", // Gemini doesn't have system role + "user" => "user", + "assistant" => "model", + _ => "user", + }; + + // If role changes, add previous content + if !current_role.is_empty() && current_role != gemini_role { + if !current_parts.is_empty() { + contents.push(json!({ + "role": current_role, + "parts": current_parts + })); + current_parts = Vec::new(); + } + } + + current_role = gemini_role; + current_parts.push(json!({"text": content})); + } + + // Add the last role's content + if !current_role.is_empty() && !current_parts.is_empty() { + contents.push(json!({ + "role": current_role, + "parts": current_parts + })); + } + + contents + } + +} diff --git a/src/lib.rs b/src/lib.rs index 92d9d94..3e4b208 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -33,3 +33,5 @@ pub mod llamacpp; pub mod ollama; pub mod xai; + +pub mod gemini; diff --git a/src/llm.rs b/src/llm.rs index 9916274..e4c2776 100644 --- a/src/llm.rs +++ b/src/llm.rs @@ -4,6 +4,7 @@ use crate::event::Event; use crate::llamacpp::LLamacpp; use crate::ollama::Ollama; use crate::xai::Xai; +use crate::gemini::Gemini; use async_trait::async_trait; use serde::Deserialize; use std::sync::atomic::AtomicBool; @@ -47,6 +48,7 @@ pub enum LLMBackend { LLamacpp, Ollama, Xai, + Gemini, } pub struct LLMModel; @@ -58,6 +60,7 @@ impl LLMModel { LLMBackend::LLamacpp => Box::new(LLamacpp::new(config.llamacpp.clone().unwrap())), LLMBackend::Ollama => Box::new(Ollama::new(config.ollama.clone().unwrap())), LLMBackend::Xai => Box::new(Xai::new(config.xai.clone().unwrap())), + LLMBackend::Gemini => Box::new(Gemini::new(config.gemini.clone().unwrap())), } } } From 2d631e52b30b94896001addcaf6db9115e7c80b4 Mon Sep 17 00:00:00 2001 From: lecheel Date: Fri, 28 Feb 2025 17:04:28 +0800 Subject: [PATCH 3/7] feat: remove Xai LLM integration - Remove Xai LLM backend - Remove xai config --- Cargo.toml | 8 +-- src/config.rs | 27 +--------- src/lib.rs | 2 - src/llm.rs | 3 -- src/xai.rs | 144 -------------------------------------------------- 5 files changed, 5 insertions(+), 179 deletions(-) delete mode 100644 src/xai.rs diff --git a/Cargo.toml b/Cargo.toml index 2bfab4e..a481164 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ unicode-width = "0.2" uuid = { version = "1.4", features = ["v4"] } chrono = "0.4" -[profile.release] -lto = "fat" -strip = true -codegen-units = 1 +# [profile.release] +# lto = "fat" +# strip = true +# codegen-units = 1 diff --git a/src/config.rs b/src/config.rs index 6bc9eb6..0993024 100644 --- a/src/config.rs +++ b/src/config.rs @@ -20,8 +20,6 @@ pub struct Config { pub ollama: Option, - pub xai: Option, - pub gemini: Option, } @@ -29,24 +27,6 @@ pub fn default_llm_backend() -> LLMBackend { LLMBackend::ChatGPT } -// XAI -#[derive(Deserialize, Debug, Clone)] -pub struct XaiConfig { - pub url: String, - pub xai_api_key: Option, - pub model: String, -} - -impl XaiConfig { - pub fn default_model() -> String { - String::from("grok-2") - } - - pub fn default_url() -> String { - String::from("https://api.xai/v1/chat/completions") - } -} - // GEMINI #[derive(Deserialize, Debug, Clone)] pub struct GeminiConfig { @@ -181,12 +161,7 @@ impl Config { std::process::exit(1) } - if app_config.llm == LLMBackend::Xai && app_config.xai.is_none() { - eprintln!("Config for XAI is not provided"); - std::process::exit(1) - } - - if app_config.llm == LLMBackend::Gemini && app_config.xai.is_none() { + if app_config.llm == LLMBackend::Gemini && app_config.gemini.is_none() { eprintln!("Config for GEMINI is not provided"); std::process::exit(1) } diff --git a/src/lib.rs b/src/lib.rs index 3e4b208..d90f885 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,6 +32,4 @@ pub mod llamacpp; pub mod ollama; -pub mod xai; - pub mod gemini; diff --git a/src/llm.rs b/src/llm.rs index e4c2776..2e2ca13 100644 --- a/src/llm.rs +++ b/src/llm.rs @@ -3,7 +3,6 @@ use crate::config::Config; use crate::event::Event; use crate::llamacpp::LLamacpp; use crate::ollama::Ollama; -use crate::xai::Xai; use crate::gemini::Gemini; use async_trait::async_trait; use serde::Deserialize; @@ -47,7 +46,6 @@ pub enum LLMBackend { ChatGPT, LLamacpp, Ollama, - Xai, Gemini, } @@ -59,7 +57,6 @@ impl LLMModel { LLMBackend::ChatGPT => Box::new(ChatGPT::new(config.chatgpt.clone())), LLMBackend::LLamacpp => Box::new(LLamacpp::new(config.llamacpp.clone().unwrap())), LLMBackend::Ollama => Box::new(Ollama::new(config.ollama.clone().unwrap())), - LLMBackend::Xai => Box::new(Xai::new(config.xai.clone().unwrap())), LLMBackend::Gemini => Box::new(Gemini::new(config.gemini.clone().unwrap())), } } diff --git a/src/xai.rs b/src/xai.rs deleted file mode 100644 index 3343756..0000000 --- a/src/xai.rs +++ /dev/null @@ -1,144 +0,0 @@ -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; -use tokio::time::{sleep, Duration}; - -use crate::event::Event; -use async_trait::async_trait; -use regex::Regex; -use tokio::sync::mpsc::UnboundedSender; - -use crate::config::XaiConfig; -use crate::llm::{LLMAnswer, LLMRole, LLM}; -use reqwest::header::HeaderMap; -use serde_json::{json, Value}; -use std; -use std::collections::HashMap; - -#[derive(Clone, Debug)] -pub struct Xai { - client: reqwest::Client, - xai_api_key: String, - model: String, - url: String, - messages: Vec>, -} - -impl Xai { - pub fn new(config: XaiConfig) -> Self { - let xai_api_key = match std::env::var("XAI_API_KEY") { - Ok(key) => key, - Err(_) => config - .xai_api_key - .ok_or_else(|| { - eprintln!( - r#"Can not find the xai api key -You need to define one whether in the configuration file or as an environment variable"# - ); - - std::process::exit(1); - }) - .unwrap(), - }; - - Self { - client: reqwest::Client::new(), - xai_api_key, - model: config.model, - url: config.url, - messages: Vec::new(), - } - } -} - -#[async_trait] -impl LLM for Xai { - fn clear(&mut self) { - self.messages = Vec::new(); - } - - fn append_chat_msg(&mut self, msg: String, role: LLMRole) { - let mut conv: HashMap = HashMap::new(); - conv.insert("role".to_string(), role.to_string()); - conv.insert("content".to_string(), msg); - self.messages.push(conv); - } - - async fn ask( - &self, - sender: UnboundedSender, - terminate_response_signal: Arc, - ) -> Result<(), Box> { - let mut headers = HeaderMap::new(); - headers.insert("Content-Type", "application/json".parse()?); - headers.insert( - "Authorization", - format!("Bearer {}", self.xai_api_key).parse()?, - ); - - let mut messages: Vec> = vec![ - (HashMap::from([ - ("role".to_string(), "system".to_string()), - ( - "content".to_string(), - "You are a helpful assistant.".to_string(), - ), - ])), - ]; - - messages.extend(self.messages.clone()); - - let body: Value = json!({ - "model": self.model, - "messages": messages, - "stream": true, - }); - - let response = self - .client - .post(&self.url) - .headers(headers) - .json(&body) - .send() - .await?; - - match response.error_for_status() { - Ok(mut res) => { - sender.send(Event::LLMEvent(LLMAnswer::StartAnswer))?; - let re = Regex::new(r"data:\s(.*)")?; - - while let Some(chunk) = res.chunk().await? { - let chunk = std::str::from_utf8(&chunk)?; - - for captures in re.captures_iter(chunk) { - if let Some(data_json) = captures.get(1) { - if terminate_response_signal.load(Ordering::Relaxed) { - sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; - return Ok(()); - } - - if data_json.as_str() == "[DONE]" { - sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; - return Ok(()); - } - - let answer: Value = serde_json::from_str(data_json.as_str())?; - - let msg = answer["choices"][0]["delta"]["content"] - .as_str() - .unwrap_or("\n"); - - if msg != "null" { - sender.send(Event::LLMEvent(LLMAnswer::Answer(msg.to_string())))?; - } - - sleep(Duration::from_millis(100)).await; - } - } - } - } - Err(e) => return Err(Box::new(e)), - } - - Ok(()) - } -} From cc6ce6f7ad19b12258aea681e4fa012cb5304d05 Mon Sep 17 00:00:00 2001 From: lecheel Date: Wed, 5 Mar 2025 13:44:01 +0800 Subject: [PATCH 4/7] feat: enable release optimizations - Uncomment release profile settings - Enable LTO, stripping, and single codegen unit --- Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a481164..2bfab4e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ unicode-width = "0.2" uuid = { version = "1.4", features = ["v4"] } chrono = "0.4" -# [profile.release] -# lto = "fat" -# strip = true -# codegen-units = 1 +[profile.release] +lto = "fat" +strip = true +codegen-units = 1 From e0b5866865c9897a41d90ee7ceda076db2220e30 Mon Sep 17 00:00:00 2001 From: Badr Date: Sun, 16 Mar 2025 12:32:33 +0100 Subject: [PATCH 5/7] trigger CI for PR --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 23b46b5..9d96445 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,5 +1,6 @@ --- on: + pull_request: push: branches: - "*" From 6495e262e6d05f5509aa88982918e64929d103b3 Mon Sep 17 00:00:00 2001 From: lecheel Date: Wed, 30 Apr 2025 10:00:12 +0800 Subject: [PATCH 6/7] refactor: streamline Gemini API integration for just lint --- Cargo.lock | 3506 +++++++++++++++++++++++++++++++++++++++++++++++++ ops.sh | 3 + src/config.rs | 3 +- src/gemini.rs | 95 +- src/llm.rs | 2 +- tenere | Bin 0 -> 8689384 bytes 6 files changed, 3551 insertions(+), 58 deletions(-) create mode 100644 Cargo.lock create mode 100755 ops.sh create mode 100755 tenere diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..507417d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3506 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi-to-tui" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67555e1f1ece39d737e28c8a017721287753af3f93225e4a445b29ccb0f5912c" +dependencies = [ + "nom", + "ratatui", + "simdutf8", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "ansi_colours" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14eec43e0298190790f41679fe69ef7a829d2a2ddd78c8c00339e84710e435fe" +dependencies = [ + "rgb", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "arboard" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "parking_lot", + "percent-encoding", + "windows-sys 0.59.0", + "x11rb", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bat" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab792c2ad113a666f08856c88cdec0a62d732559b1f3982eedf0142571e669a" +dependencies = [ + "ansi_colours", + "anyhow", + "bincode", + "bugreport", + "bytesize", + "clap", + "clircle", + "console", + "content_inspector", + "encoding_rs", + "etcetera", + "flate2", + "git2", + "globset", + "grep-cli", + "home", + "indexmap", + "itertools", + "nu-ansi-term", + "once_cell", + "path_abs", + "plist", + "regex", + "semver", + "serde", + "serde_derive", + "serde_with", + "serde_yaml", + "shell-words", + "syntect", + "terminal-colorsaurus", + "thiserror 1.0.69", + "toml", + "unicode-width 0.1.14", + "walkdir", + "wild", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "bugreport" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f280f65ce85b880919349bbfcb204930291251eedcb2e5f84ce2f51df969c162" +dependencies = [ + "git-version", + "shell-escape", + "sysinfo", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytemuck" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "bytesize" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659" + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cc" +version = "1.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[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.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", + "terminal_size", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "clircle" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d9334f725b46fb9bed8580b9b47a932587e044fadb344ed7fa98774b067ac1a" +dependencies = [ + "cfg-if", + "windows 0.56.0", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "compact_str" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "content_inspector" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" +dependencies = [ + "memchr", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[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-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crossterm" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags 2.9.0", + "crossterm_winapi", + "futures-core", + "mio", + "parking_lot", + "rustix 0.38.44", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.0", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "error-code" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" + +[[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 = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "git2" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" +dependencies = [ + "bitflags 2.9.0", + "libc", + "libgit2-sys", + "log", + "url", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "globset" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "grep-cli" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47f1288f0e06f279f84926fa4c17e3fcd2a22b357927a82f2777f7be26e4cec0" +dependencies = [ + "bstr", + "globset", + "libc", + "log", + "termcolor", + "winapi-util", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", + "tiff", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", + "serde", +] + +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + +[[package]] +name = "instability" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +dependencies = [ + "darling", + "indoc", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.2", + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libgit2-sys" +version = "0.17.0+1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", +] + +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +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 = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[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 = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "objc2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +dependencies = [ + "bitflags 2.9.0", + "objc2", + "objc2-core-graphics", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags 2.9.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags 2.9.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +dependencies = [ + "bitflags 2.9.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +dependencies = [ + "bitflags 2.9.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "onig" +version = "6.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f" +dependencies = [ + "bitflags 1.3.2", + "libc", + "once_cell", + "onig_sys", +] + +[[package]] +name = "onig_sys" +version = "69.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path_abs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ef02f6342ac01d8a93b65f96db53fe68a92a15f41144f97fb00a9e669633c3" +dependencies = [ + "std_prelude", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d" +dependencies = [ + "base64", + "indexmap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[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.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.12", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" +dependencies = [ + "bytes", + "getrandom 0.3.2", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[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", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "ratatui" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" +dependencies = [ + "bitflags 2.9.0", + "cassowary", + "compact_str", + "crossterm", + "indoc", + "instability", + "itertools", + "lru", + "paste", + "strum", + "time", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.2.0", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "windows-registry", +] + +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +dependencies = [ + "web-time", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "serde", + "serde_derive", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "shell-escape" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "std_prelude" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syntect" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874dcfa363995604333cf947ae9f751ca3af4522c60886774c4963943b4746b1" +dependencies = [ + "bincode", + "bitflags 1.3.2", + "flate2", + "fnv", + "once_cell", + "onig", + "plist", + "regex-syntax", + "serde", + "serde_derive", + "serde_json", + "thiserror 1.0.69", + "walkdir", + "yaml-rust", +] + +[[package]] +name = "sysinfo" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows 0.57.0", +] + +[[package]] +name = "tenere" +version = "0.11.2" +dependencies = [ + "ansi-to-tui", + "arboard", + "async-trait", + "bat", + "chrono", + "clap", + "crossterm", + "dirs", + "futures", + "ratatui", + "regex", + "reqwest", + "serde", + "serde_json", + "strum", + "strum_macros", + "tokio", + "toml", + "tui-textarea", + "unicode-width 0.2.0", + "uuid", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "terminal-colorsaurus" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7afe4c174a3cbfb52ebcb11b28965daf74fe9111d4e07e40689d05af06e26e8" +dependencies = [ + "cfg-if", + "libc", + "memchr", + "mio", + "terminal-trx", + "windows-sys 0.59.0", + "xterm-color", +] + +[[package]] +name = "terminal-trx" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975b4233aefa1b02456d5e53b22c61653c743e308c51cf4181191d8ce41753ab" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "terminal_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +dependencies = [ + "rustix 1.0.5", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[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", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +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.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tui-textarea" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5318dd619ed73c52a9417ad19046724effc1287fb75cdcc4eca1d6ac1acbae" +dependencies = [ + "crossterm", + "ratatui", + "unicode-width 0.2.0", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools", + "unicode-segmentation", + "unicode-width 0.1.14", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "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.26.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29aad86cec885cafd03e8305fd727c418e970a521322c91688414d5b8efba16b" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "wild" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1" +dependencies = [ + "glob", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" +dependencies = [ + "windows-core 0.56.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +dependencies = [ + "windows-implement 0.56.0", + "windows-interface 0.56.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.2", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-implement" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result 0.3.2", + "windows-strings 0.3.1", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +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 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "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-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[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_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[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_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[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_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[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_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[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_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[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 = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "gethostname", + "rustix 0.38.44", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xterm-color" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de5f056fb9dc8b7908754867544e26145767187aaac5a98495e88ad7cb8a80f" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/ops.sh b/ops.sh new file mode 100755 index 0000000..d850099 --- /dev/null +++ b/ops.sh @@ -0,0 +1,3 @@ +#! /bin/bash +cargo build --release +cp ./target/release/tenere . diff --git a/src/config.rs b/src/config.rs index 0993024..941783c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -27,7 +27,7 @@ pub fn default_llm_backend() -> LLMBackend { LLMBackend::ChatGPT } -// GEMINI +// GEMINI #[derive(Deserialize, Debug, Clone)] pub struct GeminiConfig { pub url: String, @@ -166,7 +166,6 @@ impl Config { std::process::exit(1) } - app_config } } diff --git a/src/gemini.rs b/src/gemini.rs index be191a6..6380eff 100644 --- a/src/gemini.rs +++ b/src/gemini.rs @@ -1,24 +1,16 @@ -// gemini.rs -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; -use tokio::time::{sleep, Duration}; +use crate::config::GeminiConfig; use crate::event::Event; +use crate::llm::{LLMAnswer, LLMRole, LLM}; use async_trait::async_trait; use regex::Regex; -use tokio::sync::mpsc::UnboundedSender; -use crate::config::GeminiConfig; -use crate::llm::{LLMAnswer, LLMRole, LLM}; use reqwest::header::HeaderMap; use serde_json::{json, Value}; use std; use std::collections::HashMap; - -// Configuration file example -// -// [gemini] -// base_url = "https://generativelanguage.googleapis.com/v1beta/models" -// model = "gemini-2.0-flash" -// +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use tokio::sync::mpsc::UnboundedSender; +use tokio::time::{sleep, Duration}; #[derive(Clone, Debug)] pub struct Gemini { @@ -50,9 +42,9 @@ impl Gemini { .gemini_api_key .ok_or_else(|| { eprintln!( - r#"Can not find the gemini api key + r#"Can not find the gemini api key You need to define one whether in the configuration file or as an environment variable"# - ); + ); std::process::exit(1); }) .unwrap(), @@ -98,10 +90,12 @@ impl LLM for Gemini { if is_openai_compatible { // Use OpenAI-compatible format - self.ask_openai_format(sender, terminate_response_signal).await + self.ask_openai_format(sender, terminate_response_signal) + .await } else { // Use native Gemini API format - self.ask_gemini_format(sender, terminate_response_signal).await + self.ask_gemini_format(sender, terminate_response_signal) + .await } } } @@ -142,7 +136,7 @@ impl Gemini { .headers(headers) .json(&body) .send() - .await?; + .await?; match response.error_for_status() { Ok(mut res) => { @@ -199,23 +193,18 @@ impl Gemini { // Create request body let body: Value = json!({ "contents": contents, - "generationConfig": { - "temperature": 0.7, - "topK": 32, - "topP": 0.95, - "maxOutputTokens": 8192 - } }); - //println!("Sending request to URL: {}", url); - // Make the request let response = self .client .post(&url) .header("Content-Type", "application/json") .json(&body) .send() - .await?; + .await?; + + // Compile regex once + let re = Regex::new(r"data:\s(.*)")?; // Process the response match response.error_for_status() { @@ -227,32 +216,30 @@ impl Gemini { // Extract text from Gemini response if let Some(text) = Self::extract_text_from_gemini_response(&json_response) { - // Simulate streaming by breaking text into chunks - for (_i, chunk) in text.chars().collect::>().chunks(5).enumerate() { + for chunk in text.chars().collect::>().chunks(5) { if terminate_response_signal.load(Ordering::Relaxed) { break; } // Simulate SSE format for compatibility with OpenAI handler let delta_json = json!({ - "id": format!("chatcmpl-{}", uuid::Uuid::new_v4()), - "object": "chat.completion.chunk", - "created": chrono::Utc::now().timestamp(), - "model": self.model.clone(), - "choices": [{ - "index": 0, - "delta": { - "content": chunk.iter().collect::() - }, - "finish_reason": null - }] - }); + "id": format!("chatcmpl-{}", uuid::Uuid::new_v4()), + "object": "chat.completion.chunk", + "created": chrono::Utc::now().timestamp(), + "model": self.model.clone(), + "choices": [{ + "index": 0, + "delta": { + "content": chunk.iter().collect::() + }, + "finish_reason": null + }] + }); // Convert to SSE format - let sse_message = format!("data: {}\n\n", delta_json.to_string()); + let sse_message = format!("data: {}\n\n", delta_json); // Process using the same regex as ChatGPT handler - let re = Regex::new(r"data:\s(.*)")?; for captures in re.captures_iter(&sse_message) { if let Some(data_json) = captures.get(1) { let answer: Value = serde_json::from_str(data_json.as_str())?; @@ -261,7 +248,9 @@ impl Gemini { .unwrap_or("\n"); if msg != "null" { - sender.send(Event::LLMEvent(LLMAnswer::Answer(msg.to_string())))?; + sender.send(Event::LLMEvent(LLMAnswer::Answer( + msg.to_string(), + )))?; } sleep(Duration::from_millis(10)).await; @@ -271,7 +260,6 @@ impl Gemini { // Send [DONE] message in SSE format let sse_done = "data: [DONE]\n\n"; - let re = Regex::new(r"data:\s(.*)")?; for captures in re.captures_iter(sse_done) { if let Some(data_json) = captures.get(1) { if data_json.as_str() == "[DONE]" { @@ -282,7 +270,7 @@ impl Gemini { } else { // Handle parsing error sender.send(Event::LLMEvent(LLMAnswer::Answer( - "Error: Unable to parse Gemini response".to_string() + "Error: Unable to parse Gemini response".to_string(), )))?; sender.send(Event::LLMEvent(LLMAnswer::EndAnswer))?; } @@ -328,15 +316,13 @@ impl Gemini { _ => "user", }; - // If role changes, add previous content - if !current_role.is_empty() && current_role != gemini_role { - if !current_parts.is_empty() { - contents.push(json!({ + if !current_role.is_empty() && current_role != gemini_role && !current_parts.is_empty() + { + contents.push(json!({ "role": current_role, "parts": current_parts - })); - current_parts = Vec::new(); - } + })); + current_parts = Vec::new(); } current_role = gemini_role; @@ -353,5 +339,4 @@ impl Gemini { contents } - } diff --git a/src/llm.rs b/src/llm.rs index 2e2ca13..a0ac26e 100644 --- a/src/llm.rs +++ b/src/llm.rs @@ -1,9 +1,9 @@ use crate::chatgpt::ChatGPT; use crate::config::Config; use crate::event::Event; +use crate::gemini::Gemini; use crate::llamacpp::LLamacpp; use crate::ollama::Ollama; -use crate::gemini::Gemini; use async_trait::async_trait; use serde::Deserialize; use std::sync::atomic::AtomicBool; diff --git a/tenere b/tenere new file mode 100755 index 0000000000000000000000000000000000000000..c585eec233b54bbc17b3eaaf60cdba98accb1314 GIT binary patch literal 8689384 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
r5@;u&^uiyiD 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 z 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