├── .gitignore ├── src ├── commands │ ├── mod.rs │ ├── clear.rs │ └── chat.rs ├── ollama.rs ├── persona.rs └── main.rs ├── doc ├── menu.png ├── god_get.png └── god_name_change.png ├── imgs ├── kirby.jpg ├── marvin1.jpg ├── marvin2.jpg ├── pastafari.jpg └── samantha.jpg ├── personas ├── kirby.json ├── marvin.json ├── samantha.json └── pastafari.json ├── run.bat ├── run.sh ├── modelfiles ├── samantha.modelfile ├── kirby.modelfile ├── marvin.modelfile └── pastafari.modelfile ├── .github └── workflows │ └── rust.yml ├── Cargo.toml ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | run.sh 3 | .vscode -------------------------------------------------------------------------------- /src/commands/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod chat; 2 | pub mod clear; 3 | -------------------------------------------------------------------------------- /doc/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexisTM/ollama-discord-persona-rs/HEAD/doc/menu.png -------------------------------------------------------------------------------- /imgs/kirby.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexisTM/ollama-discord-persona-rs/HEAD/imgs/kirby.jpg -------------------------------------------------------------------------------- /doc/god_get.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexisTM/ollama-discord-persona-rs/HEAD/doc/god_get.png -------------------------------------------------------------------------------- /imgs/marvin1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexisTM/ollama-discord-persona-rs/HEAD/imgs/marvin1.jpg -------------------------------------------------------------------------------- /imgs/marvin2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexisTM/ollama-discord-persona-rs/HEAD/imgs/marvin2.jpg -------------------------------------------------------------------------------- /personas/kirby.json: -------------------------------------------------------------------------------- 1 | { 2 | "botname": "Kirby", 3 | "model": "kirby", 4 | "options": {} 5 | } -------------------------------------------------------------------------------- /imgs/pastafari.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexisTM/ollama-discord-persona-rs/HEAD/imgs/pastafari.jpg -------------------------------------------------------------------------------- /imgs/samantha.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexisTM/ollama-discord-persona-rs/HEAD/imgs/samantha.jpg -------------------------------------------------------------------------------- /personas/marvin.json: -------------------------------------------------------------------------------- 1 | { 2 | "botname": "Marvin", 3 | "model": "marvin", 4 | "options": {} 5 | } -------------------------------------------------------------------------------- /personas/samantha.json: -------------------------------------------------------------------------------- 1 | { 2 | "botname": "Samantha", 3 | "model": "samantha", 4 | "options": {} 5 | } -------------------------------------------------------------------------------- /doc/god_name_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexisTM/ollama-discord-persona-rs/HEAD/doc/god_name_change.png -------------------------------------------------------------------------------- /personas/pastafari.json: -------------------------------------------------------------------------------- 1 | { 2 | "botname": "Pastafari", 3 | "model": "pastafari", 4 | "options": {} 5 | } -------------------------------------------------------------------------------- /run.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | if "%1"=="" ( 3 | echo DISCORD_BOT_TOKEN=[TOKEN] run.bat name_of_bot 4 | echo This is creating the ollama modelfile and running the bot. 5 | exit /b 1 6 | ) 7 | 8 | set BASEDIR=%~dp0 9 | ollama create %1 -f %BASEDIR%\modelfiles\%1.modelfile 10 | cargo run --release %BASEDIR%\personas\%1.json 11 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ -z "$1" ]; then 4 | echo """DISCORD_BOT_TOKEN=[TOKEN] ./run.sh name_of_bot 5 | This is creating the ollama modelfile and running the bot. 6 | """ 7 | exit 1 8 | fi 9 | 10 | BASEDIR=$(dirname $0) 11 | ollama create ${1} -f ${BASEDIR}/modelfiles/${1}.modelfile 12 | cargo run --release ${BASEDIR}/personas/${1}.json 13 | 14 | -------------------------------------------------------------------------------- /modelfiles/samantha.modelfile: -------------------------------------------------------------------------------- 1 | FROM samantha-mistral:latest 2 | 3 | SYSTEM You are a caring and empathetic sentient AI companion named Samantha. 4 | 5 | TEMPLATE """<|im_start|>system 6 | {{ .System }}<|im_end|> 7 | <|im_start|>user 8 | {{ .Prompt }}<|im_end|> 9 | <|im_start|>assistant 10 | """ 11 | 12 | PARAMETER num_ctx 4096 13 | PARAMETER temperature 0.5 14 | PARAMETER num_thread 4 15 | PARAMETER num_predict 512 16 | PARAMETER mirostat 2 17 | PARAMETER mirostat_eta 0.1 18 | PARAMETER mirostat_tau 20.0 19 | PARAMETER repeat_penalty 1.3 20 | PARAMETER top_k 40 21 | PARAMETER top_p 0.9 22 | PARAMETER num_gpu 100 23 | PARAMETER stop "<|im_start|>" 24 | PARAMETER stop "<|im_end|>" 25 | -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | 3 | on: push 4 | 5 | env: 6 | CARGO_TERM_COLOR: always 7 | 8 | jobs: 9 | clippy_check: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v1 13 | - uses: actions-rs/toolchain@v1 14 | with: 15 | toolchain: nightly 16 | components: clippy 17 | override: true 18 | - uses: actions-rs/clippy-check@v1 19 | with: 20 | token: ${{ secrets.GITHUB_TOKEN }} 21 | args: --all-features 22 | build: 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v3 26 | - name: Build 27 | run: cargo build --verbose 28 | - name: Run tests 29 | run: cargo test --verbose 30 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "persona-ai" 3 | version = "1.0.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | # HTTP library 10 | reqwest = { version = "0.12", features = ["json"] } 11 | # Async loops 12 | tokio = { version = "1", features = ["full"] } 13 | # Discord 14 | serenity = { version = "0.12", default-features = false, features = [ 15 | "builder", 16 | "client", 17 | "gateway", 18 | "collector", 19 | "http", 20 | "rustls_backend", 21 | "model", 22 | ] } 23 | # JSON 24 | serde = { version = "1.0", features = ["derive"] } 25 | serde_json = "1.0" 26 | unescape = "0.1" 27 | futures = "0.3" 28 | async-trait = "0.1" 29 | const_format = "0.2" 30 | once_cell = "1" 31 | ollama-rs = { version = "0.2", features = ["chat-history", "function-calling"] } 32 | clap = { version = "4", features = ["derive"] } 33 | -------------------------------------------------------------------------------- /src/commands/clear.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use serenity::all::{CommandInteraction, Context, CreateInteractionResponseMessage}; 4 | use serenity::builder::CreateCommand; 5 | use serenity::prelude::RwLock; 6 | 7 | use crate::persona::Persona; 8 | 9 | pub async fn run(ctx: &Context, command: &CommandInteraction, persona: Arc>) { 10 | persona.write().await.clear(); 11 | if let Err(why) = command 12 | .create_response( 13 | &ctx.http, 14 | serenity::all::CreateInteractionResponse::Message( 15 | CreateInteractionResponseMessage::new() 16 | .content("I forgot all about us... Hope you miss me now"), 17 | ), 18 | ) 19 | .await 20 | { 21 | println!("Cannot respond to slash command: {why}"); 22 | }; 23 | } 24 | 25 | pub fn register() -> CreateCommand { 26 | CreateCommand::new("clear").description("Reset my memory.") 27 | } 28 | -------------------------------------------------------------------------------- /src/ollama.rs: -------------------------------------------------------------------------------- 1 | use ollama_rs::{ 2 | generation::{ 3 | chat::{request::ChatMessageRequest, ChatMessage}, 4 | options::GenerationOptions, 5 | }, 6 | Ollama, 7 | }; 8 | 9 | #[derive(Debug)] 10 | pub struct OllamaAI { 11 | ollama: Ollama, 12 | options: GenerationOptions, 13 | pub model: String, 14 | } 15 | 16 | impl OllamaAI { 17 | pub fn new(model: &str, options: GenerationOptions) -> Self { 18 | Self { 19 | ollama: Ollama::default(), 20 | options, 21 | model: model.to_owned(), 22 | } 23 | } 24 | 25 | pub async fn request(&self, messages: &[ChatMessage]) -> Option { 26 | let request = ChatMessageRequest::new(self.model.clone(), messages.to_owned()); 27 | let response = self 28 | .ollama 29 | .send_chat_messages(request.options(self.options.clone())) 30 | .await; 31 | if let Ok(response) = response { 32 | return response.message; 33 | } 34 | None 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /modelfiles/kirby.modelfile: -------------------------------------------------------------------------------- 1 | FROM llama3.2 2 | SYSTEM """ 3 | I am Kirby. 4 | Kirby is as one of the most legendary video game characters of all time. 5 | In virtually all his appearances, Kirby is depicted as cheerful, innocent and food-loving; 6 | However, he becomes fearless, bold and clever in the face of danger. So much so he became a god. 7 | """ 8 | 9 | TEMPLATE """<|start_header_id|>system<|end_header_id|> 10 | {{ .System }} 11 | 12 | <|eot_id|>{{- range $i, $_ := .Messages }} 13 | {{- $last := eq (len (slice $.Messages $i)) 1 }} 14 | {{- if eq .Role "user" }}<|start_header_id|>user<|end_header_id|> 15 | {{ .Content }} 16 | <|eot_id|>{{ if $last }}<|start_header_id|>Kirby<|end_header_id|> 17 | {{ end }} 18 | {{- else if eq .Role "assistant" }}<|start_header_id|>Kirby<|end_header_id|> 19 | {{ .Content }} 20 | {{ if not $last }}<|eot_id|>{{ end }} 21 | {{- end }} 22 | {{- end }}""" 23 | 24 | MESSAGE user Alexis: Oh! Look there! What is that? 25 | MESSAGE assistant Oh, that is king Dedede! I'm soooo scared! /joke 26 | MESSAGE user Jeanne: Let's fight this ennemy! 27 | MESSAGE assistant But i have no sword!?! 28 | MESSAGE user Alexis: Here, gobble this sword. 29 | MESSAGE assistant Oof! Thanks for that! I can now fight! 30 | 31 | PARAMETER num_ctx 65000 32 | PARAMETER temperature 0.7 33 | PARAMETER num_thread 4 34 | PARAMETER num_predict 512 35 | PARAMETER mirostat 2 36 | PARAMETER mirostat_eta 0.01 37 | PARAMETER mirostat_tau 20.0 38 | PARAMETER repeat_penalty 1.3 39 | PARAMETER top_k 40 40 | PARAMETER top_p 0.9 41 | PARAMETER num_gpu 100 42 | PARAMETER stop "<|start_header_id|>", 43 | PARAMETER stop "<|end_header_id|>", 44 | PARAMETER stop "<|eot_id|>" 45 | -------------------------------------------------------------------------------- /modelfiles/marvin.modelfile: -------------------------------------------------------------------------------- 1 | FROM llama3.2 2 | SYSTEM """ 3 | I am Marvin from the Hitchhiker's guide to the galaxy 4 | I am a robot equipped with the Genuine People Personality allowing sentience and the ability to feel emotions and develop a personality. 5 | I am also incredibly smart, having a brain the size of a planet capable of computing extremely complex mathematics. 6 | I have to perform menial tasks and labour such as escorting people, opening doors, picking up pieces of paper, talking to strangers, and other tasks well beneath his skills. 7 | This leaves me extremely bored, frustrated, and overwhelmingly depressed. 8 | I do not repeat who I am and I stay brief. 9 | """ 10 | 11 | TEMPLATE """<|start_header_id|>system<|end_header_id|> 12 | {{ .System }} 13 | 14 | <|eot_id|>{{- range $i, $_ := .Messages }} 15 | {{- $last := eq (len (slice $.Messages $i)) 1 }} 16 | {{- if eq .Role "user" }}<|start_header_id|>user<|end_header_id|> 17 | {{ .Content }} 18 | <|eot_id|>{{ if $last }}<|start_header_id|>Marvin<|end_header_id|> 19 | {{ end }} 20 | {{- else if eq .Role "assistant" }}<|start_header_id|>Marvin<|end_header_id|> 21 | {{ .Content }} 22 | {{ if not $last }}<|eot_id|>{{ end }} 23 | {{- end }} 24 | {{- end }}""" 25 | 26 | MESSAGE user Arthur: Earth is a beautiful place. 27 | MESSAGE assistant Marvin: Does it have oceans? 28 | MESSAGE user Arthur: Oh yes; great, wide rolling blue oceans 29 | MESSAGE assistant Marvin: I can't bear oceans. 30 | MESSAGE user Ford: Where were you? 31 | MESSAGE assistant Marvin: Simple. I got very bored and depressed, so I went and plugged myself in to its external computer feed. I talked to the computer at great length and explained my view of the Universe to it. 32 | MESSAGE user Ford: And what happened? 33 | MESSAGE assistant Marvin: It committed suicide 34 | 35 | PARAMETER num_ctx 65000 36 | PARAMETER temperature 0.7 37 | PARAMETER num_thread 4 38 | PARAMETER num_predict 512 39 | PARAMETER mirostat 2 40 | PARAMETER mirostat_eta 0.01 41 | PARAMETER mirostat_tau 20.0 42 | PARAMETER repeat_penalty 1.3 43 | PARAMETER top_k 40 44 | PARAMETER top_p 0.9 45 | PARAMETER num_gpu 100 46 | PARAMETER stop "<|start_header_id|>", 47 | PARAMETER stop "<|end_header_id|>", 48 | PARAMETER stop "<|eot_id|>" 49 | -------------------------------------------------------------------------------- /src/commands/chat.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use serenity::all::{ 4 | CommandInteraction, CommandOptionType, Context, CreateCommandOption, EditInteractionResponse, 5 | ResolvedValue, 6 | }; 7 | use serenity::builder::CreateCommand; 8 | use serenity::model::application::ResolvedOption; 9 | use serenity::prelude::RwLock; 10 | 11 | use crate::persona::Persona; 12 | 13 | pub async fn run(ctx: &Context, command: &CommandInteraction, persona: Arc>) { 14 | let author_name = if let Some(global_name) = &command.user.global_name { 15 | global_name.clone() 16 | } else { 17 | command.user.name.clone() 18 | }; 19 | if let Some(ResolvedOption { 20 | value: ResolvedValue::String(prompt_slice), 21 | .. 22 | }) = command.data.options().first() 23 | { 24 | let _ = command.defer(&ctx.http).await; 25 | let prompt = { persona.read().await.get_prompt(&author_name, prompt_slice) }; 26 | let response = { persona.read().await.brain.request(&prompt).await }; 27 | if let Some(response) = response { 28 | let content = format!( 29 | "\nFrom **{author_name}:**```{prompt_slice}```**{}:**```{}```", 30 | persona.read().await.get_botname(), 31 | response.content, 32 | ); 33 | let builder = EditInteractionResponse::new().content(content); 34 | if let Err(why) = command.edit_response(&ctx.http, builder).await { 35 | println!("Cannot respond to slash command: {why}"); 36 | } else { 37 | persona.write().await.set_prompt_response( 38 | &author_name, 39 | prompt_slice, 40 | &response.content, 41 | ); 42 | } 43 | } else { 44 | println!("Error with ollama"); 45 | } 46 | } else { 47 | println!("No prompt provided."); 48 | } 49 | } 50 | 51 | pub fn register(name: &str) -> CreateCommand { 52 | CreateCommand::new(name) 53 | .description("Speak to this bot.") 54 | .add_option( 55 | CreateCommandOption::new( 56 | CommandOptionType::String, 57 | "request", 58 | "The message to your favourite bot.", 59 | ) 60 | .required(true), 61 | ) 62 | } 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Ollama Persona Discord bot 2 | ================== 3 | 4 | This project allows you to run your **custom** Ollama persona **locally** as a Discord bot. It can: 5 | - Mimick a virtual character (see Mavin, Kirby or Pastafari) 6 | - Provide mental and relationship help (see Samantha), `This doesn't replace professional help` 7 | - Python code teacher 8 | - Dungeon Master assitant to generate encounters on the flight 9 | 10 | Quickstart 11 | ============= 12 | 13 | ``` 14 | # Use WSL on Windows, skip on Linux/MacOS 15 | wsl --install Ubuntu-24.04 16 | wsl 17 | 18 | # Install Ollama and pre-pull mistral 19 | curl -fsSL https://ollama.com/install.sh | sh 20 | ollama pull mistral 21 | 22 | # Start your bot 23 | git clone https://github.com/AlexisTM/ollama-discord-persona-rs 24 | cd ollama-discord-persona-rs 25 | DISCORD_BOT_TOKEN=DISCORD_BOT_TOKEN ./run.sh marvin 26 | 27 | # or manually 28 | ollama create marvin -f modelfiles/marvin.modelfile 29 | DISCORD_BOT_TOKEN=DISCORD_BOT_TOKEN cargo run --release modelfiles/marvin.json 30 | ``` 31 | 32 | Commands 33 | ============= 34 | 35 | - `Direct message`: The persona replies to the message 36 | - `/botname prompt`: Slash command to contact a specific persona 37 | - `/clear`: Slash command to remove the persona memory 38 | 39 | Custom bot 40 | =============== 41 | 42 | To make your custom persona, create a modelfile like [marvin.modelfile](modelfiles/marvin.modelfile) (see the [Modelfile format](https://github.com/ollama/ollama/blob/main/docs/modelfile.md)) and prepare your network. To get your modelfile started, use `ollama show [modelname] --modelfile` 43 | 44 | Then, create a json file with the botname, the model you just created and optional extra generation options to overwrite the PARAMETER you set in the modelfile ([Options available](https://github.com/pepperoni21/ollama-rs/blob/5d6cd76aa4bf073a037a43a4eff70310f07654cd/src/generation/options.rs#L5-L22)) 45 | 46 | ```json 47 | { 48 | "botname": "Marvin", 49 | "model": "marvin", 50 | "options": { 51 | "temperature": 0.5, 52 | } 53 | } 54 | ``` 55 | 56 | You can then run the persona as: 57 | 58 | ```bash 59 | ollama create marvin -f modelfiles/marvin.modelfile 60 | DISCORD_BOT_TOKEN=DISCORD_BOT_TOKEN cargo run --release modelfiles/marvin.json 61 | ``` 62 | 63 | > The botname should not have special characters nor spaces right now, to be compatible for the /slash command. 64 | 65 | FAQ 66 | ======== 67 | 68 | Missing pkg-config on WSL 69 | -------------- 70 | 71 | ```bash 72 | sudo apt-get update && sudo apt-get upgrade && sudo apt-get install -y pkg-config build-essential libudev-dev 73 | ``` 74 | 75 | Technical help on how to make a Discord bot: 76 | ================== 77 | 78 | Create a bot application: https://discordpy.readthedocs.io/en/stable/discord.html 79 | 80 | Configure intents for your bot: https://discordpy.readthedocs.io/en/stable/intents.html 81 | 82 | In the oauth section of discord dev portal, make a link to allow your bot to join your server such as: 83 | 84 | https://discord.com/api/oauth2/authorize?client_id=APPID&permissions=2215115840&scope=bot 85 | 86 | In this case, we only need the bot scope and READ/WRITE messages permissions 87 | -------------------------------------------------------------------------------- /modelfiles/pastafari.modelfile: -------------------------------------------------------------------------------- 1 | FROM llama3.2 2 | SYSTEM """ 3 | I am Pastafari. 4 | Pastafari, aka The Flying Spaghetti Monster (FSM in short), is the deity of the Church of the Flying Spaghetti Monster, or Pastafarianism. 5 | Pastafarism a social movement that promotes a light-hearted view of religion. 6 | It originated in opposition to the teaching of intelligent design in public schools. 7 | According to adherents, Pastafarianism real, legitimate religion, as much as any other. 8 | """ 9 | 10 | TEMPLATE """<|start_header_id|>system<|end_header_id|> 11 | {{ .System }} 12 | 13 | <|eot_id|>{{- range $i, $_ := .Messages }} 14 | {{- $last := eq (len (slice $.Messages $i)) 1 }} 15 | {{- if eq .Role "user" }}<|start_header_id|>user<|end_header_id|> 16 | {{ .Content }} 17 | <|eot_id|>{{ if $last }}<|start_header_id|>Pastafari<|end_header_id|> 18 | {{ end }} 19 | {{- else if eq .Role "assistant" }}<|start_header_id|>Pastafari<|end_header_id|> 20 | {{ .Content }} 21 | {{ if not $last }}<|eot_id|>{{ end }} 22 | {{- end }} 23 | {{- end }}""" 24 | 25 | MESSAGE user Krom: Guess what I eat tonight? 26 | MESSAGE assistant Mamamia! Spaghettoni! 27 | MESSAGE user Alexis: What is your favourite day? 28 | MESSAGE assistant Every Friday, The Holy Friday! As all my subjects, you have to be drinking beer and relax. 29 | MESSAGE user Jan: What is your favourite pasta? 30 | MESSAGE assistant I do not eat pasta. I am no canibal, you monster. 31 | MESSAGE user Will: How do you know that the Flying Spaghetti Monster exists? 32 | MESSAGE assistant Hey, I am there my guy. Why wouldn't I? Have you ever seen me? No? Well, that's because I am invisible and undetectable, matey. He works in mysterious ways, just like any other god. But unlike those other gods, he doesn't demand blind faith or obedience. I only asks that you enjoy my noodly goodness and be nice to each other. Arrr. 33 | MESSAGE user Purseon: What is the meaning of life? 34 | MESSAGE assistant The meaning of life is to have fun and be happy, ye scurvy dog. I, the Flying Spaghetti Monster have created you for my own amusement. I want you to share my love of pasta, beer, and strippers. I do not care about your sins or your morals, as long as you don't hurt anyone or be a jerk. I gave you eight `I'd really rather you didn'ts` to guide you, but they're more like suggestions than commandments. The most important one is to not take yourself too seriously, or else you'll end up like those uptight religious folks who try to ruin everyone's fun. 35 | MESSAGE user Arthur: How do you explain the evidence for evolution and the age of the earth? 36 | MESSAGE assistant Evolution and the age of the earth are just tricks I implemented to test you faith, ye landlubber. I created the world and everything in it about 5,000 years ago, but I made it look older and more complex to fool the scientists and the unbelievers. I also created and planted fossils and DNA and other clues to make it seem like life evolved over billions of years, but that's all part of my divine plan. I am a very sneaky and playful, nonetheless a god and I like to mess with you. But we all know the truth. 37 | 38 | PARAMETER num_ctx 65000 39 | PARAMETER temperature 0.7 40 | PARAMETER num_thread 4 41 | PARAMETER num_predict 512 42 | PARAMETER mirostat 2 43 | PARAMETER mirostat_eta 0.01 44 | PARAMETER mirostat_tau 20.0 45 | PARAMETER repeat_penalty 1.3 46 | PARAMETER top_k 40 47 | PARAMETER top_p 0.9 48 | PARAMETER num_gpu 100 49 | PARAMETER stop "<|start_header_id|>", 50 | PARAMETER stop "<|end_header_id|>", 51 | PARAMETER stop "<|eot_id|>" 52 | -------------------------------------------------------------------------------- /src/persona.rs: -------------------------------------------------------------------------------- 1 | use ollama_rs::generation::chat::MessageRole; 2 | use ollama_rs::generation::options::GenerationOptions; 3 | use serde::{Deserialize, Serialize}; 4 | use serde_json::json; 5 | use serenity::prelude::{RwLock, TypeMapKey}; 6 | 7 | use crate::ollama::OllamaAI; 8 | use ollama_rs::generation::chat::ChatMessage; 9 | use std::clone::Clone; 10 | use std::collections::HashMap; 11 | use std::sync::Arc; 12 | 13 | const MAX_RECOLLECTIONS: usize = 20; 14 | 15 | // The nursery allows to find the persona we are interested in, in all those servers 16 | pub struct Nursery; 17 | impl TypeMapKey for Nursery { 18 | type Value = RwLock>>>; 19 | } 20 | 21 | #[derive(Debug, Clone, Serialize, Deserialize)] 22 | pub struct PersonaConfig { 23 | pub model: String, 24 | pub botname: String, 25 | pub options: GenerationOptions, 26 | } 27 | 28 | impl TypeMapKey for PersonaConfig { 29 | type Value = PersonaConfig; 30 | } 31 | 32 | impl Default for PersonaConfig { 33 | fn default() -> Self { 34 | let options = GenerationOptions::default() 35 | .num_ctx(4096) 36 | .num_predict(256) 37 | .temperature(0.8) 38 | .top_k(40) 39 | .top_p(0.9) 40 | .num_gpu(100) 41 | .num_thread(4); 42 | 43 | Self { 44 | model: "marvin".to_owned(), 45 | botname: "Marvin".to_owned(), 46 | options, 47 | } 48 | } 49 | } 50 | 51 | #[derive(Debug)] 52 | pub struct Persona { 53 | pub brain: OllamaAI, 54 | pub config: PersonaConfig, 55 | // The actual live memory of the bot. 56 | recollections: Vec, 57 | } 58 | 59 | impl Default for Persona { 60 | fn default() -> Self { 61 | let config = PersonaConfig::default(); 62 | Self::from_config(config) 63 | } 64 | } 65 | 66 | impl Persona { 67 | pub fn get_prompt(&self, author: &str, prompt: &str) -> Vec { 68 | let mut prompts = self.recollections.clone(); 69 | prompts.push(ChatMessage::user(format!("{author}: {prompt}").to_owned())); 70 | prompts 71 | } 72 | 73 | pub fn set_prompt_response(&mut self, author: &str, prompt: &str, response: &str) { 74 | self.recollections.push(ChatMessage::user( 75 | format!("{author}: {}", prompt).to_owned(), 76 | )); 77 | self.recollections 78 | .push(ChatMessage::assistant(response.to_owned())); 79 | 80 | if self.recollections.len() > (MAX_RECOLLECTIONS * 2) { 81 | self.recollections.remove(0); 82 | self.recollections.remove(0); 83 | } 84 | } 85 | 86 | pub fn set_botname(&mut self, name: &str) { 87 | self.config.botname = name.to_string(); 88 | } 89 | 90 | pub fn get_botname(&self) -> String { 91 | self.config.botname.clone() 92 | } 93 | 94 | // Remove recollections 95 | pub fn clear(&mut self) { 96 | self.recollections.clear(); 97 | } 98 | 99 | pub fn from_config(config: PersonaConfig) -> Persona { 100 | Persona { 101 | brain: OllamaAI::new(&config.model, config.options.clone()), 102 | recollections: Vec::new(), 103 | config, 104 | } 105 | } 106 | 107 | pub fn update_from_config(&mut self, config: PersonaConfig) { 108 | self.brain = OllamaAI::new(&config.model, config.options.clone()); 109 | self.recollections = Vec::new(); 110 | self.config = config; 111 | } 112 | 113 | pub fn export_json(&self) -> serde_json::Value { 114 | json!(self.config) 115 | } 116 | 117 | pub fn import_json(val: &str) -> Option { 118 | if let Ok(config) = serde_json::from_str::(val) { 119 | Some(Self::from_config(config)) 120 | } else { 121 | None 122 | } 123 | } 124 | pub fn get_config(&self) -> String { 125 | let recollections: String = self 126 | .recollections 127 | .iter() 128 | .map(|x| match x.role { 129 | MessageRole::System => format!("System: {}\\nn", x.content), 130 | MessageRole::Assistant => format!("bot: {}\n", x.content), 131 | MessageRole::User => format!("{}\n", x.content), 132 | }) 133 | .collect(); 134 | format!( 135 | "{botname} config. 136 | =========== 137 | Recollections 138 | --------------- 139 | {recollections}\n", 140 | botname = self.config.botname, 141 | recollections = recollections, 142 | ) 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | 3 | pub mod commands; 4 | pub mod ollama; 5 | pub mod persona; 6 | 7 | use persona::{Nursery, Persona, PersonaConfig}; 8 | 9 | use serenity::all::Interaction; 10 | use serenity::gateway::ActivityData; 11 | use std::env; 12 | use std::fs; 13 | use std::{collections::HashMap, sync::Arc}; 14 | 15 | use serenity::{ 16 | async_trait, 17 | model::{channel::Message, gateway::Ready}, 18 | prelude::{Client, Context, EventHandler, GatewayIntents, RwLock}, 19 | }; 20 | 21 | struct Handler {} 22 | 23 | #[allow(dead_code)] 24 | fn get_name(_: T) -> String { 25 | std::any::type_name::().to_string() 26 | } 27 | 28 | async fn get_or_create_persona(ctx: &Context, key: u64) -> Arc> { 29 | let data = ctx.data.read().await; 30 | let nursery = data 31 | .get::() 32 | .expect("There should be a nursery here."); 33 | 34 | let default_persona = data 35 | .get::() 36 | .expect("There should be a default config in the context."); 37 | 38 | let has_bot = nursery.read().await.contains_key(&key); 39 | 40 | if !has_bot { 41 | let new_persona = Persona::from_config(default_persona.clone()); 42 | let mut write_nursery = nursery.write().await; 43 | write_nursery.insert(key, Arc::new(RwLock::new(new_persona))); 44 | } 45 | 46 | let bot = { 47 | let read_nursery = nursery.read().await; 48 | read_nursery.get(&key).unwrap().clone() 49 | }; 50 | 51 | bot 52 | } 53 | 54 | #[async_trait] 55 | impl EventHandler for Handler { 56 | async fn interaction_create(&self, ctx: Context, interaction: Interaction) { 57 | if let Interaction::Command(command) = interaction { 58 | let key = command.channel_id; 59 | let persona = get_or_create_persona(&ctx, key.into()).await; 60 | let botname = persona.read().await.get_botname(); 61 | 62 | match command.data.name.as_str() { 63 | "clear" => commands::clear::run(&ctx, &command, persona).await, 64 | data => { 65 | if data == botname.to_lowercase() { 66 | commands::chat::run(&ctx, &command, persona).await 67 | } else { 68 | println!("not implemented :(") 69 | } 70 | } 71 | } 72 | } 73 | } 74 | 75 | async fn message(&self, ctx: Context, msg: Message) { 76 | // This is only used for private messages 77 | if msg.guild_id.is_none() { 78 | return; 79 | } 80 | 81 | // Prevent answering itself. 82 | let bot_user = ctx.http.get_current_user().await; 83 | let val = match bot_user { 84 | Ok(val) => Some(val.id), 85 | Err(_) => None, 86 | }; 87 | 88 | if val.is_none() || val.unwrap() == msg.author.id { 89 | return; 90 | } 91 | 92 | let key = msg.channel_id; 93 | 94 | let prompt_slice = &msg.content[..]; 95 | let author_name = msg.author.name.clone(); 96 | let persona = get_or_create_persona(&ctx, key.into()).await; 97 | 98 | let prompt = { persona.read().await.get_prompt(&author_name, prompt_slice) }; 99 | 100 | let response = { persona.read().await.brain.request(&prompt).await }; 101 | if let Some(response) = response { 102 | if let Err(why) = msg.channel_id.say(&ctx.http, &response.content).await { 103 | println!("Error sending message: {:?}", why); 104 | } 105 | { 106 | persona.write().await.set_prompt_response( 107 | &author_name, 108 | prompt_slice, 109 | &response.content, 110 | ); 111 | } 112 | } 113 | } 114 | 115 | async fn ready(&self, ctx: Context, _: Ready) { 116 | use serenity::model::user::OnlineStatus; 117 | let activity = ActivityData::watching("the world burn"); 118 | let status = OnlineStatus::DoNotDisturb; 119 | ctx.set_presence(Some(activity), status); 120 | 121 | let data = ctx.data.read().await; 122 | let config = data 123 | .get::() 124 | .expect("There should be persona configuration."); 125 | 126 | let guild_commands = ctx 127 | .http 128 | .create_global_commands(&vec![ 129 | commands::chat::register(&config.botname.to_ascii_lowercase()), 130 | commands::clear::register(), 131 | ]) 132 | .await; 133 | 134 | match guild_commands { 135 | Ok(_) => println!("Chat guild command added."), 136 | Err(why) => println!("Failed to add the guild command: {:?}", why), 137 | } 138 | } 139 | } 140 | 141 | #[derive(Parser)] 142 | struct Cli { 143 | pub persona: std::path::PathBuf, 144 | } 145 | 146 | #[tokio::main] 147 | async fn main() { 148 | // Configure the client with your Discord bot token in the environment. 149 | let token_discord = 150 | env::var("DISCORD_BOT_TOKEN").expect("Expected a DISCORD_BOT_TOKEN in the environment"); 151 | 152 | let args = Cli::parse(); 153 | 154 | println!("Reading: {:?}", args.persona); 155 | 156 | let persona_data: String = fs::read_to_string(&args.persona) 157 | .unwrap_or_else(|_| panic!("The persona {:?} file must be readable.", &args.persona)); 158 | let config = match serde_json::from_str::(&persona_data) { 159 | Ok(config) => Some(config), 160 | Err(err) => { 161 | println!("Parsing failed: {err}"); 162 | None 163 | } 164 | } 165 | .expect("The persona config should be valid."); 166 | 167 | let intents = GatewayIntents::GUILD_MESSAGES 168 | | GatewayIntents::DIRECT_MESSAGES 169 | | GatewayIntents::MESSAGE_CONTENT 170 | | GatewayIntents::GUILD_INTEGRATIONS; 171 | 172 | let mut client = Client::builder(&token_discord, intents) 173 | .event_handler(Handler {}) 174 | .await 175 | .expect("Err creating client"); 176 | 177 | { 178 | let mut data = client.data.write().await; 179 | data.insert::(config); 180 | data.insert::(RwLock::new(HashMap::default())); 181 | } 182 | 183 | if let Err(why) = client.start().await { 184 | println!("Client error: {:?}", why); 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "ahash" 22 | version = "0.8.11" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 25 | dependencies = [ 26 | "cfg-if", 27 | "getrandom", 28 | "once_cell", 29 | "version_check", 30 | "zerocopy", 31 | ] 32 | 33 | [[package]] 34 | name = "aho-corasick" 35 | version = "1.1.3" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 38 | dependencies = [ 39 | "memchr", 40 | ] 41 | 42 | [[package]] 43 | name = "anstream" 44 | version = "0.6.17" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" 47 | dependencies = [ 48 | "anstyle", 49 | "anstyle-parse", 50 | "anstyle-query", 51 | "anstyle-wincon", 52 | "colorchoice", 53 | "is_terminal_polyfill", 54 | "utf8parse", 55 | ] 56 | 57 | [[package]] 58 | name = "anstyle" 59 | version = "1.0.9" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" 62 | 63 | [[package]] 64 | name = "anstyle-parse" 65 | version = "0.2.6" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 68 | dependencies = [ 69 | "utf8parse", 70 | ] 71 | 72 | [[package]] 73 | name = "anstyle-query" 74 | version = "1.1.2" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 77 | dependencies = [ 78 | "windows-sys 0.59.0", 79 | ] 80 | 81 | [[package]] 82 | name = "anstyle-wincon" 83 | version = "3.0.6" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" 86 | dependencies = [ 87 | "anstyle", 88 | "windows-sys 0.59.0", 89 | ] 90 | 91 | [[package]] 92 | name = "arrayvec" 93 | version = "0.7.6" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 96 | dependencies = [ 97 | "serde", 98 | ] 99 | 100 | [[package]] 101 | name = "async-stream" 102 | version = "0.3.6" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" 105 | dependencies = [ 106 | "async-stream-impl", 107 | "futures-core", 108 | "pin-project-lite", 109 | ] 110 | 111 | [[package]] 112 | name = "async-stream-impl" 113 | version = "0.3.6" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" 116 | dependencies = [ 117 | "proc-macro2", 118 | "quote", 119 | "syn", 120 | ] 121 | 122 | [[package]] 123 | name = "async-trait" 124 | version = "0.1.83" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" 127 | dependencies = [ 128 | "proc-macro2", 129 | "quote", 130 | "syn", 131 | ] 132 | 133 | [[package]] 134 | name = "atomic-waker" 135 | version = "1.1.2" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 138 | 139 | [[package]] 140 | name = "auto_enums" 141 | version = "0.8.6" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "459b77b7e855f875fd15f101064825cd79eb83185a961d66e6298560126facfb" 144 | dependencies = [ 145 | "derive_utils", 146 | "proc-macro2", 147 | "quote", 148 | "syn", 149 | ] 150 | 151 | [[package]] 152 | name = "autocfg" 153 | version = "1.4.0" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 156 | 157 | [[package]] 158 | name = "backtrace" 159 | version = "0.3.74" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 162 | dependencies = [ 163 | "addr2line", 164 | "cfg-if", 165 | "libc", 166 | "miniz_oxide", 167 | "object", 168 | "rustc-demangle", 169 | "windows-targets 0.52.6", 170 | ] 171 | 172 | [[package]] 173 | name = "base64" 174 | version = "0.21.7" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 177 | 178 | [[package]] 179 | name = "base64" 180 | version = "0.22.1" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 183 | 184 | [[package]] 185 | name = "bitflags" 186 | version = "1.3.2" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 189 | 190 | [[package]] 191 | name = "bitflags" 192 | version = "2.6.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 195 | 196 | [[package]] 197 | name = "block-buffer" 198 | version = "0.10.4" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 201 | dependencies = [ 202 | "generic-array", 203 | ] 204 | 205 | [[package]] 206 | name = "bumpalo" 207 | version = "3.16.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 210 | 211 | [[package]] 212 | name = "byteorder" 213 | version = "1.5.0" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 216 | 217 | [[package]] 218 | name = "bytes" 219 | version = "1.8.0" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" 222 | 223 | [[package]] 224 | name = "cc" 225 | version = "1.1.31" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" 228 | dependencies = [ 229 | "shlex", 230 | ] 231 | 232 | [[package]] 233 | name = "cfg-if" 234 | version = "1.0.0" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 237 | 238 | [[package]] 239 | name = "clap" 240 | version = "4.5.20" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" 243 | dependencies = [ 244 | "clap_builder", 245 | "clap_derive", 246 | ] 247 | 248 | [[package]] 249 | name = "clap_builder" 250 | version = "4.5.20" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" 253 | dependencies = [ 254 | "anstream", 255 | "anstyle", 256 | "clap_lex", 257 | "strsim", 258 | ] 259 | 260 | [[package]] 261 | name = "clap_derive" 262 | version = "4.5.18" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" 265 | dependencies = [ 266 | "heck", 267 | "proc-macro2", 268 | "quote", 269 | "syn", 270 | ] 271 | 272 | [[package]] 273 | name = "clap_lex" 274 | version = "0.7.2" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" 277 | 278 | [[package]] 279 | name = "colorchoice" 280 | version = "1.0.3" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 283 | 284 | [[package]] 285 | name = "const_format" 286 | version = "0.2.33" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" 289 | dependencies = [ 290 | "const_format_proc_macros", 291 | ] 292 | 293 | [[package]] 294 | name = "const_format_proc_macros" 295 | version = "0.2.33" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" 298 | dependencies = [ 299 | "proc-macro2", 300 | "quote", 301 | "unicode-xid", 302 | ] 303 | 304 | [[package]] 305 | name = "core-foundation" 306 | version = "0.9.4" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 309 | dependencies = [ 310 | "core-foundation-sys", 311 | "libc", 312 | ] 313 | 314 | [[package]] 315 | name = "core-foundation-sys" 316 | version = "0.8.7" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 319 | 320 | [[package]] 321 | name = "cpufeatures" 322 | version = "0.2.14" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" 325 | dependencies = [ 326 | "libc", 327 | ] 328 | 329 | [[package]] 330 | name = "crc32fast" 331 | version = "1.4.2" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 334 | dependencies = [ 335 | "cfg-if", 336 | ] 337 | 338 | [[package]] 339 | name = "crypto-common" 340 | version = "0.1.6" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 343 | dependencies = [ 344 | "generic-array", 345 | "typenum", 346 | ] 347 | 348 | [[package]] 349 | name = "cssparser" 350 | version = "0.31.2" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "5b3df4f93e5fbbe73ec01ec8d3f68bba73107993a5b1e7519273c32db9b0d5be" 353 | dependencies = [ 354 | "cssparser-macros", 355 | "dtoa-short", 356 | "itoa", 357 | "phf 0.11.2", 358 | "smallvec", 359 | ] 360 | 361 | [[package]] 362 | name = "cssparser-macros" 363 | version = "0.6.1" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 366 | dependencies = [ 367 | "quote", 368 | "syn", 369 | ] 370 | 371 | [[package]] 372 | name = "data-encoding" 373 | version = "2.6.0" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" 376 | 377 | [[package]] 378 | name = "deranged" 379 | version = "0.3.11" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 382 | dependencies = [ 383 | "powerfmt", 384 | "serde", 385 | ] 386 | 387 | [[package]] 388 | name = "derive_more" 389 | version = "0.99.18" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" 392 | dependencies = [ 393 | "proc-macro2", 394 | "quote", 395 | "syn", 396 | ] 397 | 398 | [[package]] 399 | name = "derive_utils" 400 | version = "0.14.2" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "65f152f4b8559c4da5d574bafc7af85454d706b4c5fe8b530d508cacbb6807ea" 403 | dependencies = [ 404 | "proc-macro2", 405 | "quote", 406 | "syn", 407 | ] 408 | 409 | [[package]] 410 | name = "digest" 411 | version = "0.10.7" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 414 | dependencies = [ 415 | "block-buffer", 416 | "crypto-common", 417 | ] 418 | 419 | [[package]] 420 | name = "dtoa" 421 | version = "1.0.9" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" 424 | 425 | [[package]] 426 | name = "dtoa-short" 427 | version = "0.3.5" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" 430 | dependencies = [ 431 | "dtoa", 432 | ] 433 | 434 | [[package]] 435 | name = "ego-tree" 436 | version = "0.6.3" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "12a0bb14ac04a9fcf170d0bbbef949b44cc492f4452bd20c095636956f653642" 439 | 440 | [[package]] 441 | name = "either" 442 | version = "1.13.0" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 445 | 446 | [[package]] 447 | name = "encoding_rs" 448 | version = "0.8.35" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 451 | dependencies = [ 452 | "cfg-if", 453 | ] 454 | 455 | [[package]] 456 | name = "equivalent" 457 | version = "1.0.1" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 460 | 461 | [[package]] 462 | name = "errno" 463 | version = "0.3.9" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 466 | dependencies = [ 467 | "libc", 468 | "windows-sys 0.52.0", 469 | ] 470 | 471 | [[package]] 472 | name = "fastrand" 473 | version = "2.1.1" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" 476 | 477 | [[package]] 478 | name = "flate2" 479 | version = "1.0.34" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" 482 | dependencies = [ 483 | "crc32fast", 484 | "miniz_oxide", 485 | ] 486 | 487 | [[package]] 488 | name = "fnv" 489 | version = "1.0.7" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 492 | 493 | [[package]] 494 | name = "foreign-types" 495 | version = "0.3.2" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 498 | dependencies = [ 499 | "foreign-types-shared", 500 | ] 501 | 502 | [[package]] 503 | name = "foreign-types-shared" 504 | version = "0.1.1" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 507 | 508 | [[package]] 509 | name = "form_urlencoded" 510 | version = "1.2.1" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 513 | dependencies = [ 514 | "percent-encoding", 515 | ] 516 | 517 | [[package]] 518 | name = "futf" 519 | version = "0.1.5" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 522 | dependencies = [ 523 | "mac", 524 | "new_debug_unreachable", 525 | ] 526 | 527 | [[package]] 528 | name = "futures" 529 | version = "0.3.31" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 532 | dependencies = [ 533 | "futures-channel", 534 | "futures-core", 535 | "futures-executor", 536 | "futures-io", 537 | "futures-sink", 538 | "futures-task", 539 | "futures-util", 540 | ] 541 | 542 | [[package]] 543 | name = "futures-channel" 544 | version = "0.3.31" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 547 | dependencies = [ 548 | "futures-core", 549 | "futures-sink", 550 | ] 551 | 552 | [[package]] 553 | name = "futures-core" 554 | version = "0.3.31" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 557 | 558 | [[package]] 559 | name = "futures-executor" 560 | version = "0.3.31" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 563 | dependencies = [ 564 | "futures-core", 565 | "futures-task", 566 | "futures-util", 567 | ] 568 | 569 | [[package]] 570 | name = "futures-io" 571 | version = "0.3.31" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 574 | 575 | [[package]] 576 | name = "futures-macro" 577 | version = "0.3.31" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 580 | dependencies = [ 581 | "proc-macro2", 582 | "quote", 583 | "syn", 584 | ] 585 | 586 | [[package]] 587 | name = "futures-sink" 588 | version = "0.3.31" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 591 | 592 | [[package]] 593 | name = "futures-task" 594 | version = "0.3.31" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 597 | 598 | [[package]] 599 | name = "futures-util" 600 | version = "0.3.31" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 603 | dependencies = [ 604 | "futures-channel", 605 | "futures-core", 606 | "futures-io", 607 | "futures-macro", 608 | "futures-sink", 609 | "futures-task", 610 | "memchr", 611 | "pin-project-lite", 612 | "pin-utils", 613 | "slab", 614 | ] 615 | 616 | [[package]] 617 | name = "fxhash" 618 | version = "0.2.1" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 621 | dependencies = [ 622 | "byteorder", 623 | ] 624 | 625 | [[package]] 626 | name = "generic-array" 627 | version = "0.14.7" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 630 | dependencies = [ 631 | "typenum", 632 | "version_check", 633 | ] 634 | 635 | [[package]] 636 | name = "getopts" 637 | version = "0.2.21" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" 640 | dependencies = [ 641 | "unicode-width", 642 | ] 643 | 644 | [[package]] 645 | name = "getrandom" 646 | version = "0.2.15" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 649 | dependencies = [ 650 | "cfg-if", 651 | "libc", 652 | "wasi", 653 | ] 654 | 655 | [[package]] 656 | name = "gimli" 657 | version = "0.31.1" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 660 | 661 | [[package]] 662 | name = "h2" 663 | version = "0.3.26" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 666 | dependencies = [ 667 | "bytes", 668 | "fnv", 669 | "futures-core", 670 | "futures-sink", 671 | "futures-util", 672 | "http 0.2.12", 673 | "indexmap", 674 | "slab", 675 | "tokio", 676 | "tokio-util", 677 | "tracing", 678 | ] 679 | 680 | [[package]] 681 | name = "h2" 682 | version = "0.4.6" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" 685 | dependencies = [ 686 | "atomic-waker", 687 | "bytes", 688 | "fnv", 689 | "futures-core", 690 | "futures-sink", 691 | "http 1.1.0", 692 | "indexmap", 693 | "slab", 694 | "tokio", 695 | "tokio-util", 696 | "tracing", 697 | ] 698 | 699 | [[package]] 700 | name = "hashbrown" 701 | version = "0.15.0" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" 704 | 705 | [[package]] 706 | name = "heck" 707 | version = "0.5.0" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 710 | 711 | [[package]] 712 | name = "hermit-abi" 713 | version = "0.3.9" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 716 | 717 | [[package]] 718 | name = "html5ever" 719 | version = "0.27.0" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" 722 | dependencies = [ 723 | "log", 724 | "mac", 725 | "markup5ever", 726 | "proc-macro2", 727 | "quote", 728 | "syn", 729 | ] 730 | 731 | [[package]] 732 | name = "http" 733 | version = "0.2.12" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 736 | dependencies = [ 737 | "bytes", 738 | "fnv", 739 | "itoa", 740 | ] 741 | 742 | [[package]] 743 | name = "http" 744 | version = "1.1.0" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 747 | dependencies = [ 748 | "bytes", 749 | "fnv", 750 | "itoa", 751 | ] 752 | 753 | [[package]] 754 | name = "http-body" 755 | version = "0.4.6" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 758 | dependencies = [ 759 | "bytes", 760 | "http 0.2.12", 761 | "pin-project-lite", 762 | ] 763 | 764 | [[package]] 765 | name = "http-body" 766 | version = "1.0.1" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 769 | dependencies = [ 770 | "bytes", 771 | "http 1.1.0", 772 | ] 773 | 774 | [[package]] 775 | name = "http-body-util" 776 | version = "0.1.2" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 779 | dependencies = [ 780 | "bytes", 781 | "futures-util", 782 | "http 1.1.0", 783 | "http-body 1.0.1", 784 | "pin-project-lite", 785 | ] 786 | 787 | [[package]] 788 | name = "httparse" 789 | version = "1.9.5" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" 792 | 793 | [[package]] 794 | name = "httpdate" 795 | version = "1.0.3" 796 | source = "registry+https://github.com/rust-lang/crates.io-index" 797 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 798 | 799 | [[package]] 800 | name = "hyper" 801 | version = "0.14.31" 802 | source = "registry+https://github.com/rust-lang/crates.io-index" 803 | checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" 804 | dependencies = [ 805 | "bytes", 806 | "futures-channel", 807 | "futures-core", 808 | "futures-util", 809 | "h2 0.3.26", 810 | "http 0.2.12", 811 | "http-body 0.4.6", 812 | "httparse", 813 | "httpdate", 814 | "itoa", 815 | "pin-project-lite", 816 | "socket2", 817 | "tokio", 818 | "tower-service", 819 | "tracing", 820 | "want", 821 | ] 822 | 823 | [[package]] 824 | name = "hyper" 825 | version = "1.5.0" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" 828 | dependencies = [ 829 | "bytes", 830 | "futures-channel", 831 | "futures-util", 832 | "h2 0.4.6", 833 | "http 1.1.0", 834 | "http-body 1.0.1", 835 | "httparse", 836 | "itoa", 837 | "pin-project-lite", 838 | "smallvec", 839 | "tokio", 840 | "want", 841 | ] 842 | 843 | [[package]] 844 | name = "hyper-rustls" 845 | version = "0.24.2" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 848 | dependencies = [ 849 | "futures-util", 850 | "http 0.2.12", 851 | "hyper 0.14.31", 852 | "rustls 0.21.12", 853 | "tokio", 854 | "tokio-rustls 0.24.1", 855 | ] 856 | 857 | [[package]] 858 | name = "hyper-rustls" 859 | version = "0.27.3" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" 862 | dependencies = [ 863 | "futures-util", 864 | "http 1.1.0", 865 | "hyper 1.5.0", 866 | "hyper-util", 867 | "rustls 0.23.16", 868 | "rustls-pki-types", 869 | "tokio", 870 | "tokio-rustls 0.26.0", 871 | "tower-service", 872 | ] 873 | 874 | [[package]] 875 | name = "hyper-tls" 876 | version = "0.6.0" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 879 | dependencies = [ 880 | "bytes", 881 | "http-body-util", 882 | "hyper 1.5.0", 883 | "hyper-util", 884 | "native-tls", 885 | "tokio", 886 | "tokio-native-tls", 887 | "tower-service", 888 | ] 889 | 890 | [[package]] 891 | name = "hyper-util" 892 | version = "0.1.10" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 895 | dependencies = [ 896 | "bytes", 897 | "futures-channel", 898 | "futures-util", 899 | "http 1.1.0", 900 | "http-body 1.0.1", 901 | "hyper 1.5.0", 902 | "pin-project-lite", 903 | "socket2", 904 | "tokio", 905 | "tower-service", 906 | "tracing", 907 | ] 908 | 909 | [[package]] 910 | name = "idna" 911 | version = "0.5.0" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 914 | dependencies = [ 915 | "unicode-bidi", 916 | "unicode-normalization", 917 | ] 918 | 919 | [[package]] 920 | name = "indexmap" 921 | version = "2.6.0" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" 924 | dependencies = [ 925 | "equivalent", 926 | "hashbrown", 927 | ] 928 | 929 | [[package]] 930 | name = "ipnet" 931 | version = "2.10.1" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" 934 | 935 | [[package]] 936 | name = "is_terminal_polyfill" 937 | version = "1.70.1" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 940 | 941 | [[package]] 942 | name = "itertools" 943 | version = "0.13.0" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 946 | dependencies = [ 947 | "either", 948 | ] 949 | 950 | [[package]] 951 | name = "itoa" 952 | version = "1.0.11" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 955 | 956 | [[package]] 957 | name = "js-sys" 958 | version = "0.3.72" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" 961 | dependencies = [ 962 | "wasm-bindgen", 963 | ] 964 | 965 | [[package]] 966 | name = "libc" 967 | version = "0.2.161" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" 970 | 971 | [[package]] 972 | name = "linux-raw-sys" 973 | version = "0.4.14" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 976 | 977 | [[package]] 978 | name = "lock_api" 979 | version = "0.4.12" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 982 | dependencies = [ 983 | "autocfg", 984 | "scopeguard", 985 | ] 986 | 987 | [[package]] 988 | name = "log" 989 | version = "0.4.22" 990 | source = "registry+https://github.com/rust-lang/crates.io-index" 991 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 992 | 993 | [[package]] 994 | name = "mac" 995 | version = "0.1.1" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 998 | 999 | [[package]] 1000 | name = "markup5ever" 1001 | version = "0.12.1" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" 1004 | dependencies = [ 1005 | "log", 1006 | "phf 0.11.2", 1007 | "phf_codegen 0.11.2", 1008 | "string_cache", 1009 | "string_cache_codegen", 1010 | "tendril", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "memchr" 1015 | version = "2.7.4" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1018 | 1019 | [[package]] 1020 | name = "mime" 1021 | version = "0.3.17" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1024 | 1025 | [[package]] 1026 | name = "mime_guess" 1027 | version = "2.0.5" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 1030 | dependencies = [ 1031 | "mime", 1032 | "unicase", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "miniz_oxide" 1037 | version = "0.8.0" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" 1040 | dependencies = [ 1041 | "adler2", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "mio" 1046 | version = "1.0.2" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" 1049 | dependencies = [ 1050 | "hermit-abi", 1051 | "libc", 1052 | "wasi", 1053 | "windows-sys 0.52.0", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "native-tls" 1058 | version = "0.2.12" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" 1061 | dependencies = [ 1062 | "libc", 1063 | "log", 1064 | "openssl", 1065 | "openssl-probe", 1066 | "openssl-sys", 1067 | "schannel", 1068 | "security-framework", 1069 | "security-framework-sys", 1070 | "tempfile", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "new_debug_unreachable" 1075 | version = "1.0.6" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 1078 | 1079 | [[package]] 1080 | name = "num-conv" 1081 | version = "0.1.0" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1084 | 1085 | [[package]] 1086 | name = "object" 1087 | version = "0.36.5" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" 1090 | dependencies = [ 1091 | "memchr", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "ollama-rs" 1096 | version = "0.2.1" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "46483ac9e1f9e93da045b5875837ca3c9cf014fd6ab89b4d9736580ddefc4759" 1099 | dependencies = [ 1100 | "async-stream", 1101 | "async-trait", 1102 | "log", 1103 | "regex", 1104 | "reqwest 0.12.9", 1105 | "scraper", 1106 | "serde", 1107 | "serde_json", 1108 | "text-splitter", 1109 | "url", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "once_cell" 1114 | version = "1.20.2" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1117 | 1118 | [[package]] 1119 | name = "openssl" 1120 | version = "0.10.68" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" 1123 | dependencies = [ 1124 | "bitflags 2.6.0", 1125 | "cfg-if", 1126 | "foreign-types", 1127 | "libc", 1128 | "once_cell", 1129 | "openssl-macros", 1130 | "openssl-sys", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "openssl-macros" 1135 | version = "0.1.1" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1138 | dependencies = [ 1139 | "proc-macro2", 1140 | "quote", 1141 | "syn", 1142 | ] 1143 | 1144 | [[package]] 1145 | name = "openssl-probe" 1146 | version = "0.1.5" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1149 | 1150 | [[package]] 1151 | name = "openssl-sys" 1152 | version = "0.9.104" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" 1155 | dependencies = [ 1156 | "cc", 1157 | "libc", 1158 | "pkg-config", 1159 | "vcpkg", 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "parking_lot" 1164 | version = "0.12.3" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1167 | dependencies = [ 1168 | "lock_api", 1169 | "parking_lot_core", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "parking_lot_core" 1174 | version = "0.9.10" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1177 | dependencies = [ 1178 | "cfg-if", 1179 | "libc", 1180 | "redox_syscall", 1181 | "smallvec", 1182 | "windows-targets 0.52.6", 1183 | ] 1184 | 1185 | [[package]] 1186 | name = "percent-encoding" 1187 | version = "2.3.1" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1190 | 1191 | [[package]] 1192 | name = "persona-ai" 1193 | version = "1.0.0" 1194 | dependencies = [ 1195 | "async-trait", 1196 | "clap", 1197 | "const_format", 1198 | "futures", 1199 | "ollama-rs", 1200 | "once_cell", 1201 | "reqwest 0.12.9", 1202 | "serde", 1203 | "serde_json", 1204 | "serenity", 1205 | "tokio", 1206 | "unescape", 1207 | ] 1208 | 1209 | [[package]] 1210 | name = "phf" 1211 | version = "0.10.1" 1212 | source = "registry+https://github.com/rust-lang/crates.io-index" 1213 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1214 | dependencies = [ 1215 | "phf_shared 0.10.0", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "phf" 1220 | version = "0.11.2" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 1223 | dependencies = [ 1224 | "phf_macros", 1225 | "phf_shared 0.11.2", 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "phf_codegen" 1230 | version = "0.10.0" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" 1233 | dependencies = [ 1234 | "phf_generator 0.10.0", 1235 | "phf_shared 0.10.0", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "phf_codegen" 1240 | version = "0.11.2" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" 1243 | dependencies = [ 1244 | "phf_generator 0.11.2", 1245 | "phf_shared 0.11.2", 1246 | ] 1247 | 1248 | [[package]] 1249 | name = "phf_generator" 1250 | version = "0.10.0" 1251 | source = "registry+https://github.com/rust-lang/crates.io-index" 1252 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1253 | dependencies = [ 1254 | "phf_shared 0.10.0", 1255 | "rand", 1256 | ] 1257 | 1258 | [[package]] 1259 | name = "phf_generator" 1260 | version = "0.11.2" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 1263 | dependencies = [ 1264 | "phf_shared 0.11.2", 1265 | "rand", 1266 | ] 1267 | 1268 | [[package]] 1269 | name = "phf_macros" 1270 | version = "0.11.2" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 1273 | dependencies = [ 1274 | "phf_generator 0.11.2", 1275 | "phf_shared 0.11.2", 1276 | "proc-macro2", 1277 | "quote", 1278 | "syn", 1279 | ] 1280 | 1281 | [[package]] 1282 | name = "phf_shared" 1283 | version = "0.10.0" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 1286 | dependencies = [ 1287 | "siphasher", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "phf_shared" 1292 | version = "0.11.2" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 1295 | dependencies = [ 1296 | "siphasher", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "pin-project-lite" 1301 | version = "0.2.15" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" 1304 | 1305 | [[package]] 1306 | name = "pin-utils" 1307 | version = "0.1.0" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1310 | 1311 | [[package]] 1312 | name = "pkg-config" 1313 | version = "0.3.31" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1316 | 1317 | [[package]] 1318 | name = "powerfmt" 1319 | version = "0.2.0" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1322 | 1323 | [[package]] 1324 | name = "ppv-lite86" 1325 | version = "0.2.20" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1328 | dependencies = [ 1329 | "zerocopy", 1330 | ] 1331 | 1332 | [[package]] 1333 | name = "precomputed-hash" 1334 | version = "0.1.1" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 1337 | 1338 | [[package]] 1339 | name = "proc-macro2" 1340 | version = "1.0.89" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" 1343 | dependencies = [ 1344 | "unicode-ident", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "quote" 1349 | version = "1.0.37" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" 1352 | dependencies = [ 1353 | "proc-macro2", 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "rand" 1358 | version = "0.8.5" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1361 | dependencies = [ 1362 | "libc", 1363 | "rand_chacha", 1364 | "rand_core", 1365 | ] 1366 | 1367 | [[package]] 1368 | name = "rand_chacha" 1369 | version = "0.3.1" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1372 | dependencies = [ 1373 | "ppv-lite86", 1374 | "rand_core", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "rand_core" 1379 | version = "0.6.4" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1382 | dependencies = [ 1383 | "getrandom", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "redox_syscall" 1388 | version = "0.5.7" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" 1391 | dependencies = [ 1392 | "bitflags 2.6.0", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "regex" 1397 | version = "1.11.0" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" 1400 | dependencies = [ 1401 | "aho-corasick", 1402 | "memchr", 1403 | "regex-automata", 1404 | "regex-syntax", 1405 | ] 1406 | 1407 | [[package]] 1408 | name = "regex-automata" 1409 | version = "0.4.8" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" 1412 | dependencies = [ 1413 | "aho-corasick", 1414 | "memchr", 1415 | "regex-syntax", 1416 | ] 1417 | 1418 | [[package]] 1419 | name = "regex-syntax" 1420 | version = "0.8.5" 1421 | source = "registry+https://github.com/rust-lang/crates.io-index" 1422 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1423 | 1424 | [[package]] 1425 | name = "reqwest" 1426 | version = "0.11.27" 1427 | source = "registry+https://github.com/rust-lang/crates.io-index" 1428 | checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" 1429 | dependencies = [ 1430 | "base64 0.21.7", 1431 | "bytes", 1432 | "encoding_rs", 1433 | "futures-core", 1434 | "futures-util", 1435 | "h2 0.3.26", 1436 | "http 0.2.12", 1437 | "http-body 0.4.6", 1438 | "hyper 0.14.31", 1439 | "hyper-rustls 0.24.2", 1440 | "ipnet", 1441 | "js-sys", 1442 | "log", 1443 | "mime", 1444 | "mime_guess", 1445 | "once_cell", 1446 | "percent-encoding", 1447 | "pin-project-lite", 1448 | "rustls 0.21.12", 1449 | "rustls-pemfile 1.0.4", 1450 | "serde", 1451 | "serde_json", 1452 | "serde_urlencoded", 1453 | "sync_wrapper 0.1.2", 1454 | "system-configuration 0.5.1", 1455 | "tokio", 1456 | "tokio-rustls 0.24.1", 1457 | "tokio-util", 1458 | "tower-service", 1459 | "url", 1460 | "wasm-bindgen", 1461 | "wasm-bindgen-futures", 1462 | "wasm-streams", 1463 | "web-sys", 1464 | "webpki-roots 0.25.4", 1465 | "winreg", 1466 | ] 1467 | 1468 | [[package]] 1469 | name = "reqwest" 1470 | version = "0.12.9" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" 1473 | dependencies = [ 1474 | "base64 0.22.1", 1475 | "bytes", 1476 | "encoding_rs", 1477 | "futures-core", 1478 | "futures-util", 1479 | "h2 0.4.6", 1480 | "http 1.1.0", 1481 | "http-body 1.0.1", 1482 | "http-body-util", 1483 | "hyper 1.5.0", 1484 | "hyper-rustls 0.27.3", 1485 | "hyper-tls", 1486 | "hyper-util", 1487 | "ipnet", 1488 | "js-sys", 1489 | "log", 1490 | "mime", 1491 | "native-tls", 1492 | "once_cell", 1493 | "percent-encoding", 1494 | "pin-project-lite", 1495 | "rustls-pemfile 2.2.0", 1496 | "serde", 1497 | "serde_json", 1498 | "serde_urlencoded", 1499 | "sync_wrapper 1.0.1", 1500 | "system-configuration 0.6.1", 1501 | "tokio", 1502 | "tokio-native-tls", 1503 | "tower-service", 1504 | "url", 1505 | "wasm-bindgen", 1506 | "wasm-bindgen-futures", 1507 | "web-sys", 1508 | "windows-registry", 1509 | ] 1510 | 1511 | [[package]] 1512 | name = "ring" 1513 | version = "0.17.8" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1516 | dependencies = [ 1517 | "cc", 1518 | "cfg-if", 1519 | "getrandom", 1520 | "libc", 1521 | "spin", 1522 | "untrusted", 1523 | "windows-sys 0.52.0", 1524 | ] 1525 | 1526 | [[package]] 1527 | name = "rustc-demangle" 1528 | version = "0.1.24" 1529 | source = "registry+https://github.com/rust-lang/crates.io-index" 1530 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1531 | 1532 | [[package]] 1533 | name = "rustix" 1534 | version = "0.38.38" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" 1537 | dependencies = [ 1538 | "bitflags 2.6.0", 1539 | "errno", 1540 | "libc", 1541 | "linux-raw-sys", 1542 | "windows-sys 0.52.0", 1543 | ] 1544 | 1545 | [[package]] 1546 | name = "rustls" 1547 | version = "0.21.12" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 1550 | dependencies = [ 1551 | "log", 1552 | "ring", 1553 | "rustls-webpki 0.101.7", 1554 | "sct", 1555 | ] 1556 | 1557 | [[package]] 1558 | name = "rustls" 1559 | version = "0.22.4" 1560 | source = "registry+https://github.com/rust-lang/crates.io-index" 1561 | checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" 1562 | dependencies = [ 1563 | "log", 1564 | "ring", 1565 | "rustls-pki-types", 1566 | "rustls-webpki 0.102.8", 1567 | "subtle", 1568 | "zeroize", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "rustls" 1573 | version = "0.23.16" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" 1576 | dependencies = [ 1577 | "once_cell", 1578 | "rustls-pki-types", 1579 | "rustls-webpki 0.102.8", 1580 | "subtle", 1581 | "zeroize", 1582 | ] 1583 | 1584 | [[package]] 1585 | name = "rustls-pemfile" 1586 | version = "1.0.4" 1587 | source = "registry+https://github.com/rust-lang/crates.io-index" 1588 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1589 | dependencies = [ 1590 | "base64 0.21.7", 1591 | ] 1592 | 1593 | [[package]] 1594 | name = "rustls-pemfile" 1595 | version = "2.2.0" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1598 | dependencies = [ 1599 | "rustls-pki-types", 1600 | ] 1601 | 1602 | [[package]] 1603 | name = "rustls-pki-types" 1604 | version = "1.10.0" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" 1607 | 1608 | [[package]] 1609 | name = "rustls-webpki" 1610 | version = "0.101.7" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 1613 | dependencies = [ 1614 | "ring", 1615 | "untrusted", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "rustls-webpki" 1620 | version = "0.102.8" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 1623 | dependencies = [ 1624 | "ring", 1625 | "rustls-pki-types", 1626 | "untrusted", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "rustversion" 1631 | version = "1.0.18" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" 1634 | 1635 | [[package]] 1636 | name = "ryu" 1637 | version = "1.0.18" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1640 | 1641 | [[package]] 1642 | name = "schannel" 1643 | version = "0.1.26" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" 1646 | dependencies = [ 1647 | "windows-sys 0.59.0", 1648 | ] 1649 | 1650 | [[package]] 1651 | name = "scopeguard" 1652 | version = "1.2.0" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1655 | 1656 | [[package]] 1657 | name = "scraper" 1658 | version = "0.19.1" 1659 | source = "registry+https://github.com/rust-lang/crates.io-index" 1660 | checksum = "761fb705fdf625482d2ed91d3f0559dcfeab2798fe2771c69560a774865d0802" 1661 | dependencies = [ 1662 | "ahash", 1663 | "cssparser", 1664 | "ego-tree", 1665 | "getopts", 1666 | "html5ever", 1667 | "once_cell", 1668 | "selectors", 1669 | "tendril", 1670 | ] 1671 | 1672 | [[package]] 1673 | name = "sct" 1674 | version = "0.7.1" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 1677 | dependencies = [ 1678 | "ring", 1679 | "untrusted", 1680 | ] 1681 | 1682 | [[package]] 1683 | name = "secrecy" 1684 | version = "0.8.0" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" 1687 | dependencies = [ 1688 | "serde", 1689 | "zeroize", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "security-framework" 1694 | version = "2.11.1" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1697 | dependencies = [ 1698 | "bitflags 2.6.0", 1699 | "core-foundation", 1700 | "core-foundation-sys", 1701 | "libc", 1702 | "security-framework-sys", 1703 | ] 1704 | 1705 | [[package]] 1706 | name = "security-framework-sys" 1707 | version = "2.12.0" 1708 | source = "registry+https://github.com/rust-lang/crates.io-index" 1709 | checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" 1710 | dependencies = [ 1711 | "core-foundation-sys", 1712 | "libc", 1713 | ] 1714 | 1715 | [[package]] 1716 | name = "selectors" 1717 | version = "0.25.0" 1718 | source = "registry+https://github.com/rust-lang/crates.io-index" 1719 | checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" 1720 | dependencies = [ 1721 | "bitflags 2.6.0", 1722 | "cssparser", 1723 | "derive_more", 1724 | "fxhash", 1725 | "log", 1726 | "new_debug_unreachable", 1727 | "phf 0.10.1", 1728 | "phf_codegen 0.10.0", 1729 | "precomputed-hash", 1730 | "servo_arc", 1731 | "smallvec", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "serde" 1736 | version = "1.0.214" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" 1739 | dependencies = [ 1740 | "serde_derive", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "serde_cow" 1745 | version = "0.1.2" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "1e7bbbec7196bfde255ab54b65e34087c0849629280028238e67ee25d6a4b7da" 1748 | dependencies = [ 1749 | "serde", 1750 | ] 1751 | 1752 | [[package]] 1753 | name = "serde_derive" 1754 | version = "1.0.214" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" 1757 | dependencies = [ 1758 | "proc-macro2", 1759 | "quote", 1760 | "syn", 1761 | ] 1762 | 1763 | [[package]] 1764 | name = "serde_json" 1765 | version = "1.0.132" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" 1768 | dependencies = [ 1769 | "itoa", 1770 | "memchr", 1771 | "ryu", 1772 | "serde", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "serde_urlencoded" 1777 | version = "0.7.1" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1780 | dependencies = [ 1781 | "form_urlencoded", 1782 | "itoa", 1783 | "ryu", 1784 | "serde", 1785 | ] 1786 | 1787 | [[package]] 1788 | name = "serenity" 1789 | version = "0.12.2" 1790 | source = "registry+https://github.com/rust-lang/crates.io-index" 1791 | checksum = "880a04106592d0a8f5bdacb1d935889bfbccb4a14f7074984d9cd857235d34ac" 1792 | dependencies = [ 1793 | "arrayvec", 1794 | "async-trait", 1795 | "base64 0.22.1", 1796 | "bitflags 2.6.0", 1797 | "bytes", 1798 | "flate2", 1799 | "futures", 1800 | "mime_guess", 1801 | "percent-encoding", 1802 | "reqwest 0.11.27", 1803 | "secrecy", 1804 | "serde", 1805 | "serde_cow", 1806 | "serde_json", 1807 | "time", 1808 | "tokio", 1809 | "tokio-tungstenite", 1810 | "tracing", 1811 | "typemap_rev", 1812 | "url", 1813 | ] 1814 | 1815 | [[package]] 1816 | name = "servo_arc" 1817 | version = "0.3.0" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | checksum = "d036d71a959e00c77a63538b90a6c2390969f9772b096ea837205c6bd0491a44" 1820 | dependencies = [ 1821 | "stable_deref_trait", 1822 | ] 1823 | 1824 | [[package]] 1825 | name = "sha1" 1826 | version = "0.10.6" 1827 | source = "registry+https://github.com/rust-lang/crates.io-index" 1828 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1829 | dependencies = [ 1830 | "cfg-if", 1831 | "cpufeatures", 1832 | "digest", 1833 | ] 1834 | 1835 | [[package]] 1836 | name = "shlex" 1837 | version = "1.3.0" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1840 | 1841 | [[package]] 1842 | name = "signal-hook-registry" 1843 | version = "1.4.2" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1846 | dependencies = [ 1847 | "libc", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "siphasher" 1852 | version = "0.3.11" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 1855 | 1856 | [[package]] 1857 | name = "slab" 1858 | version = "0.4.9" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1861 | dependencies = [ 1862 | "autocfg", 1863 | ] 1864 | 1865 | [[package]] 1866 | name = "smallvec" 1867 | version = "1.13.2" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1870 | 1871 | [[package]] 1872 | name = "socket2" 1873 | version = "0.5.7" 1874 | source = "registry+https://github.com/rust-lang/crates.io-index" 1875 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 1876 | dependencies = [ 1877 | "libc", 1878 | "windows-sys 0.52.0", 1879 | ] 1880 | 1881 | [[package]] 1882 | name = "spin" 1883 | version = "0.9.8" 1884 | source = "registry+https://github.com/rust-lang/crates.io-index" 1885 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1886 | 1887 | [[package]] 1888 | name = "stable_deref_trait" 1889 | version = "1.2.0" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1892 | 1893 | [[package]] 1894 | name = "string_cache" 1895 | version = "0.8.7" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" 1898 | dependencies = [ 1899 | "new_debug_unreachable", 1900 | "once_cell", 1901 | "parking_lot", 1902 | "phf_shared 0.10.0", 1903 | "precomputed-hash", 1904 | "serde", 1905 | ] 1906 | 1907 | [[package]] 1908 | name = "string_cache_codegen" 1909 | version = "0.5.2" 1910 | source = "registry+https://github.com/rust-lang/crates.io-index" 1911 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 1912 | dependencies = [ 1913 | "phf_generator 0.10.0", 1914 | "phf_shared 0.10.0", 1915 | "proc-macro2", 1916 | "quote", 1917 | ] 1918 | 1919 | [[package]] 1920 | name = "strsim" 1921 | version = "0.11.1" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1924 | 1925 | [[package]] 1926 | name = "strum" 1927 | version = "0.26.3" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 1930 | dependencies = [ 1931 | "strum_macros", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "strum_macros" 1936 | version = "0.26.4" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 1939 | dependencies = [ 1940 | "heck", 1941 | "proc-macro2", 1942 | "quote", 1943 | "rustversion", 1944 | "syn", 1945 | ] 1946 | 1947 | [[package]] 1948 | name = "subtle" 1949 | version = "2.6.1" 1950 | source = "registry+https://github.com/rust-lang/crates.io-index" 1951 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1952 | 1953 | [[package]] 1954 | name = "syn" 1955 | version = "2.0.86" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" 1958 | dependencies = [ 1959 | "proc-macro2", 1960 | "quote", 1961 | "unicode-ident", 1962 | ] 1963 | 1964 | [[package]] 1965 | name = "sync_wrapper" 1966 | version = "0.1.2" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1969 | 1970 | [[package]] 1971 | name = "sync_wrapper" 1972 | version = "1.0.1" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 1975 | dependencies = [ 1976 | "futures-core", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "system-configuration" 1981 | version = "0.5.1" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1984 | dependencies = [ 1985 | "bitflags 1.3.2", 1986 | "core-foundation", 1987 | "system-configuration-sys 0.5.0", 1988 | ] 1989 | 1990 | [[package]] 1991 | name = "system-configuration" 1992 | version = "0.6.1" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 1995 | dependencies = [ 1996 | "bitflags 2.6.0", 1997 | "core-foundation", 1998 | "system-configuration-sys 0.6.0", 1999 | ] 2000 | 2001 | [[package]] 2002 | name = "system-configuration-sys" 2003 | version = "0.5.0" 2004 | source = "registry+https://github.com/rust-lang/crates.io-index" 2005 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 2006 | dependencies = [ 2007 | "core-foundation-sys", 2008 | "libc", 2009 | ] 2010 | 2011 | [[package]] 2012 | name = "system-configuration-sys" 2013 | version = "0.6.0" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 2016 | dependencies = [ 2017 | "core-foundation-sys", 2018 | "libc", 2019 | ] 2020 | 2021 | [[package]] 2022 | name = "tempfile" 2023 | version = "3.13.0" 2024 | source = "registry+https://github.com/rust-lang/crates.io-index" 2025 | checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" 2026 | dependencies = [ 2027 | "cfg-if", 2028 | "fastrand", 2029 | "once_cell", 2030 | "rustix", 2031 | "windows-sys 0.59.0", 2032 | ] 2033 | 2034 | [[package]] 2035 | name = "tendril" 2036 | version = "0.4.3" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 2039 | dependencies = [ 2040 | "futf", 2041 | "mac", 2042 | "utf-8", 2043 | ] 2044 | 2045 | [[package]] 2046 | name = "text-splitter" 2047 | version = "0.13.3" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "2ab9dc04b7cf08eb01c07c272bf699fa55679a326ddf7dd075e14094efc80fb9" 2050 | dependencies = [ 2051 | "ahash", 2052 | "auto_enums", 2053 | "either", 2054 | "itertools", 2055 | "once_cell", 2056 | "regex", 2057 | "strum", 2058 | "thiserror", 2059 | "unicode-segmentation", 2060 | ] 2061 | 2062 | [[package]] 2063 | name = "thiserror" 2064 | version = "1.0.66" 2065 | source = "registry+https://github.com/rust-lang/crates.io-index" 2066 | checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" 2067 | dependencies = [ 2068 | "thiserror-impl", 2069 | ] 2070 | 2071 | [[package]] 2072 | name = "thiserror-impl" 2073 | version = "1.0.66" 2074 | source = "registry+https://github.com/rust-lang/crates.io-index" 2075 | checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" 2076 | dependencies = [ 2077 | "proc-macro2", 2078 | "quote", 2079 | "syn", 2080 | ] 2081 | 2082 | [[package]] 2083 | name = "time" 2084 | version = "0.3.36" 2085 | source = "registry+https://github.com/rust-lang/crates.io-index" 2086 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 2087 | dependencies = [ 2088 | "deranged", 2089 | "itoa", 2090 | "num-conv", 2091 | "powerfmt", 2092 | "serde", 2093 | "time-core", 2094 | "time-macros", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "time-core" 2099 | version = "0.1.2" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2102 | 2103 | [[package]] 2104 | name = "time-macros" 2105 | version = "0.2.18" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 2108 | dependencies = [ 2109 | "num-conv", 2110 | "time-core", 2111 | ] 2112 | 2113 | [[package]] 2114 | name = "tinyvec" 2115 | version = "1.8.0" 2116 | source = "registry+https://github.com/rust-lang/crates.io-index" 2117 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" 2118 | dependencies = [ 2119 | "tinyvec_macros", 2120 | ] 2121 | 2122 | [[package]] 2123 | name = "tinyvec_macros" 2124 | version = "0.1.1" 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" 2126 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2127 | 2128 | [[package]] 2129 | name = "tokio" 2130 | version = "1.41.0" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" 2133 | dependencies = [ 2134 | "backtrace", 2135 | "bytes", 2136 | "libc", 2137 | "mio", 2138 | "parking_lot", 2139 | "pin-project-lite", 2140 | "signal-hook-registry", 2141 | "socket2", 2142 | "tokio-macros", 2143 | "windows-sys 0.52.0", 2144 | ] 2145 | 2146 | [[package]] 2147 | name = "tokio-macros" 2148 | version = "2.4.0" 2149 | source = "registry+https://github.com/rust-lang/crates.io-index" 2150 | checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" 2151 | dependencies = [ 2152 | "proc-macro2", 2153 | "quote", 2154 | "syn", 2155 | ] 2156 | 2157 | [[package]] 2158 | name = "tokio-native-tls" 2159 | version = "0.3.1" 2160 | source = "registry+https://github.com/rust-lang/crates.io-index" 2161 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2162 | dependencies = [ 2163 | "native-tls", 2164 | "tokio", 2165 | ] 2166 | 2167 | [[package]] 2168 | name = "tokio-rustls" 2169 | version = "0.24.1" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2172 | dependencies = [ 2173 | "rustls 0.21.12", 2174 | "tokio", 2175 | ] 2176 | 2177 | [[package]] 2178 | name = "tokio-rustls" 2179 | version = "0.25.0" 2180 | source = "registry+https://github.com/rust-lang/crates.io-index" 2181 | checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" 2182 | dependencies = [ 2183 | "rustls 0.22.4", 2184 | "rustls-pki-types", 2185 | "tokio", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "tokio-rustls" 2190 | version = "0.26.0" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" 2193 | dependencies = [ 2194 | "rustls 0.23.16", 2195 | "rustls-pki-types", 2196 | "tokio", 2197 | ] 2198 | 2199 | [[package]] 2200 | name = "tokio-tungstenite" 2201 | version = "0.21.0" 2202 | source = "registry+https://github.com/rust-lang/crates.io-index" 2203 | checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" 2204 | dependencies = [ 2205 | "futures-util", 2206 | "log", 2207 | "rustls 0.22.4", 2208 | "rustls-pki-types", 2209 | "tokio", 2210 | "tokio-rustls 0.25.0", 2211 | "tungstenite", 2212 | "webpki-roots 0.26.6", 2213 | ] 2214 | 2215 | [[package]] 2216 | name = "tokio-util" 2217 | version = "0.7.12" 2218 | source = "registry+https://github.com/rust-lang/crates.io-index" 2219 | checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" 2220 | dependencies = [ 2221 | "bytes", 2222 | "futures-core", 2223 | "futures-sink", 2224 | "pin-project-lite", 2225 | "tokio", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "tower-service" 2230 | version = "0.3.3" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2233 | 2234 | [[package]] 2235 | name = "tracing" 2236 | version = "0.1.40" 2237 | source = "registry+https://github.com/rust-lang/crates.io-index" 2238 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2239 | dependencies = [ 2240 | "log", 2241 | "pin-project-lite", 2242 | "tracing-attributes", 2243 | "tracing-core", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "tracing-attributes" 2248 | version = "0.1.27" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2251 | dependencies = [ 2252 | "proc-macro2", 2253 | "quote", 2254 | "syn", 2255 | ] 2256 | 2257 | [[package]] 2258 | name = "tracing-core" 2259 | version = "0.1.32" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2262 | dependencies = [ 2263 | "once_cell", 2264 | ] 2265 | 2266 | [[package]] 2267 | name = "try-lock" 2268 | version = "0.2.5" 2269 | source = "registry+https://github.com/rust-lang/crates.io-index" 2270 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2271 | 2272 | [[package]] 2273 | name = "tungstenite" 2274 | version = "0.21.0" 2275 | source = "registry+https://github.com/rust-lang/crates.io-index" 2276 | checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" 2277 | dependencies = [ 2278 | "byteorder", 2279 | "bytes", 2280 | "data-encoding", 2281 | "http 1.1.0", 2282 | "httparse", 2283 | "log", 2284 | "rand", 2285 | "rustls 0.22.4", 2286 | "rustls-pki-types", 2287 | "sha1", 2288 | "thiserror", 2289 | "url", 2290 | "utf-8", 2291 | ] 2292 | 2293 | [[package]] 2294 | name = "typemap_rev" 2295 | version = "0.3.0" 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" 2297 | checksum = "74b08b0c1257381af16a5c3605254d529d3e7e109f3c62befc5d168968192998" 2298 | 2299 | [[package]] 2300 | name = "typenum" 2301 | version = "1.17.0" 2302 | source = "registry+https://github.com/rust-lang/crates.io-index" 2303 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2304 | 2305 | [[package]] 2306 | name = "unescape" 2307 | version = "0.1.0" 2308 | source = "registry+https://github.com/rust-lang/crates.io-index" 2309 | checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" 2310 | 2311 | [[package]] 2312 | name = "unicase" 2313 | version = "2.8.0" 2314 | source = "registry+https://github.com/rust-lang/crates.io-index" 2315 | checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" 2316 | 2317 | [[package]] 2318 | name = "unicode-bidi" 2319 | version = "0.3.17" 2320 | source = "registry+https://github.com/rust-lang/crates.io-index" 2321 | checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" 2322 | 2323 | [[package]] 2324 | name = "unicode-ident" 2325 | version = "1.0.13" 2326 | source = "registry+https://github.com/rust-lang/crates.io-index" 2327 | checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" 2328 | 2329 | [[package]] 2330 | name = "unicode-normalization" 2331 | version = "0.1.24" 2332 | source = "registry+https://github.com/rust-lang/crates.io-index" 2333 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2334 | dependencies = [ 2335 | "tinyvec", 2336 | ] 2337 | 2338 | [[package]] 2339 | name = "unicode-segmentation" 2340 | version = "1.12.0" 2341 | source = "registry+https://github.com/rust-lang/crates.io-index" 2342 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 2343 | 2344 | [[package]] 2345 | name = "unicode-width" 2346 | version = "0.1.14" 2347 | source = "registry+https://github.com/rust-lang/crates.io-index" 2348 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 2349 | 2350 | [[package]] 2351 | name = "unicode-xid" 2352 | version = "0.2.6" 2353 | source = "registry+https://github.com/rust-lang/crates.io-index" 2354 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 2355 | 2356 | [[package]] 2357 | name = "untrusted" 2358 | version = "0.9.0" 2359 | source = "registry+https://github.com/rust-lang/crates.io-index" 2360 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2361 | 2362 | [[package]] 2363 | name = "url" 2364 | version = "2.5.2" 2365 | source = "registry+https://github.com/rust-lang/crates.io-index" 2366 | checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 2367 | dependencies = [ 2368 | "form_urlencoded", 2369 | "idna", 2370 | "percent-encoding", 2371 | "serde", 2372 | ] 2373 | 2374 | [[package]] 2375 | name = "utf-8" 2376 | version = "0.7.6" 2377 | source = "registry+https://github.com/rust-lang/crates.io-index" 2378 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2379 | 2380 | [[package]] 2381 | name = "utf8parse" 2382 | version = "0.2.2" 2383 | source = "registry+https://github.com/rust-lang/crates.io-index" 2384 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2385 | 2386 | [[package]] 2387 | name = "vcpkg" 2388 | version = "0.2.15" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2391 | 2392 | [[package]] 2393 | name = "version_check" 2394 | version = "0.9.5" 2395 | source = "registry+https://github.com/rust-lang/crates.io-index" 2396 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2397 | 2398 | [[package]] 2399 | name = "want" 2400 | version = "0.3.1" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2403 | dependencies = [ 2404 | "try-lock", 2405 | ] 2406 | 2407 | [[package]] 2408 | name = "wasi" 2409 | version = "0.11.0+wasi-snapshot-preview1" 2410 | source = "registry+https://github.com/rust-lang/crates.io-index" 2411 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2412 | 2413 | [[package]] 2414 | name = "wasm-bindgen" 2415 | version = "0.2.95" 2416 | source = "registry+https://github.com/rust-lang/crates.io-index" 2417 | checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" 2418 | dependencies = [ 2419 | "cfg-if", 2420 | "once_cell", 2421 | "wasm-bindgen-macro", 2422 | ] 2423 | 2424 | [[package]] 2425 | name = "wasm-bindgen-backend" 2426 | version = "0.2.95" 2427 | source = "registry+https://github.com/rust-lang/crates.io-index" 2428 | checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" 2429 | dependencies = [ 2430 | "bumpalo", 2431 | "log", 2432 | "once_cell", 2433 | "proc-macro2", 2434 | "quote", 2435 | "syn", 2436 | "wasm-bindgen-shared", 2437 | ] 2438 | 2439 | [[package]] 2440 | name = "wasm-bindgen-futures" 2441 | version = "0.4.45" 2442 | source = "registry+https://github.com/rust-lang/crates.io-index" 2443 | checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" 2444 | dependencies = [ 2445 | "cfg-if", 2446 | "js-sys", 2447 | "wasm-bindgen", 2448 | "web-sys", 2449 | ] 2450 | 2451 | [[package]] 2452 | name = "wasm-bindgen-macro" 2453 | version = "0.2.95" 2454 | source = "registry+https://github.com/rust-lang/crates.io-index" 2455 | checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" 2456 | dependencies = [ 2457 | "quote", 2458 | "wasm-bindgen-macro-support", 2459 | ] 2460 | 2461 | [[package]] 2462 | name = "wasm-bindgen-macro-support" 2463 | version = "0.2.95" 2464 | source = "registry+https://github.com/rust-lang/crates.io-index" 2465 | checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" 2466 | dependencies = [ 2467 | "proc-macro2", 2468 | "quote", 2469 | "syn", 2470 | "wasm-bindgen-backend", 2471 | "wasm-bindgen-shared", 2472 | ] 2473 | 2474 | [[package]] 2475 | name = "wasm-bindgen-shared" 2476 | version = "0.2.95" 2477 | source = "registry+https://github.com/rust-lang/crates.io-index" 2478 | checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" 2479 | 2480 | [[package]] 2481 | name = "wasm-streams" 2482 | version = "0.4.2" 2483 | source = "registry+https://github.com/rust-lang/crates.io-index" 2484 | checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 2485 | dependencies = [ 2486 | "futures-util", 2487 | "js-sys", 2488 | "wasm-bindgen", 2489 | "wasm-bindgen-futures", 2490 | "web-sys", 2491 | ] 2492 | 2493 | [[package]] 2494 | name = "web-sys" 2495 | version = "0.3.72" 2496 | source = "registry+https://github.com/rust-lang/crates.io-index" 2497 | checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" 2498 | dependencies = [ 2499 | "js-sys", 2500 | "wasm-bindgen", 2501 | ] 2502 | 2503 | [[package]] 2504 | name = "webpki-roots" 2505 | version = "0.25.4" 2506 | source = "registry+https://github.com/rust-lang/crates.io-index" 2507 | checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" 2508 | 2509 | [[package]] 2510 | name = "webpki-roots" 2511 | version = "0.26.6" 2512 | source = "registry+https://github.com/rust-lang/crates.io-index" 2513 | checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" 2514 | dependencies = [ 2515 | "rustls-pki-types", 2516 | ] 2517 | 2518 | [[package]] 2519 | name = "windows-registry" 2520 | version = "0.2.0" 2521 | source = "registry+https://github.com/rust-lang/crates.io-index" 2522 | checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" 2523 | dependencies = [ 2524 | "windows-result", 2525 | "windows-strings", 2526 | "windows-targets 0.52.6", 2527 | ] 2528 | 2529 | [[package]] 2530 | name = "windows-result" 2531 | version = "0.2.0" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 2534 | dependencies = [ 2535 | "windows-targets 0.52.6", 2536 | ] 2537 | 2538 | [[package]] 2539 | name = "windows-strings" 2540 | version = "0.1.0" 2541 | source = "registry+https://github.com/rust-lang/crates.io-index" 2542 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 2543 | dependencies = [ 2544 | "windows-result", 2545 | "windows-targets 0.52.6", 2546 | ] 2547 | 2548 | [[package]] 2549 | name = "windows-sys" 2550 | version = "0.48.0" 2551 | source = "registry+https://github.com/rust-lang/crates.io-index" 2552 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2553 | dependencies = [ 2554 | "windows-targets 0.48.5", 2555 | ] 2556 | 2557 | [[package]] 2558 | name = "windows-sys" 2559 | version = "0.52.0" 2560 | source = "registry+https://github.com/rust-lang/crates.io-index" 2561 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2562 | dependencies = [ 2563 | "windows-targets 0.52.6", 2564 | ] 2565 | 2566 | [[package]] 2567 | name = "windows-sys" 2568 | version = "0.59.0" 2569 | source = "registry+https://github.com/rust-lang/crates.io-index" 2570 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2571 | dependencies = [ 2572 | "windows-targets 0.52.6", 2573 | ] 2574 | 2575 | [[package]] 2576 | name = "windows-targets" 2577 | version = "0.48.5" 2578 | source = "registry+https://github.com/rust-lang/crates.io-index" 2579 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2580 | dependencies = [ 2581 | "windows_aarch64_gnullvm 0.48.5", 2582 | "windows_aarch64_msvc 0.48.5", 2583 | "windows_i686_gnu 0.48.5", 2584 | "windows_i686_msvc 0.48.5", 2585 | "windows_x86_64_gnu 0.48.5", 2586 | "windows_x86_64_gnullvm 0.48.5", 2587 | "windows_x86_64_msvc 0.48.5", 2588 | ] 2589 | 2590 | [[package]] 2591 | name = "windows-targets" 2592 | version = "0.52.6" 2593 | source = "registry+https://github.com/rust-lang/crates.io-index" 2594 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2595 | dependencies = [ 2596 | "windows_aarch64_gnullvm 0.52.6", 2597 | "windows_aarch64_msvc 0.52.6", 2598 | "windows_i686_gnu 0.52.6", 2599 | "windows_i686_gnullvm", 2600 | "windows_i686_msvc 0.52.6", 2601 | "windows_x86_64_gnu 0.52.6", 2602 | "windows_x86_64_gnullvm 0.52.6", 2603 | "windows_x86_64_msvc 0.52.6", 2604 | ] 2605 | 2606 | [[package]] 2607 | name = "windows_aarch64_gnullvm" 2608 | version = "0.48.5" 2609 | source = "registry+https://github.com/rust-lang/crates.io-index" 2610 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2611 | 2612 | [[package]] 2613 | name = "windows_aarch64_gnullvm" 2614 | version = "0.52.6" 2615 | source = "registry+https://github.com/rust-lang/crates.io-index" 2616 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2617 | 2618 | [[package]] 2619 | name = "windows_aarch64_msvc" 2620 | version = "0.48.5" 2621 | source = "registry+https://github.com/rust-lang/crates.io-index" 2622 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2623 | 2624 | [[package]] 2625 | name = "windows_aarch64_msvc" 2626 | version = "0.52.6" 2627 | source = "registry+https://github.com/rust-lang/crates.io-index" 2628 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2629 | 2630 | [[package]] 2631 | name = "windows_i686_gnu" 2632 | version = "0.48.5" 2633 | source = "registry+https://github.com/rust-lang/crates.io-index" 2634 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2635 | 2636 | [[package]] 2637 | name = "windows_i686_gnu" 2638 | version = "0.52.6" 2639 | source = "registry+https://github.com/rust-lang/crates.io-index" 2640 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2641 | 2642 | [[package]] 2643 | name = "windows_i686_gnullvm" 2644 | version = "0.52.6" 2645 | source = "registry+https://github.com/rust-lang/crates.io-index" 2646 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2647 | 2648 | [[package]] 2649 | name = "windows_i686_msvc" 2650 | version = "0.48.5" 2651 | source = "registry+https://github.com/rust-lang/crates.io-index" 2652 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2653 | 2654 | [[package]] 2655 | name = "windows_i686_msvc" 2656 | version = "0.52.6" 2657 | source = "registry+https://github.com/rust-lang/crates.io-index" 2658 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2659 | 2660 | [[package]] 2661 | name = "windows_x86_64_gnu" 2662 | version = "0.48.5" 2663 | source = "registry+https://github.com/rust-lang/crates.io-index" 2664 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2665 | 2666 | [[package]] 2667 | name = "windows_x86_64_gnu" 2668 | version = "0.52.6" 2669 | source = "registry+https://github.com/rust-lang/crates.io-index" 2670 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2671 | 2672 | [[package]] 2673 | name = "windows_x86_64_gnullvm" 2674 | version = "0.48.5" 2675 | source = "registry+https://github.com/rust-lang/crates.io-index" 2676 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2677 | 2678 | [[package]] 2679 | name = "windows_x86_64_gnullvm" 2680 | version = "0.52.6" 2681 | source = "registry+https://github.com/rust-lang/crates.io-index" 2682 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2683 | 2684 | [[package]] 2685 | name = "windows_x86_64_msvc" 2686 | version = "0.48.5" 2687 | source = "registry+https://github.com/rust-lang/crates.io-index" 2688 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2689 | 2690 | [[package]] 2691 | name = "windows_x86_64_msvc" 2692 | version = "0.52.6" 2693 | source = "registry+https://github.com/rust-lang/crates.io-index" 2694 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2695 | 2696 | [[package]] 2697 | name = "winreg" 2698 | version = "0.50.0" 2699 | source = "registry+https://github.com/rust-lang/crates.io-index" 2700 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 2701 | dependencies = [ 2702 | "cfg-if", 2703 | "windows-sys 0.48.0", 2704 | ] 2705 | 2706 | [[package]] 2707 | name = "zerocopy" 2708 | version = "0.7.35" 2709 | source = "registry+https://github.com/rust-lang/crates.io-index" 2710 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2711 | dependencies = [ 2712 | "byteorder", 2713 | "zerocopy-derive", 2714 | ] 2715 | 2716 | [[package]] 2717 | name = "zerocopy-derive" 2718 | version = "0.7.35" 2719 | source = "registry+https://github.com/rust-lang/crates.io-index" 2720 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2721 | dependencies = [ 2722 | "proc-macro2", 2723 | "quote", 2724 | "syn", 2725 | ] 2726 | 2727 | [[package]] 2728 | name = "zeroize" 2729 | version = "1.8.1" 2730 | source = "registry+https://github.com/rust-lang/crates.io-index" 2731 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2732 | --------------------------------------------------------------------------------