Login flow

Changed files
+3492 -39
crates
tangled-api
src
tangled-cli
src
commands
tangled-config
+1
.gitignore
··· 1 + target/
+363
AGENTS.md
··· 1 + # Tangled CLI – Agent Handoff (Massive Context) 2 + 3 + This document is a complete handoff for the next Codex instance working on the Tangled CLI (Rust). It explains what exists, what to build next, where to edit, how to call the APIs, how to persist sessions, how to print output, and how to validate success. 4 + 5 + Primary focus for this session: implement authentication (auth login/status/logout) and repository listing (repo list). 6 + 7 + -------------------------------------------------------------------------------- 8 + 9 + ## 0) TL;DR – Immediate Actions 10 + 11 + - Implement `auth login` using AT Protocol `com.atproto.server.createSession`. 12 + - Prompt for handle/password if flags aren’t provided. 13 + - POST to `/xrpc/com.atproto.server.createSession` at the configured PDS (default `https://bsky.social`). 14 + - Persist `{accessJwt, refreshJwt, did, handle}` via `SessionManager` (keyring-backed). 15 + - `auth status` reads keyring and prints handle + did; `auth logout` clears keyring. 16 + 17 + - Implement `repo list` using Tangled’s repo list method (tentative `sh.tangled.repo.list`). 18 + - GET `/xrpc/sh.tangled.repo.list` with optional params: `user`, `knot`, `starred`. 19 + - Include `Authorization: Bearer <accessJwt>` if required. 20 + - Print results as table (default) or JSON (`--format json`). 21 + 22 + Keep edits minimal and scoped to these features. 23 + 24 + -------------------------------------------------------------------------------- 25 + 26 + ## 1) Repository Map (Paths You Will Touch) 27 + 28 + - CLI (binary): 29 + - `tangled/crates/tangled-cli/src/commands/auth.rs` → implement login/status/logout. 30 + - `tangled/crates/tangled-cli/src/commands/repo.rs` → implement list. 31 + - `tangled/crates/tangled-cli/src/cli.rs` → already contains arguments and subcommands; no structural changes needed. 32 + - `tangled/crates/tangled-cli/src/main.rs` → no change. 33 + 34 + - Config + session: 35 + - `tangled/crates/tangled-config/src/session.rs` → already provides `Session` + `SessionManager` (keyring). 36 + - `tangled/crates/tangled-config/src/config.rs` → optional use for PDS/base URL (MVP can use CLI flags/env vars). 37 + 38 + - API client: 39 + - `tangled/crates/tangled-api/src/client.rs` → add XRPC helpers and implement `login_with_password` and `list_repos`. 40 + 41 + -------------------------------------------------------------------------------- 42 + 43 + ## 2) Current State Snapshot 44 + 45 + - Workspace is scaffolded and compiles after wiring dependencies (network needed to fetch crates): 46 + - `tangled-cli`: clap CLI with subcommands; commands currently log stubs. 47 + - `tangled-config`: TOML config loader/saver; keyring-backed session store. 48 + - `tangled-api`: client struct with placeholder methods. 49 + - `tangled-git`: stubs for future. 50 + - Placeholder lexicons in `tangled/lexicons/sh.tangled/*` are not authoritative; use AT Protocol docs and inspect real endpoints later. 51 + 52 + Goal: replace CLI stubs with real API calls for auth + repo list. 53 + 54 + -------------------------------------------------------------------------------- 55 + 56 + ## 3) Endpoints & Data Shapes 57 + 58 + ### 3.1 AT Protocol – Create Session 59 + 60 + - Method: `com.atproto.server.createSession` 61 + - HTTP: `POST /xrpc/com.atproto.server.createSession` 62 + - Request JSON: 63 + - `identifier: string` → user handle or email (e.g., `alice.bsky.social`). 64 + - `password: string` → password or app password. 65 + - Response JSON (subset used): 66 + - `accessJwt: string` 67 + - `refreshJwt: string` 68 + - `did: string` (e.g., `did:plc:...`) 69 + - `handle: string` 70 + 71 + Persist to keyring using `SessionManager`. 72 + 73 + ### 3.2 Tangled – Repo List (tentative) 74 + 75 + - Method: `sh.tangled.repo.list` (subject to change; wire in a constant to adjust easily). 76 + - HTTP: `GET /xrpc/sh.tangled.repo.list?user=<..>&knot=<..>&starred=<true|false>` 77 + - Auth: likely required; include `Authorization: Bearer <accessJwt>`. 78 + - Response JSON (envelope): 79 + - `{ "repos": [{ "name": string, "knot": string, "private": bool, ... }] }` 80 + 81 + If method name or response shape differs, adapt the client code; keep CLI interface stable. 82 + 83 + -------------------------------------------------------------------------------- 84 + 85 + ## 4) Implementation Plan 86 + 87 + ### 4.1 Add XRPC helpers and methods in `tangled-api` 88 + 89 + File: `tangled/crates/tangled-api/src/client.rs` 90 + 91 + - Extend `TangledClient` with: 92 + - `fn xrpc_url(&self, method: &str) -> String` → combines `base_url` + `/xrpc/` + `method`. 93 + - `async fn post_json<TReq: Serialize, TRes: DeserializeOwned>(&self, method, req, bearer) -> Result<TRes>`. 94 + - `async fn get_json<TRes: DeserializeOwned>(&self, method, params, bearer) -> Result<TRes>`. 95 + - Include `Authorization: Bearer <token>` when `bearer` is provided. 96 + 97 + - Implement: 98 + - `pub async fn login_with_password(&self, handle: &str, password: &str, pds: &str) -> Result<Session>` 99 + - POST to `com.atproto.server.createSession` at `self.base_url` (which should be the PDS base). 100 + - Map response to `tangled_config::session::Session` and return it (caller will persist). 101 + - `pub async fn list_repos(&self, user: Option<&str>, knot: Option<&str>, starred: bool, bearer: Option<&str>) -> Result<Vec<Repository>>` 102 + - GET `sh.tangled.repo.list` with params present only if set. 103 + - Return parsed `Vec<Repository>` from an envelope `{ repos: [...] }`. 104 + 105 + Error handling: For non-2xx, read the response body, return `anyhow!("{status}: {body}")`. 106 + 107 + ### 4.2 Wire CLI auth commands 108 + 109 + File: `tangled/crates/tangled-cli/src/commands/auth.rs` 110 + 111 + - `login`: 112 + - Determine PDS: use `--pds` arg if provided, else default `https://bsky.social` (later from config/env). 113 + - Prompt for missing handle/password. 114 + - `let client = tangled_api::TangledClient::new(&pds);` 115 + - `let session = client.login_with_password(&handle, &password, &pds).await?;` 116 + - `tangled_config::session::SessionManager::default().save(&session)?;` 117 + - Print: `Logged in as '{handle}' ({did})`. 118 + 119 + - `status`: 120 + - Load `SessionManager::default().load()?`. 121 + - If Some: print `Logged in as '{handle}' ({did})`. 122 + - Else: print `Not logged in. Run: tangled auth login`. 123 + 124 + - `logout`: 125 + - `SessionManager::default().clear()?`. 126 + - Print `Logged out` if something was cleared; otherwise `No session found` is acceptable. 127 + 128 + ### 4.3 Wire CLI repo list 129 + 130 + File: `tangled/crates/tangled-cli/src/commands/repo.rs` 131 + 132 + - Load session; if absent, print `Please login first: tangled auth login` and exit 1 (or 0 with friendly message; choose one and be consistent). 133 + - Build a client for Tangled API base (for now, default to `https://tangled.org` or allow `TANGLED_API_BASE` env var to override): 134 + - `let base = std::env::var("TANGLED_API_BASE").unwrap_or_else(|_| "https://tangled.org".into());` 135 + - `let client = tangled_api::TangledClient::new(base);` 136 + - Call `client.list_repos(args.user.as_deref(), args.knot.as_deref(), args.starred, Some(session.access_jwt.as_str())).await?`. 137 + - Print: 138 + - If `Cli.format == OutputFormat::Json`: `serde_json::to_string_pretty(&repos)`. 139 + - Else: simple columns `NAME KNOT PRIVATE` using `println!` formatting for now. 140 + 141 + -------------------------------------------------------------------------------- 142 + 143 + ## 5) Code Snippets (Copy/Paste Friendly) 144 + 145 + ### 5.1 In `tangled-api/src/client.rs` 146 + 147 + ```rust 148 + use anyhow::{anyhow, bail, Result}; 149 + use serde::{de::DeserializeOwned, Deserialize, Serialize}; 150 + use tangled_config::session::Session; 151 + 152 + #[derive(Clone, Debug)] 153 + pub struct TangledClient { pub(crate) base_url: String } 154 + 155 + impl TangledClient { 156 + pub fn new(base_url: impl Into<String>) -> Self { Self { base_url: base_url.into() } } 157 + pub fn default() -> Self { Self::new("https://tangled.org") } 158 + 159 + fn xrpc_url(&self, method: &str) -> String { 160 + format!("{}/xrpc/{}", self.base_url.trim_end_matches('/'), method) 161 + } 162 + 163 + async fn post_json<TReq: Serialize, TRes: DeserializeOwned>( 164 + &self, 165 + method: &str, 166 + req: &TReq, 167 + bearer: Option<&str>, 168 + ) -> Result<TRes> { 169 + let url = self.xrpc_url(method); 170 + let client = reqwest::Client::new(); 171 + let mut reqb = client.post(url).header(reqwest::header::CONTENT_TYPE, "application/json"); 172 + if let Some(token) = bearer { reqb = reqb.header(reqwest::header::AUTHORIZATION, format!("Bearer {}", token)); } 173 + let res = reqb.json(req).send().await?; 174 + let status = res.status(); 175 + if !status.is_success() { 176 + let body = res.text().await.unwrap_or_default(); 177 + return Err(anyhow!("{}: {}", status, body)); 178 + } 179 + Ok(res.json::<TRes>().await?) 180 + } 181 + 182 + async fn get_json<TRes: DeserializeOwned>( 183 + &self, 184 + method: &str, 185 + params: &[(&str, String)], 186 + bearer: Option<&str>, 187 + ) -> Result<TRes> { 188 + let url = self.xrpc_url(method); 189 + let client = reqwest::Client::new(); 190 + let mut reqb = client.get(url).query(&params); 191 + if let Some(token) = bearer { reqb = reqb.header(reqwest::header::AUTHORIZATION, format!("Bearer {}", token)); } 192 + let res = reqb.send().await?; 193 + let status = res.status(); 194 + if !status.is_success() { 195 + let body = res.text().await.unwrap_or_default(); 196 + return Err(anyhow!("{}: {}", status, body)); 197 + } 198 + Ok(res.json::<TRes>().await?) 199 + } 200 + 201 + pub async fn login_with_password(&self, handle: &str, password: &str, _pds: &str) -> Result<Session> { 202 + #[derive(Serialize)] 203 + struct Req<'a> { #[serde(rename = "identifier")] identifier: &'a str, #[serde(rename = "password")] password: &'a str } 204 + #[derive(Deserialize)] 205 + struct Res { #[serde(rename = "accessJwt")] access_jwt: String, #[serde(rename = "refreshJwt")] refresh_jwt: String, did: String, handle: String } 206 + let body = Req { identifier: handle, password }; 207 + let res: Res = self.post_json("com.atproto.server.createSession", &body, None).await?; 208 + Ok(Session { access_jwt: res.access_jwt, refresh_jwt: res.refresh_jwt, did: res.did, handle: res.handle, ..Default::default() }) 209 + } 210 + 211 + pub async fn list_repos(&self, user: Option<&str>, knot: Option<&str>, starred: bool, bearer: Option<&str>) -> Result<Vec<Repository>> { 212 + #[derive(Deserialize)] 213 + struct Envelope { repos: Vec<Repository> } 214 + let mut q = vec![]; 215 + if let Some(u) = user { q.push(("user", u.to_string())); } 216 + if let Some(k) = knot { q.push(("knot", k.to_string())); } 217 + if starred { q.push(("starred", true.to_string())); } 218 + let env: Envelope = self.get_json("sh.tangled.repo.list", &q, bearer).await?; 219 + Ok(env.repos) 220 + } 221 + } 222 + 223 + #[derive(Debug, Clone, Serialize, Deserialize, Default)] 224 + pub struct Repository { pub did: Option<String>, pub rkey: Option<String>, pub name: String, pub knot: Option<String>, pub description: Option<String>, pub private: bool } 225 + ``` 226 + 227 + ### 5.2 In `tangled-cli/src/commands/auth.rs` 228 + 229 + ```rust 230 + use anyhow::Result; 231 + use dialoguer::{Input, Password}; 232 + use tangled_config::session::SessionManager; 233 + use crate::cli::{AuthCommand, AuthLoginArgs, Cli}; 234 + 235 + pub async fn run(_cli: &Cli, cmd: AuthCommand) -> Result<()> { 236 + match cmd { 237 + AuthCommand::Login(args) => login(args).await, 238 + AuthCommand::Status => status().await, 239 + AuthCommand::Logout => logout().await, 240 + } 241 + } 242 + 243 + async fn login(mut args: AuthLoginArgs) -> Result<()> { 244 + let handle: String = match args.handle.take() { Some(h) => h, None => Input::new().with_prompt("Handle").interact_text()? }; 245 + let password: String = match args.password.take() { Some(p) => p, None => Password::new().with_prompt("Password").interact()? }; 246 + let pds = args.pds.unwrap_or_else(|| "https://bsky.social".to_string()); 247 + let client = tangled_api::TangledClient::new(&pds); 248 + let session = client.login_with_password(&handle, &password, &pds).await?; 249 + SessionManager::default().save(&session)?; 250 + println!("Logged in as '{}' ({})", session.handle, session.did); 251 + Ok(()) 252 + } 253 + 254 + async fn status() -> Result<()> { 255 + let mgr = SessionManager::default(); 256 + match mgr.load()? { 257 + Some(s) => println!("Logged in as '{}' ({})", s.handle, s.did), 258 + None => println!("Not logged in. Run: tangled auth login"), 259 + } 260 + Ok(()) 261 + } 262 + 263 + async fn logout() -> Result<()> { 264 + let mgr = SessionManager::default(); 265 + if mgr.load()?.is_some() { mgr.clear()?; println!("Logged out"); } else { println!("No session found"); } 266 + Ok(()) 267 + } 268 + ``` 269 + 270 + ### 5.3 In `tangled-cli/src/commands/repo.rs` 271 + 272 + ```rust 273 + use anyhow::{anyhow, Result}; 274 + use tangled_config::session::SessionManager; 275 + use crate::cli::{Cli, RepoCommand, RepoListArgs}; 276 + 277 + pub async fn run(_cli: &Cli, cmd: RepoCommand) -> Result<()> { 278 + match cmd { RepoCommand::List(args) => list(args).await, _ => Ok(println!("not implemented")) } 279 + } 280 + 281 + async fn list(args: RepoListArgs) -> Result<()> { 282 + let mgr = SessionManager::default(); 283 + let session = mgr.load()?.ok_or_else(|| anyhow!("Please login first: tangled auth login"))?; 284 + let base = std::env::var("TANGLED_API_BASE").unwrap_or_else(|_| "https://tangled.org".into()); 285 + let client = tangled_api::TangledClient::new(base); 286 + let repos = client.list_repos(args.user.as_deref(), args.knot.as_deref(), args.starred, Some(session.access_jwt.as_str())).await?; 287 + // Simple output: table or JSON to be improved later 288 + println!("NAME\tKNOT\tPRIVATE"); 289 + for r in repos { println!("{}\t{}\t{}", r.name, r.knot.unwrap_or_default(), r.private); } 290 + Ok(()) 291 + } 292 + ``` 293 + 294 + -------------------------------------------------------------------------------- 295 + 296 + ## 6) Configuration, Env Vars, and Security 297 + 298 + - PDS base (auth): default `https://bsky.social`. Accept CLI flag `--pds`; later read from config. 299 + - Tangled API base (repo list): default `https://tangled.org`; allow override via `TANGLED_API_BASE` env var. 300 + - Do not log passwords or tokens. 301 + - Store tokens only in keyring (already implemented). 302 + 303 + -------------------------------------------------------------------------------- 304 + 305 + ## 7) Testing Plan (MVP) 306 + 307 + - Client unit tests with `mockito` for `createSession` and `repo list` endpoints; simulate expected JSON. 308 + - CLI smoke tests optional for this pass. If added, use `assert_cmd` to check printed output strings. 309 + - Avoid live network calls in tests. 310 + 311 + -------------------------------------------------------------------------------- 312 + 313 + ## 8) Acceptance Criteria 314 + 315 + - `tangled auth login`: 316 + - Prompts or uses flags; successful call saves session and prints `Logged in as ...`. 317 + - On failure, shows HTTP status and short message. 318 + - `tangled auth status`: 319 + - Shows handle + did if session exists; otherwise says not logged in. 320 + - `tangled auth logout`: 321 + - Clears keyring; prints confirmation. 322 + - `tangled repo list`: 323 + - Performs authenticated GET and prints a list (even if empty) without panicking. 324 + - JSON output possible later; table output acceptable for now. 325 + 326 + -------------------------------------------------------------------------------- 327 + 328 + ## 9) Troubleshooting Notes 329 + 330 + - Keyring errors on Linux may indicate no secret service running; suggest enabling GNOME Keyring or KWallet. 331 + - If `repo list` returns 404, the method name or base URL may be wrong; adjust `sh.tangled.repo.list` or `TANGLED_API_BASE`. 332 + - If 401, session may be missing/expired; run `auth login` again. 333 + 334 + -------------------------------------------------------------------------------- 335 + 336 + ## 10) Non‑Goals for This Pass 337 + 338 + - Refresh token flow, device code, OAuth. 339 + - PRs, issues, knots, spindle implementation. 340 + - Advanced formatting, paging, completions. 341 + 342 + -------------------------------------------------------------------------------- 343 + 344 + ## 11) Future Follow‑ups 345 + 346 + - Refresh flow (`com.atproto.server.refreshSession`) and retry once on 401. 347 + - Persist base URLs and profiles in config; add `tangled config` commands. 348 + - Proper table/json formatting and shell completions. 349 + 350 + -------------------------------------------------------------------------------- 351 + 352 + ## 12) Quick Operator Commands 353 + 354 + - Build CLI: `cargo build -p tangled-cli` 355 + - Help: `cargo run -p tangled-cli -- --help` 356 + - Login: `cargo run -p tangled-cli -- auth login --handle <handle>` 357 + - Status: `cargo run -p tangled-cli -- auth status` 358 + - Repo list: `TANGLED_API_BASE=https://tangled.org cargo run -p tangled-cli -- repo list --user <handle>` 359 + 360 + -------------------------------------------------------------------------------- 361 + 362 + End of handoff. Implement auth login and repo list as described, keeping changes focused and testable. 363 +
+2972
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "addr2line" 7 + version = "0.25.1" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.1" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 + 20 + [[package]] 21 + name = "aho-corasick" 22 + version = "1.1.3" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 + dependencies = [ 26 + "memchr", 27 + ] 28 + 29 + [[package]] 30 + name = "android_system_properties" 31 + version = "0.1.5" 32 + source = "registry+https://github.com/rust-lang/crates.io-index" 33 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 34 + dependencies = [ 35 + "libc", 36 + ] 37 + 38 + [[package]] 39 + name = "anstream" 40 + version = "0.6.20" 41 + source = "registry+https://github.com/rust-lang/crates.io-index" 42 + checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" 43 + dependencies = [ 44 + "anstyle", 45 + "anstyle-parse", 46 + "anstyle-query", 47 + "anstyle-wincon", 48 + "colorchoice", 49 + "is_terminal_polyfill", 50 + "utf8parse", 51 + ] 52 + 53 + [[package]] 54 + name = "anstyle" 55 + version = "1.0.13" 56 + source = "registry+https://github.com/rust-lang/crates.io-index" 57 + checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 58 + 59 + [[package]] 60 + name = "anstyle-parse" 61 + version = "0.2.7" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 64 + dependencies = [ 65 + "utf8parse", 66 + ] 67 + 68 + [[package]] 69 + name = "anstyle-query" 70 + version = "1.1.4" 71 + source = "registry+https://github.com/rust-lang/crates.io-index" 72 + checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 73 + dependencies = [ 74 + "windows-sys 0.60.2", 75 + ] 76 + 77 + [[package]] 78 + name = "anstyle-wincon" 79 + version = "3.0.10" 80 + source = "registry+https://github.com/rust-lang/crates.io-index" 81 + checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 82 + dependencies = [ 83 + "anstyle", 84 + "once_cell_polyfill", 85 + "windows-sys 0.60.2", 86 + ] 87 + 88 + [[package]] 89 + name = "anyhow" 90 + version = "1.0.100" 91 + source = "registry+https://github.com/rust-lang/crates.io-index" 92 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 93 + 94 + [[package]] 95 + name = "async-compression" 96 + version = "0.4.32" 97 + source = "registry+https://github.com/rust-lang/crates.io-index" 98 + checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" 99 + dependencies = [ 100 + "compression-codecs", 101 + "compression-core", 102 + "futures-core", 103 + "pin-project-lite", 104 + "tokio", 105 + ] 106 + 107 + [[package]] 108 + name = "atomic-waker" 109 + version = "1.1.2" 110 + source = "registry+https://github.com/rust-lang/crates.io-index" 111 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 112 + 113 + [[package]] 114 + name = "atrium-api" 115 + version = "0.24.10" 116 + source = "registry+https://github.com/rust-lang/crates.io-index" 117 + checksum = "9c5d74937642f6b21814e82d80f54d55ebd985b681bffbe27c8a76e726c3c4db" 118 + dependencies = [ 119 + "atrium-xrpc", 120 + "chrono", 121 + "http", 122 + "ipld-core", 123 + "langtag", 124 + "regex", 125 + "serde", 126 + "serde_bytes", 127 + "serde_json", 128 + "thiserror 1.0.69", 129 + "tokio", 130 + "trait-variant", 131 + ] 132 + 133 + [[package]] 134 + name = "atrium-xrpc" 135 + version = "0.12.3" 136 + source = "registry+https://github.com/rust-lang/crates.io-index" 137 + checksum = "0216ad50ce34e9ff982e171c3659e65dedaa2ed5ac2994524debdc9a9647ffa8" 138 + dependencies = [ 139 + "http", 140 + "serde", 141 + "serde_html_form", 142 + "serde_json", 143 + "thiserror 1.0.69", 144 + "trait-variant", 145 + ] 146 + 147 + [[package]] 148 + name = "atrium-xrpc-client" 149 + version = "0.5.14" 150 + source = "registry+https://github.com/rust-lang/crates.io-index" 151 + checksum = "e099e5171f79faef52364ef0657a4cab086a71b384a779a29597a91b780de0d5" 152 + dependencies = [ 153 + "atrium-xrpc", 154 + "reqwest", 155 + ] 156 + 157 + [[package]] 158 + name = "autocfg" 159 + version = "1.5.0" 160 + source = "registry+https://github.com/rust-lang/crates.io-index" 161 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 162 + 163 + [[package]] 164 + name = "backtrace" 165 + version = "0.3.76" 166 + source = "registry+https://github.com/rust-lang/crates.io-index" 167 + checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" 168 + dependencies = [ 169 + "addr2line", 170 + "cfg-if", 171 + "libc", 172 + "miniz_oxide", 173 + "object", 174 + "rustc-demangle", 175 + "windows-link 0.2.0", 176 + ] 177 + 178 + [[package]] 179 + name = "base-x" 180 + version = "0.2.11" 181 + source = "registry+https://github.com/rust-lang/crates.io-index" 182 + checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 183 + 184 + [[package]] 185 + name = "base256emoji" 186 + version = "1.0.2" 187 + source = "registry+https://github.com/rust-lang/crates.io-index" 188 + checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" 189 + dependencies = [ 190 + "const-str", 191 + "match-lookup", 192 + ] 193 + 194 + [[package]] 195 + name = "base64" 196 + version = "0.22.1" 197 + source = "registry+https://github.com/rust-lang/crates.io-index" 198 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 199 + 200 + [[package]] 201 + name = "bitflags" 202 + version = "2.9.4" 203 + source = "registry+https://github.com/rust-lang/crates.io-index" 204 + checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 205 + 206 + [[package]] 207 + name = "bumpalo" 208 + version = "3.19.0" 209 + source = "registry+https://github.com/rust-lang/crates.io-index" 210 + checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 211 + 212 + [[package]] 213 + name = "bytes" 214 + version = "1.10.1" 215 + source = "registry+https://github.com/rust-lang/crates.io-index" 216 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 217 + 218 + [[package]] 219 + name = "cc" 220 + version = "1.2.39" 221 + source = "registry+https://github.com/rust-lang/crates.io-index" 222 + checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" 223 + dependencies = [ 224 + "find-msvc-tools", 225 + "jobserver", 226 + "libc", 227 + "shlex", 228 + ] 229 + 230 + [[package]] 231 + name = "cfg-if" 232 + version = "1.0.3" 233 + source = "registry+https://github.com/rust-lang/crates.io-index" 234 + checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 235 + 236 + [[package]] 237 + name = "cfg_aliases" 238 + version = "0.2.1" 239 + source = "registry+https://github.com/rust-lang/crates.io-index" 240 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 241 + 242 + [[package]] 243 + name = "chrono" 244 + version = "0.4.42" 245 + source = "registry+https://github.com/rust-lang/crates.io-index" 246 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 247 + dependencies = [ 248 + "iana-time-zone", 249 + "js-sys", 250 + "num-traits", 251 + "serde", 252 + "wasm-bindgen", 253 + "windows-link 0.2.0", 254 + ] 255 + 256 + [[package]] 257 + name = "cid" 258 + version = "0.11.1" 259 + source = "registry+https://github.com/rust-lang/crates.io-index" 260 + checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" 261 + dependencies = [ 262 + "core2", 263 + "multibase", 264 + "multihash", 265 + "serde", 266 + "serde_bytes", 267 + "unsigned-varint", 268 + ] 269 + 270 + [[package]] 271 + name = "clap" 272 + version = "4.5.48" 273 + source = "registry+https://github.com/rust-lang/crates.io-index" 274 + checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" 275 + dependencies = [ 276 + "clap_builder", 277 + "clap_derive", 278 + ] 279 + 280 + [[package]] 281 + name = "clap_builder" 282 + version = "4.5.48" 283 + source = "registry+https://github.com/rust-lang/crates.io-index" 284 + checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" 285 + dependencies = [ 286 + "anstream", 287 + "anstyle", 288 + "clap_lex", 289 + "strsim", 290 + "terminal_size", 291 + "unicase", 292 + "unicode-width", 293 + ] 294 + 295 + [[package]] 296 + name = "clap_derive" 297 + version = "4.5.47" 298 + source = "registry+https://github.com/rust-lang/crates.io-index" 299 + checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" 300 + dependencies = [ 301 + "heck", 302 + "proc-macro2", 303 + "quote", 304 + "syn 2.0.106", 305 + ] 306 + 307 + [[package]] 308 + name = "clap_lex" 309 + version = "0.7.5" 310 + source = "registry+https://github.com/rust-lang/crates.io-index" 311 + checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" 312 + 313 + [[package]] 314 + name = "colorchoice" 315 + version = "1.0.4" 316 + source = "registry+https://github.com/rust-lang/crates.io-index" 317 + checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 318 + 319 + [[package]] 320 + name = "colored" 321 + version = "2.2.0" 322 + source = "registry+https://github.com/rust-lang/crates.io-index" 323 + checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" 324 + dependencies = [ 325 + "lazy_static", 326 + "windows-sys 0.59.0", 327 + ] 328 + 329 + [[package]] 330 + name = "compression-codecs" 331 + version = "0.4.31" 332 + source = "registry+https://github.com/rust-lang/crates.io-index" 333 + checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" 334 + dependencies = [ 335 + "compression-core", 336 + "flate2", 337 + "memchr", 338 + ] 339 + 340 + [[package]] 341 + name = "compression-core" 342 + version = "0.4.29" 343 + source = "registry+https://github.com/rust-lang/crates.io-index" 344 + checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" 345 + 346 + [[package]] 347 + name = "console" 348 + version = "0.15.11" 349 + source = "registry+https://github.com/rust-lang/crates.io-index" 350 + checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" 351 + dependencies = [ 352 + "encode_unicode", 353 + "libc", 354 + "once_cell", 355 + "unicode-width", 356 + "windows-sys 0.59.0", 357 + ] 358 + 359 + [[package]] 360 + name = "const-str" 361 + version = "0.4.3" 362 + source = "registry+https://github.com/rust-lang/crates.io-index" 363 + checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" 364 + 365 + [[package]] 366 + name = "core-foundation" 367 + version = "0.9.4" 368 + source = "registry+https://github.com/rust-lang/crates.io-index" 369 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 370 + dependencies = [ 371 + "core-foundation-sys", 372 + "libc", 373 + ] 374 + 375 + [[package]] 376 + name = "core-foundation-sys" 377 + version = "0.8.7" 378 + source = "registry+https://github.com/rust-lang/crates.io-index" 379 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 380 + 381 + [[package]] 382 + name = "core2" 383 + version = "0.4.0" 384 + source = "registry+https://github.com/rust-lang/crates.io-index" 385 + checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 386 + dependencies = [ 387 + "memchr", 388 + ] 389 + 390 + [[package]] 391 + name = "crc32fast" 392 + version = "1.5.0" 393 + source = "registry+https://github.com/rust-lang/crates.io-index" 394 + checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 395 + dependencies = [ 396 + "cfg-if", 397 + ] 398 + 399 + [[package]] 400 + name = "data-encoding" 401 + version = "2.9.0" 402 + source = "registry+https://github.com/rust-lang/crates.io-index" 403 + checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 404 + 405 + [[package]] 406 + name = "data-encoding-macro" 407 + version = "0.1.18" 408 + source = "registry+https://github.com/rust-lang/crates.io-index" 409 + checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" 410 + dependencies = [ 411 + "data-encoding", 412 + "data-encoding-macro-internal", 413 + ] 414 + 415 + [[package]] 416 + name = "data-encoding-macro-internal" 417 + version = "0.1.16" 418 + source = "registry+https://github.com/rust-lang/crates.io-index" 419 + checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" 420 + dependencies = [ 421 + "data-encoding", 422 + "syn 2.0.106", 423 + ] 424 + 425 + [[package]] 426 + name = "dbus" 427 + version = "0.9.9" 428 + source = "registry+https://github.com/rust-lang/crates.io-index" 429 + checksum = "190b6255e8ab55a7b568df5a883e9497edc3e4821c06396612048b430e5ad1e9" 430 + dependencies = [ 431 + "libc", 432 + "libdbus-sys", 433 + "windows-sys 0.59.0", 434 + ] 435 + 436 + [[package]] 437 + name = "dbus-secret-service" 438 + version = "4.1.0" 439 + source = "registry+https://github.com/rust-lang/crates.io-index" 440 + checksum = "708b509edf7889e53d7efb0ffadd994cc6c2345ccb62f55cfd6b0682165e4fa6" 441 + dependencies = [ 442 + "dbus", 443 + "openssl", 444 + "zeroize", 445 + ] 446 + 447 + [[package]] 448 + name = "dialoguer" 449 + version = "0.11.0" 450 + source = "registry+https://github.com/rust-lang/crates.io-index" 451 + checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" 452 + dependencies = [ 453 + "console", 454 + "shell-words", 455 + "tempfile", 456 + "thiserror 1.0.69", 457 + "zeroize", 458 + ] 459 + 460 + [[package]] 461 + name = "dirs" 462 + version = "5.0.1" 463 + source = "registry+https://github.com/rust-lang/crates.io-index" 464 + checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 465 + dependencies = [ 466 + "dirs-sys", 467 + ] 468 + 469 + [[package]] 470 + name = "dirs-sys" 471 + version = "0.4.1" 472 + source = "registry+https://github.com/rust-lang/crates.io-index" 473 + checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 474 + dependencies = [ 475 + "libc", 476 + "option-ext", 477 + "redox_users", 478 + "windows-sys 0.48.0", 479 + ] 480 + 481 + [[package]] 482 + name = "displaydoc" 483 + version = "0.2.5" 484 + source = "registry+https://github.com/rust-lang/crates.io-index" 485 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 486 + dependencies = [ 487 + "proc-macro2", 488 + "quote", 489 + "syn 2.0.106", 490 + ] 491 + 492 + [[package]] 493 + name = "encode_unicode" 494 + version = "1.0.0" 495 + source = "registry+https://github.com/rust-lang/crates.io-index" 496 + checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" 497 + 498 + [[package]] 499 + name = "encoding_rs" 500 + version = "0.8.35" 501 + source = "registry+https://github.com/rust-lang/crates.io-index" 502 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 503 + dependencies = [ 504 + "cfg-if", 505 + ] 506 + 507 + [[package]] 508 + name = "equivalent" 509 + version = "1.0.2" 510 + source = "registry+https://github.com/rust-lang/crates.io-index" 511 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 512 + 513 + [[package]] 514 + name = "errno" 515 + version = "0.3.14" 516 + source = "registry+https://github.com/rust-lang/crates.io-index" 517 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 518 + dependencies = [ 519 + "libc", 520 + "windows-sys 0.61.1", 521 + ] 522 + 523 + [[package]] 524 + name = "fastrand" 525 + version = "2.3.0" 526 + source = "registry+https://github.com/rust-lang/crates.io-index" 527 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 528 + 529 + [[package]] 530 + name = "find-msvc-tools" 531 + version = "0.1.2" 532 + source = "registry+https://github.com/rust-lang/crates.io-index" 533 + checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" 534 + 535 + [[package]] 536 + name = "flate2" 537 + version = "1.1.2" 538 + source = "registry+https://github.com/rust-lang/crates.io-index" 539 + checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 540 + dependencies = [ 541 + "crc32fast", 542 + "miniz_oxide", 543 + ] 544 + 545 + [[package]] 546 + name = "fnv" 547 + version = "1.0.7" 548 + source = "registry+https://github.com/rust-lang/crates.io-index" 549 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 550 + 551 + [[package]] 552 + name = "foreign-types" 553 + version = "0.3.2" 554 + source = "registry+https://github.com/rust-lang/crates.io-index" 555 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 556 + dependencies = [ 557 + "foreign-types-shared", 558 + ] 559 + 560 + [[package]] 561 + name = "foreign-types-shared" 562 + version = "0.1.1" 563 + source = "registry+https://github.com/rust-lang/crates.io-index" 564 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 565 + 566 + [[package]] 567 + name = "form_urlencoded" 568 + version = "1.2.2" 569 + source = "registry+https://github.com/rust-lang/crates.io-index" 570 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 571 + dependencies = [ 572 + "percent-encoding", 573 + ] 574 + 575 + [[package]] 576 + name = "futures-channel" 577 + version = "0.3.31" 578 + source = "registry+https://github.com/rust-lang/crates.io-index" 579 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 580 + dependencies = [ 581 + "futures-core", 582 + ] 583 + 584 + [[package]] 585 + name = "futures-core" 586 + version = "0.3.31" 587 + source = "registry+https://github.com/rust-lang/crates.io-index" 588 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 589 + 590 + [[package]] 591 + name = "futures-io" 592 + version = "0.3.31" 593 + source = "registry+https://github.com/rust-lang/crates.io-index" 594 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 595 + 596 + [[package]] 597 + name = "futures-macro" 598 + version = "0.3.31" 599 + source = "registry+https://github.com/rust-lang/crates.io-index" 600 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 601 + dependencies = [ 602 + "proc-macro2", 603 + "quote", 604 + "syn 2.0.106", 605 + ] 606 + 607 + [[package]] 608 + name = "futures-sink" 609 + version = "0.3.31" 610 + source = "registry+https://github.com/rust-lang/crates.io-index" 611 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 612 + 613 + [[package]] 614 + name = "futures-task" 615 + version = "0.3.31" 616 + source = "registry+https://github.com/rust-lang/crates.io-index" 617 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 618 + 619 + [[package]] 620 + name = "futures-util" 621 + version = "0.3.31" 622 + source = "registry+https://github.com/rust-lang/crates.io-index" 623 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 624 + dependencies = [ 625 + "futures-core", 626 + "futures-io", 627 + "futures-macro", 628 + "futures-sink", 629 + "futures-task", 630 + "memchr", 631 + "pin-project-lite", 632 + "pin-utils", 633 + "slab", 634 + ] 635 + 636 + [[package]] 637 + name = "getrandom" 638 + version = "0.2.16" 639 + source = "registry+https://github.com/rust-lang/crates.io-index" 640 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 641 + dependencies = [ 642 + "cfg-if", 643 + "js-sys", 644 + "libc", 645 + "wasi 0.11.1+wasi-snapshot-preview1", 646 + "wasm-bindgen", 647 + ] 648 + 649 + [[package]] 650 + name = "getrandom" 651 + version = "0.3.3" 652 + source = "registry+https://github.com/rust-lang/crates.io-index" 653 + checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 654 + dependencies = [ 655 + "cfg-if", 656 + "js-sys", 657 + "libc", 658 + "r-efi", 659 + "wasi 0.14.7+wasi-0.2.4", 660 + "wasm-bindgen", 661 + ] 662 + 663 + [[package]] 664 + name = "gimli" 665 + version = "0.32.3" 666 + source = "registry+https://github.com/rust-lang/crates.io-index" 667 + checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" 668 + 669 + [[package]] 670 + name = "git2" 671 + version = "0.19.0" 672 + source = "registry+https://github.com/rust-lang/crates.io-index" 673 + checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" 674 + dependencies = [ 675 + "bitflags", 676 + "libc", 677 + "libgit2-sys", 678 + "log", 679 + "openssl-probe", 680 + "openssl-sys", 681 + "url", 682 + ] 683 + 684 + [[package]] 685 + name = "h2" 686 + version = "0.4.12" 687 + source = "registry+https://github.com/rust-lang/crates.io-index" 688 + checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" 689 + dependencies = [ 690 + "atomic-waker", 691 + "bytes", 692 + "fnv", 693 + "futures-core", 694 + "futures-sink", 695 + "http", 696 + "indexmap", 697 + "slab", 698 + "tokio", 699 + "tokio-util", 700 + "tracing", 701 + ] 702 + 703 + [[package]] 704 + name = "hashbrown" 705 + version = "0.16.0" 706 + source = "registry+https://github.com/rust-lang/crates.io-index" 707 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 708 + 709 + [[package]] 710 + name = "heck" 711 + version = "0.5.0" 712 + source = "registry+https://github.com/rust-lang/crates.io-index" 713 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 714 + 715 + [[package]] 716 + name = "http" 717 + version = "1.3.1" 718 + source = "registry+https://github.com/rust-lang/crates.io-index" 719 + checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 720 + dependencies = [ 721 + "bytes", 722 + "fnv", 723 + "itoa", 724 + ] 725 + 726 + [[package]] 727 + name = "http-body" 728 + version = "1.0.1" 729 + source = "registry+https://github.com/rust-lang/crates.io-index" 730 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 731 + dependencies = [ 732 + "bytes", 733 + "http", 734 + ] 735 + 736 + [[package]] 737 + name = "http-body-util" 738 + version = "0.1.3" 739 + source = "registry+https://github.com/rust-lang/crates.io-index" 740 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 741 + dependencies = [ 742 + "bytes", 743 + "futures-core", 744 + "http", 745 + "http-body", 746 + "pin-project-lite", 747 + ] 748 + 749 + [[package]] 750 + name = "httparse" 751 + version = "1.10.1" 752 + source = "registry+https://github.com/rust-lang/crates.io-index" 753 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 754 + 755 + [[package]] 756 + name = "hyper" 757 + version = "1.7.0" 758 + source = "registry+https://github.com/rust-lang/crates.io-index" 759 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 760 + dependencies = [ 761 + "atomic-waker", 762 + "bytes", 763 + "futures-channel", 764 + "futures-core", 765 + "h2", 766 + "http", 767 + "http-body", 768 + "httparse", 769 + "itoa", 770 + "pin-project-lite", 771 + "pin-utils", 772 + "smallvec", 773 + "tokio", 774 + "want", 775 + ] 776 + 777 + [[package]] 778 + name = "hyper-rustls" 779 + version = "0.27.7" 780 + source = "registry+https://github.com/rust-lang/crates.io-index" 781 + checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 782 + dependencies = [ 783 + "http", 784 + "hyper", 785 + "hyper-util", 786 + "rustls", 787 + "rustls-pki-types", 788 + "tokio", 789 + "tokio-rustls", 790 + "tower-service", 791 + "webpki-roots", 792 + ] 793 + 794 + [[package]] 795 + name = "hyper-tls" 796 + version = "0.6.0" 797 + source = "registry+https://github.com/rust-lang/crates.io-index" 798 + checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 799 + dependencies = [ 800 + "bytes", 801 + "http-body-util", 802 + "hyper", 803 + "hyper-util", 804 + "native-tls", 805 + "tokio", 806 + "tokio-native-tls", 807 + "tower-service", 808 + ] 809 + 810 + [[package]] 811 + name = "hyper-util" 812 + version = "0.1.17" 813 + source = "registry+https://github.com/rust-lang/crates.io-index" 814 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 815 + dependencies = [ 816 + "base64", 817 + "bytes", 818 + "futures-channel", 819 + "futures-core", 820 + "futures-util", 821 + "http", 822 + "http-body", 823 + "hyper", 824 + "ipnet", 825 + "libc", 826 + "percent-encoding", 827 + "pin-project-lite", 828 + "socket2", 829 + "system-configuration", 830 + "tokio", 831 + "tower-service", 832 + "tracing", 833 + "windows-registry", 834 + ] 835 + 836 + [[package]] 837 + name = "iana-time-zone" 838 + version = "0.1.64" 839 + source = "registry+https://github.com/rust-lang/crates.io-index" 840 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 841 + dependencies = [ 842 + "android_system_properties", 843 + "core-foundation-sys", 844 + "iana-time-zone-haiku", 845 + "js-sys", 846 + "log", 847 + "wasm-bindgen", 848 + "windows-core", 849 + ] 850 + 851 + [[package]] 852 + name = "iana-time-zone-haiku" 853 + version = "0.1.2" 854 + source = "registry+https://github.com/rust-lang/crates.io-index" 855 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 856 + dependencies = [ 857 + "cc", 858 + ] 859 + 860 + [[package]] 861 + name = "icu_collections" 862 + version = "2.0.0" 863 + source = "registry+https://github.com/rust-lang/crates.io-index" 864 + checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 865 + dependencies = [ 866 + "displaydoc", 867 + "potential_utf", 868 + "yoke", 869 + "zerofrom", 870 + "zerovec", 871 + ] 872 + 873 + [[package]] 874 + name = "icu_locale_core" 875 + version = "2.0.0" 876 + source = "registry+https://github.com/rust-lang/crates.io-index" 877 + checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 878 + dependencies = [ 879 + "displaydoc", 880 + "litemap", 881 + "tinystr", 882 + "writeable", 883 + "zerovec", 884 + ] 885 + 886 + [[package]] 887 + name = "icu_normalizer" 888 + version = "2.0.0" 889 + source = "registry+https://github.com/rust-lang/crates.io-index" 890 + checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 891 + dependencies = [ 892 + "displaydoc", 893 + "icu_collections", 894 + "icu_normalizer_data", 895 + "icu_properties", 896 + "icu_provider", 897 + "smallvec", 898 + "zerovec", 899 + ] 900 + 901 + [[package]] 902 + name = "icu_normalizer_data" 903 + version = "2.0.0" 904 + source = "registry+https://github.com/rust-lang/crates.io-index" 905 + checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 906 + 907 + [[package]] 908 + name = "icu_properties" 909 + version = "2.0.1" 910 + source = "registry+https://github.com/rust-lang/crates.io-index" 911 + checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 912 + dependencies = [ 913 + "displaydoc", 914 + "icu_collections", 915 + "icu_locale_core", 916 + "icu_properties_data", 917 + "icu_provider", 918 + "potential_utf", 919 + "zerotrie", 920 + "zerovec", 921 + ] 922 + 923 + [[package]] 924 + name = "icu_properties_data" 925 + version = "2.0.1" 926 + source = "registry+https://github.com/rust-lang/crates.io-index" 927 + checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 928 + 929 + [[package]] 930 + name = "icu_provider" 931 + version = "2.0.0" 932 + source = "registry+https://github.com/rust-lang/crates.io-index" 933 + checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 934 + dependencies = [ 935 + "displaydoc", 936 + "icu_locale_core", 937 + "stable_deref_trait", 938 + "tinystr", 939 + "writeable", 940 + "yoke", 941 + "zerofrom", 942 + "zerotrie", 943 + "zerovec", 944 + ] 945 + 946 + [[package]] 947 + name = "idna" 948 + version = "1.1.0" 949 + source = "registry+https://github.com/rust-lang/crates.io-index" 950 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 951 + dependencies = [ 952 + "idna_adapter", 953 + "smallvec", 954 + "utf8_iter", 955 + ] 956 + 957 + [[package]] 958 + name = "idna_adapter" 959 + version = "1.2.1" 960 + source = "registry+https://github.com/rust-lang/crates.io-index" 961 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 962 + dependencies = [ 963 + "icu_normalizer", 964 + "icu_properties", 965 + ] 966 + 967 + [[package]] 968 + name = "indexmap" 969 + version = "2.11.4" 970 + source = "registry+https://github.com/rust-lang/crates.io-index" 971 + checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" 972 + dependencies = [ 973 + "equivalent", 974 + "hashbrown", 975 + ] 976 + 977 + [[package]] 978 + name = "indicatif" 979 + version = "0.17.11" 980 + source = "registry+https://github.com/rust-lang/crates.io-index" 981 + checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" 982 + dependencies = [ 983 + "console", 984 + "number_prefix", 985 + "portable-atomic", 986 + "unicode-width", 987 + "web-time", 988 + ] 989 + 990 + [[package]] 991 + name = "io-uring" 992 + version = "0.7.10" 993 + source = "registry+https://github.com/rust-lang/crates.io-index" 994 + checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 995 + dependencies = [ 996 + "bitflags", 997 + "cfg-if", 998 + "libc", 999 + ] 1000 + 1001 + [[package]] 1002 + name = "ipld-core" 1003 + version = "0.4.2" 1004 + source = "registry+https://github.com/rust-lang/crates.io-index" 1005 + checksum = "104718b1cc124d92a6d01ca9c9258a7df311405debb3408c445a36452f9bf8db" 1006 + dependencies = [ 1007 + "cid", 1008 + "serde", 1009 + "serde_bytes", 1010 + ] 1011 + 1012 + [[package]] 1013 + name = "ipnet" 1014 + version = "2.11.0" 1015 + source = "registry+https://github.com/rust-lang/crates.io-index" 1016 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1017 + 1018 + [[package]] 1019 + name = "iri-string" 1020 + version = "0.7.8" 1021 + source = "registry+https://github.com/rust-lang/crates.io-index" 1022 + checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1023 + dependencies = [ 1024 + "memchr", 1025 + "serde", 1026 + ] 1027 + 1028 + [[package]] 1029 + name = "is_terminal_polyfill" 1030 + version = "1.70.1" 1031 + source = "registry+https://github.com/rust-lang/crates.io-index" 1032 + checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1033 + 1034 + [[package]] 1035 + name = "itoa" 1036 + version = "1.0.15" 1037 + source = "registry+https://github.com/rust-lang/crates.io-index" 1038 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1039 + 1040 + [[package]] 1041 + name = "jobserver" 1042 + version = "0.1.34" 1043 + source = "registry+https://github.com/rust-lang/crates.io-index" 1044 + checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1045 + dependencies = [ 1046 + "getrandom 0.3.3", 1047 + "libc", 1048 + ] 1049 + 1050 + [[package]] 1051 + name = "js-sys" 1052 + version = "0.3.81" 1053 + source = "registry+https://github.com/rust-lang/crates.io-index" 1054 + checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" 1055 + dependencies = [ 1056 + "once_cell", 1057 + "wasm-bindgen", 1058 + ] 1059 + 1060 + [[package]] 1061 + name = "keyring" 1062 + version = "3.6.3" 1063 + source = "registry+https://github.com/rust-lang/crates.io-index" 1064 + checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" 1065 + dependencies = [ 1066 + "dbus-secret-service", 1067 + "log", 1068 + "openssl", 1069 + "zeroize", 1070 + ] 1071 + 1072 + [[package]] 1073 + name = "langtag" 1074 + version = "0.3.4" 1075 + source = "registry+https://github.com/rust-lang/crates.io-index" 1076 + checksum = "ed60c85f254d6ae8450cec15eedd921efbc4d1bdf6fcf6202b9a58b403f6f805" 1077 + dependencies = [ 1078 + "serde", 1079 + ] 1080 + 1081 + [[package]] 1082 + name = "lazy_static" 1083 + version = "1.5.0" 1084 + source = "registry+https://github.com/rust-lang/crates.io-index" 1085 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1086 + 1087 + [[package]] 1088 + name = "libc" 1089 + version = "0.2.176" 1090 + source = "registry+https://github.com/rust-lang/crates.io-index" 1091 + checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" 1092 + 1093 + [[package]] 1094 + name = "libdbus-sys" 1095 + version = "0.2.6" 1096 + source = "registry+https://github.com/rust-lang/crates.io-index" 1097 + checksum = "5cbe856efeb50e4681f010e9aaa2bf0a644e10139e54cde10fc83a307c23bd9f" 1098 + dependencies = [ 1099 + "cc", 1100 + "pkg-config", 1101 + ] 1102 + 1103 + [[package]] 1104 + name = "libgit2-sys" 1105 + version = "0.17.0+1.8.1" 1106 + source = "registry+https://github.com/rust-lang/crates.io-index" 1107 + checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" 1108 + dependencies = [ 1109 + "cc", 1110 + "libc", 1111 + "libssh2-sys", 1112 + "libz-sys", 1113 + "openssl-sys", 1114 + "pkg-config", 1115 + ] 1116 + 1117 + [[package]] 1118 + name = "libredox" 1119 + version = "0.1.10" 1120 + source = "registry+https://github.com/rust-lang/crates.io-index" 1121 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 1122 + dependencies = [ 1123 + "bitflags", 1124 + "libc", 1125 + ] 1126 + 1127 + [[package]] 1128 + name = "libssh2-sys" 1129 + version = "0.3.1" 1130 + source = "registry+https://github.com/rust-lang/crates.io-index" 1131 + checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" 1132 + dependencies = [ 1133 + "cc", 1134 + "libc", 1135 + "libz-sys", 1136 + "openssl-sys", 1137 + "pkg-config", 1138 + "vcpkg", 1139 + ] 1140 + 1141 + [[package]] 1142 + name = "libz-sys" 1143 + version = "1.1.22" 1144 + source = "registry+https://github.com/rust-lang/crates.io-index" 1145 + checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" 1146 + dependencies = [ 1147 + "cc", 1148 + "libc", 1149 + "pkg-config", 1150 + "vcpkg", 1151 + ] 1152 + 1153 + [[package]] 1154 + name = "linux-raw-sys" 1155 + version = "0.11.0" 1156 + source = "registry+https://github.com/rust-lang/crates.io-index" 1157 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 1158 + 1159 + [[package]] 1160 + name = "litemap" 1161 + version = "0.8.0" 1162 + source = "registry+https://github.com/rust-lang/crates.io-index" 1163 + checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1164 + 1165 + [[package]] 1166 + name = "lock_api" 1167 + version = "0.4.13" 1168 + source = "registry+https://github.com/rust-lang/crates.io-index" 1169 + checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 1170 + dependencies = [ 1171 + "autocfg", 1172 + "scopeguard", 1173 + ] 1174 + 1175 + [[package]] 1176 + name = "log" 1177 + version = "0.4.28" 1178 + source = "registry+https://github.com/rust-lang/crates.io-index" 1179 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1180 + 1181 + [[package]] 1182 + name = "lru-slab" 1183 + version = "0.1.2" 1184 + source = "registry+https://github.com/rust-lang/crates.io-index" 1185 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1186 + 1187 + [[package]] 1188 + name = "match-lookup" 1189 + version = "0.1.1" 1190 + source = "registry+https://github.com/rust-lang/crates.io-index" 1191 + checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" 1192 + dependencies = [ 1193 + "proc-macro2", 1194 + "quote", 1195 + "syn 1.0.109", 1196 + ] 1197 + 1198 + [[package]] 1199 + name = "memchr" 1200 + version = "2.7.6" 1201 + source = "registry+https://github.com/rust-lang/crates.io-index" 1202 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 1203 + 1204 + [[package]] 1205 + name = "mime" 1206 + version = "0.3.17" 1207 + source = "registry+https://github.com/rust-lang/crates.io-index" 1208 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1209 + 1210 + [[package]] 1211 + name = "miniz_oxide" 1212 + version = "0.8.9" 1213 + source = "registry+https://github.com/rust-lang/crates.io-index" 1214 + checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 1215 + dependencies = [ 1216 + "adler2", 1217 + ] 1218 + 1219 + [[package]] 1220 + name = "mio" 1221 + version = "1.0.4" 1222 + source = "registry+https://github.com/rust-lang/crates.io-index" 1223 + checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 1224 + dependencies = [ 1225 + "libc", 1226 + "wasi 0.11.1+wasi-snapshot-preview1", 1227 + "windows-sys 0.59.0", 1228 + ] 1229 + 1230 + [[package]] 1231 + name = "multibase" 1232 + version = "0.9.2" 1233 + source = "registry+https://github.com/rust-lang/crates.io-index" 1234 + checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" 1235 + dependencies = [ 1236 + "base-x", 1237 + "base256emoji", 1238 + "data-encoding", 1239 + "data-encoding-macro", 1240 + ] 1241 + 1242 + [[package]] 1243 + name = "multihash" 1244 + version = "0.19.3" 1245 + source = "registry+https://github.com/rust-lang/crates.io-index" 1246 + checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" 1247 + dependencies = [ 1248 + "core2", 1249 + "serde", 1250 + "unsigned-varint", 1251 + ] 1252 + 1253 + [[package]] 1254 + name = "native-tls" 1255 + version = "0.2.14" 1256 + source = "registry+https://github.com/rust-lang/crates.io-index" 1257 + checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 1258 + dependencies = [ 1259 + "libc", 1260 + "log", 1261 + "openssl", 1262 + "openssl-probe", 1263 + "openssl-sys", 1264 + "schannel", 1265 + "security-framework", 1266 + "security-framework-sys", 1267 + "tempfile", 1268 + ] 1269 + 1270 + [[package]] 1271 + name = "num-traits" 1272 + version = "0.2.19" 1273 + source = "registry+https://github.com/rust-lang/crates.io-index" 1274 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1275 + dependencies = [ 1276 + "autocfg", 1277 + ] 1278 + 1279 + [[package]] 1280 + name = "number_prefix" 1281 + version = "0.4.0" 1282 + source = "registry+https://github.com/rust-lang/crates.io-index" 1283 + checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 1284 + 1285 + [[package]] 1286 + name = "object" 1287 + version = "0.37.3" 1288 + source = "registry+https://github.com/rust-lang/crates.io-index" 1289 + checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" 1290 + dependencies = [ 1291 + "memchr", 1292 + ] 1293 + 1294 + [[package]] 1295 + name = "once_cell" 1296 + version = "1.21.3" 1297 + source = "registry+https://github.com/rust-lang/crates.io-index" 1298 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1299 + 1300 + [[package]] 1301 + name = "once_cell_polyfill" 1302 + version = "1.70.1" 1303 + source = "registry+https://github.com/rust-lang/crates.io-index" 1304 + checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 1305 + 1306 + [[package]] 1307 + name = "openssl" 1308 + version = "0.10.73" 1309 + source = "registry+https://github.com/rust-lang/crates.io-index" 1310 + checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 1311 + dependencies = [ 1312 + "bitflags", 1313 + "cfg-if", 1314 + "foreign-types", 1315 + "libc", 1316 + "once_cell", 1317 + "openssl-macros", 1318 + "openssl-sys", 1319 + ] 1320 + 1321 + [[package]] 1322 + name = "openssl-macros" 1323 + version = "0.1.1" 1324 + source = "registry+https://github.com/rust-lang/crates.io-index" 1325 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1326 + dependencies = [ 1327 + "proc-macro2", 1328 + "quote", 1329 + "syn 2.0.106", 1330 + ] 1331 + 1332 + [[package]] 1333 + name = "openssl-probe" 1334 + version = "0.1.6" 1335 + source = "registry+https://github.com/rust-lang/crates.io-index" 1336 + checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1337 + 1338 + [[package]] 1339 + name = "openssl-src" 1340 + version = "300.5.2+3.5.2" 1341 + source = "registry+https://github.com/rust-lang/crates.io-index" 1342 + checksum = "d270b79e2926f5150189d475bc7e9d2c69f9c4697b185fa917d5a32b792d21b4" 1343 + dependencies = [ 1344 + "cc", 1345 + ] 1346 + 1347 + [[package]] 1348 + name = "openssl-sys" 1349 + version = "0.9.109" 1350 + source = "registry+https://github.com/rust-lang/crates.io-index" 1351 + checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 1352 + dependencies = [ 1353 + "cc", 1354 + "libc", 1355 + "openssl-src", 1356 + "pkg-config", 1357 + "vcpkg", 1358 + ] 1359 + 1360 + [[package]] 1361 + name = "option-ext" 1362 + version = "0.2.0" 1363 + source = "registry+https://github.com/rust-lang/crates.io-index" 1364 + checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1365 + 1366 + [[package]] 1367 + name = "parking_lot" 1368 + version = "0.12.4" 1369 + source = "registry+https://github.com/rust-lang/crates.io-index" 1370 + checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 1371 + dependencies = [ 1372 + "lock_api", 1373 + "parking_lot_core", 1374 + ] 1375 + 1376 + [[package]] 1377 + name = "parking_lot_core" 1378 + version = "0.9.11" 1379 + source = "registry+https://github.com/rust-lang/crates.io-index" 1380 + checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 1381 + dependencies = [ 1382 + "cfg-if", 1383 + "libc", 1384 + "redox_syscall", 1385 + "smallvec", 1386 + "windows-targets 0.52.6", 1387 + ] 1388 + 1389 + [[package]] 1390 + name = "percent-encoding" 1391 + version = "2.3.2" 1392 + source = "registry+https://github.com/rust-lang/crates.io-index" 1393 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1394 + 1395 + [[package]] 1396 + name = "pin-project-lite" 1397 + version = "0.2.16" 1398 + source = "registry+https://github.com/rust-lang/crates.io-index" 1399 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1400 + 1401 + [[package]] 1402 + name = "pin-utils" 1403 + version = "0.1.0" 1404 + source = "registry+https://github.com/rust-lang/crates.io-index" 1405 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1406 + 1407 + [[package]] 1408 + name = "pkg-config" 1409 + version = "0.3.32" 1410 + source = "registry+https://github.com/rust-lang/crates.io-index" 1411 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1412 + 1413 + [[package]] 1414 + name = "portable-atomic" 1415 + version = "1.11.1" 1416 + source = "registry+https://github.com/rust-lang/crates.io-index" 1417 + checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 1418 + 1419 + [[package]] 1420 + name = "potential_utf" 1421 + version = "0.1.3" 1422 + source = "registry+https://github.com/rust-lang/crates.io-index" 1423 + checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 1424 + dependencies = [ 1425 + "zerovec", 1426 + ] 1427 + 1428 + [[package]] 1429 + name = "ppv-lite86" 1430 + version = "0.2.21" 1431 + source = "registry+https://github.com/rust-lang/crates.io-index" 1432 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1433 + dependencies = [ 1434 + "zerocopy", 1435 + ] 1436 + 1437 + [[package]] 1438 + name = "proc-macro2" 1439 + version = "1.0.101" 1440 + source = "registry+https://github.com/rust-lang/crates.io-index" 1441 + checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 1442 + dependencies = [ 1443 + "unicode-ident", 1444 + ] 1445 + 1446 + [[package]] 1447 + name = "quinn" 1448 + version = "0.11.9" 1449 + source = "registry+https://github.com/rust-lang/crates.io-index" 1450 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 1451 + dependencies = [ 1452 + "bytes", 1453 + "cfg_aliases", 1454 + "pin-project-lite", 1455 + "quinn-proto", 1456 + "quinn-udp", 1457 + "rustc-hash", 1458 + "rustls", 1459 + "socket2", 1460 + "thiserror 2.0.17", 1461 + "tokio", 1462 + "tracing", 1463 + "web-time", 1464 + ] 1465 + 1466 + [[package]] 1467 + name = "quinn-proto" 1468 + version = "0.11.13" 1469 + source = "registry+https://github.com/rust-lang/crates.io-index" 1470 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 1471 + dependencies = [ 1472 + "bytes", 1473 + "getrandom 0.3.3", 1474 + "lru-slab", 1475 + "rand", 1476 + "ring", 1477 + "rustc-hash", 1478 + "rustls", 1479 + "rustls-pki-types", 1480 + "slab", 1481 + "thiserror 2.0.17", 1482 + "tinyvec", 1483 + "tracing", 1484 + "web-time", 1485 + ] 1486 + 1487 + [[package]] 1488 + name = "quinn-udp" 1489 + version = "0.5.14" 1490 + source = "registry+https://github.com/rust-lang/crates.io-index" 1491 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 1492 + dependencies = [ 1493 + "cfg_aliases", 1494 + "libc", 1495 + "once_cell", 1496 + "socket2", 1497 + "tracing", 1498 + "windows-sys 0.60.2", 1499 + ] 1500 + 1501 + [[package]] 1502 + name = "quote" 1503 + version = "1.0.41" 1504 + source = "registry+https://github.com/rust-lang/crates.io-index" 1505 + checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" 1506 + dependencies = [ 1507 + "proc-macro2", 1508 + ] 1509 + 1510 + [[package]] 1511 + name = "r-efi" 1512 + version = "5.3.0" 1513 + source = "registry+https://github.com/rust-lang/crates.io-index" 1514 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1515 + 1516 + [[package]] 1517 + name = "rand" 1518 + version = "0.9.2" 1519 + source = "registry+https://github.com/rust-lang/crates.io-index" 1520 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 1521 + dependencies = [ 1522 + "rand_chacha", 1523 + "rand_core", 1524 + ] 1525 + 1526 + [[package]] 1527 + name = "rand_chacha" 1528 + version = "0.9.0" 1529 + source = "registry+https://github.com/rust-lang/crates.io-index" 1530 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1531 + dependencies = [ 1532 + "ppv-lite86", 1533 + "rand_core", 1534 + ] 1535 + 1536 + [[package]] 1537 + name = "rand_core" 1538 + version = "0.9.3" 1539 + source = "registry+https://github.com/rust-lang/crates.io-index" 1540 + checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1541 + dependencies = [ 1542 + "getrandom 0.3.3", 1543 + ] 1544 + 1545 + [[package]] 1546 + name = "redox_syscall" 1547 + version = "0.5.17" 1548 + source = "registry+https://github.com/rust-lang/crates.io-index" 1549 + checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 1550 + dependencies = [ 1551 + "bitflags", 1552 + ] 1553 + 1554 + [[package]] 1555 + name = "redox_users" 1556 + version = "0.4.6" 1557 + source = "registry+https://github.com/rust-lang/crates.io-index" 1558 + checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1559 + dependencies = [ 1560 + "getrandom 0.2.16", 1561 + "libredox", 1562 + "thiserror 1.0.69", 1563 + ] 1564 + 1565 + [[package]] 1566 + name = "regex" 1567 + version = "1.11.3" 1568 + source = "registry+https://github.com/rust-lang/crates.io-index" 1569 + checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" 1570 + dependencies = [ 1571 + "aho-corasick", 1572 + "memchr", 1573 + "regex-automata", 1574 + "regex-syntax", 1575 + ] 1576 + 1577 + [[package]] 1578 + name = "regex-automata" 1579 + version = "0.4.11" 1580 + source = "registry+https://github.com/rust-lang/crates.io-index" 1581 + checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" 1582 + dependencies = [ 1583 + "aho-corasick", 1584 + "memchr", 1585 + "regex-syntax", 1586 + ] 1587 + 1588 + [[package]] 1589 + name = "regex-syntax" 1590 + version = "0.8.6" 1591 + source = "registry+https://github.com/rust-lang/crates.io-index" 1592 + checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" 1593 + 1594 + [[package]] 1595 + name = "reqwest" 1596 + version = "0.12.23" 1597 + source = "registry+https://github.com/rust-lang/crates.io-index" 1598 + checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 1599 + dependencies = [ 1600 + "async-compression", 1601 + "base64", 1602 + "bytes", 1603 + "encoding_rs", 1604 + "futures-core", 1605 + "futures-util", 1606 + "h2", 1607 + "http", 1608 + "http-body", 1609 + "http-body-util", 1610 + "hyper", 1611 + "hyper-rustls", 1612 + "hyper-tls", 1613 + "hyper-util", 1614 + "js-sys", 1615 + "log", 1616 + "mime", 1617 + "native-tls", 1618 + "percent-encoding", 1619 + "pin-project-lite", 1620 + "quinn", 1621 + "rustls", 1622 + "rustls-pki-types", 1623 + "serde", 1624 + "serde_json", 1625 + "serde_urlencoded", 1626 + "sync_wrapper", 1627 + "tokio", 1628 + "tokio-native-tls", 1629 + "tokio-rustls", 1630 + "tokio-util", 1631 + "tower", 1632 + "tower-http", 1633 + "tower-service", 1634 + "url", 1635 + "wasm-bindgen", 1636 + "wasm-bindgen-futures", 1637 + "wasm-streams", 1638 + "web-sys", 1639 + "webpki-roots", 1640 + ] 1641 + 1642 + [[package]] 1643 + name = "ring" 1644 + version = "0.17.14" 1645 + source = "registry+https://github.com/rust-lang/crates.io-index" 1646 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1647 + dependencies = [ 1648 + "cc", 1649 + "cfg-if", 1650 + "getrandom 0.2.16", 1651 + "libc", 1652 + "untrusted", 1653 + "windows-sys 0.52.0", 1654 + ] 1655 + 1656 + [[package]] 1657 + name = "rustc-demangle" 1658 + version = "0.1.26" 1659 + source = "registry+https://github.com/rust-lang/crates.io-index" 1660 + checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 1661 + 1662 + [[package]] 1663 + name = "rustc-hash" 1664 + version = "2.1.1" 1665 + source = "registry+https://github.com/rust-lang/crates.io-index" 1666 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1667 + 1668 + [[package]] 1669 + name = "rustix" 1670 + version = "1.1.2" 1671 + source = "registry+https://github.com/rust-lang/crates.io-index" 1672 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 1673 + dependencies = [ 1674 + "bitflags", 1675 + "errno", 1676 + "libc", 1677 + "linux-raw-sys", 1678 + "windows-sys 0.61.1", 1679 + ] 1680 + 1681 + [[package]] 1682 + name = "rustls" 1683 + version = "0.23.32" 1684 + source = "registry+https://github.com/rust-lang/crates.io-index" 1685 + checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" 1686 + dependencies = [ 1687 + "once_cell", 1688 + "ring", 1689 + "rustls-pki-types", 1690 + "rustls-webpki", 1691 + "subtle", 1692 + "zeroize", 1693 + ] 1694 + 1695 + [[package]] 1696 + name = "rustls-pki-types" 1697 + version = "1.12.0" 1698 + source = "registry+https://github.com/rust-lang/crates.io-index" 1699 + checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 1700 + dependencies = [ 1701 + "web-time", 1702 + "zeroize", 1703 + ] 1704 + 1705 + [[package]] 1706 + name = "rustls-webpki" 1707 + version = "0.103.6" 1708 + source = "registry+https://github.com/rust-lang/crates.io-index" 1709 + checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" 1710 + dependencies = [ 1711 + "ring", 1712 + "rustls-pki-types", 1713 + "untrusted", 1714 + ] 1715 + 1716 + [[package]] 1717 + name = "rustversion" 1718 + version = "1.0.22" 1719 + source = "registry+https://github.com/rust-lang/crates.io-index" 1720 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1721 + 1722 + [[package]] 1723 + name = "ryu" 1724 + version = "1.0.20" 1725 + source = "registry+https://github.com/rust-lang/crates.io-index" 1726 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1727 + 1728 + [[package]] 1729 + name = "schannel" 1730 + version = "0.1.28" 1731 + source = "registry+https://github.com/rust-lang/crates.io-index" 1732 + checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 1733 + dependencies = [ 1734 + "windows-sys 0.61.1", 1735 + ] 1736 + 1737 + [[package]] 1738 + name = "scopeguard" 1739 + version = "1.2.0" 1740 + source = "registry+https://github.com/rust-lang/crates.io-index" 1741 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1742 + 1743 + [[package]] 1744 + name = "security-framework" 1745 + version = "2.11.1" 1746 + source = "registry+https://github.com/rust-lang/crates.io-index" 1747 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1748 + dependencies = [ 1749 + "bitflags", 1750 + "core-foundation", 1751 + "core-foundation-sys", 1752 + "libc", 1753 + "security-framework-sys", 1754 + ] 1755 + 1756 + [[package]] 1757 + name = "security-framework-sys" 1758 + version = "2.15.0" 1759 + source = "registry+https://github.com/rust-lang/crates.io-index" 1760 + checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" 1761 + dependencies = [ 1762 + "core-foundation-sys", 1763 + "libc", 1764 + ] 1765 + 1766 + [[package]] 1767 + name = "serde" 1768 + version = "1.0.228" 1769 + source = "registry+https://github.com/rust-lang/crates.io-index" 1770 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 1771 + dependencies = [ 1772 + "serde_core", 1773 + "serde_derive", 1774 + ] 1775 + 1776 + [[package]] 1777 + name = "serde_bytes" 1778 + version = "0.11.19" 1779 + source = "registry+https://github.com/rust-lang/crates.io-index" 1780 + checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" 1781 + dependencies = [ 1782 + "serde", 1783 + "serde_core", 1784 + ] 1785 + 1786 + [[package]] 1787 + name = "serde_core" 1788 + version = "1.0.228" 1789 + source = "registry+https://github.com/rust-lang/crates.io-index" 1790 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 1791 + dependencies = [ 1792 + "serde_derive", 1793 + ] 1794 + 1795 + [[package]] 1796 + name = "serde_derive" 1797 + version = "1.0.228" 1798 + source = "registry+https://github.com/rust-lang/crates.io-index" 1799 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 1800 + dependencies = [ 1801 + "proc-macro2", 1802 + "quote", 1803 + "syn 2.0.106", 1804 + ] 1805 + 1806 + [[package]] 1807 + name = "serde_html_form" 1808 + version = "0.2.8" 1809 + source = "registry+https://github.com/rust-lang/crates.io-index" 1810 + checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" 1811 + dependencies = [ 1812 + "form_urlencoded", 1813 + "indexmap", 1814 + "itoa", 1815 + "ryu", 1816 + "serde_core", 1817 + ] 1818 + 1819 + [[package]] 1820 + name = "serde_json" 1821 + version = "1.0.145" 1822 + source = "registry+https://github.com/rust-lang/crates.io-index" 1823 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 1824 + dependencies = [ 1825 + "itoa", 1826 + "memchr", 1827 + "ryu", 1828 + "serde", 1829 + "serde_core", 1830 + ] 1831 + 1832 + [[package]] 1833 + name = "serde_spanned" 1834 + version = "0.6.9" 1835 + source = "registry+https://github.com/rust-lang/crates.io-index" 1836 + checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" 1837 + dependencies = [ 1838 + "serde", 1839 + ] 1840 + 1841 + [[package]] 1842 + name = "serde_urlencoded" 1843 + version = "0.7.1" 1844 + source = "registry+https://github.com/rust-lang/crates.io-index" 1845 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1846 + dependencies = [ 1847 + "form_urlencoded", 1848 + "itoa", 1849 + "ryu", 1850 + "serde", 1851 + ] 1852 + 1853 + [[package]] 1854 + name = "shell-words" 1855 + version = "1.1.0" 1856 + source = "registry+https://github.com/rust-lang/crates.io-index" 1857 + checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" 1858 + 1859 + [[package]] 1860 + name = "shlex" 1861 + version = "1.3.0" 1862 + source = "registry+https://github.com/rust-lang/crates.io-index" 1863 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1864 + 1865 + [[package]] 1866 + name = "signal-hook-registry" 1867 + version = "1.4.6" 1868 + source = "registry+https://github.com/rust-lang/crates.io-index" 1869 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 1870 + dependencies = [ 1871 + "libc", 1872 + ] 1873 + 1874 + [[package]] 1875 + name = "slab" 1876 + version = "0.4.11" 1877 + source = "registry+https://github.com/rust-lang/crates.io-index" 1878 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 1879 + 1880 + [[package]] 1881 + name = "smallvec" 1882 + version = "1.15.1" 1883 + source = "registry+https://github.com/rust-lang/crates.io-index" 1884 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1885 + 1886 + [[package]] 1887 + name = "socket2" 1888 + version = "0.6.0" 1889 + source = "registry+https://github.com/rust-lang/crates.io-index" 1890 + checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 1891 + dependencies = [ 1892 + "libc", 1893 + "windows-sys 0.59.0", 1894 + ] 1895 + 1896 + [[package]] 1897 + name = "stable_deref_trait" 1898 + version = "1.2.0" 1899 + source = "registry+https://github.com/rust-lang/crates.io-index" 1900 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1901 + 1902 + [[package]] 1903 + name = "strsim" 1904 + version = "0.11.1" 1905 + source = "registry+https://github.com/rust-lang/crates.io-index" 1906 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1907 + 1908 + [[package]] 1909 + name = "subtle" 1910 + version = "2.6.1" 1911 + source = "registry+https://github.com/rust-lang/crates.io-index" 1912 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1913 + 1914 + [[package]] 1915 + name = "syn" 1916 + version = "1.0.109" 1917 + source = "registry+https://github.com/rust-lang/crates.io-index" 1918 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1919 + dependencies = [ 1920 + "proc-macro2", 1921 + "quote", 1922 + "unicode-ident", 1923 + ] 1924 + 1925 + [[package]] 1926 + name = "syn" 1927 + version = "2.0.106" 1928 + source = "registry+https://github.com/rust-lang/crates.io-index" 1929 + checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 1930 + dependencies = [ 1931 + "proc-macro2", 1932 + "quote", 1933 + "unicode-ident", 1934 + ] 1935 + 1936 + [[package]] 1937 + name = "sync_wrapper" 1938 + version = "1.0.2" 1939 + source = "registry+https://github.com/rust-lang/crates.io-index" 1940 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1941 + dependencies = [ 1942 + "futures-core", 1943 + ] 1944 + 1945 + [[package]] 1946 + name = "synstructure" 1947 + version = "0.13.2" 1948 + source = "registry+https://github.com/rust-lang/crates.io-index" 1949 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1950 + dependencies = [ 1951 + "proc-macro2", 1952 + "quote", 1953 + "syn 2.0.106", 1954 + ] 1955 + 1956 + [[package]] 1957 + name = "system-configuration" 1958 + version = "0.6.1" 1959 + source = "registry+https://github.com/rust-lang/crates.io-index" 1960 + checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 1961 + dependencies = [ 1962 + "bitflags", 1963 + "core-foundation", 1964 + "system-configuration-sys", 1965 + ] 1966 + 1967 + [[package]] 1968 + name = "system-configuration-sys" 1969 + version = "0.6.0" 1970 + source = "registry+https://github.com/rust-lang/crates.io-index" 1971 + checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 1972 + dependencies = [ 1973 + "core-foundation-sys", 1974 + "libc", 1975 + ] 1976 + 1977 + [[package]] 1978 + name = "tangled-api" 1979 + version = "0.1.0" 1980 + dependencies = [ 1981 + "anyhow", 1982 + "atrium-api", 1983 + "atrium-xrpc-client", 1984 + "reqwest", 1985 + "serde", 1986 + "serde_json", 1987 + "tangled-config", 1988 + "tokio", 1989 + ] 1990 + 1991 + [[package]] 1992 + name = "tangled-cli" 1993 + version = "0.1.0" 1994 + dependencies = [ 1995 + "anyhow", 1996 + "clap", 1997 + "colored", 1998 + "dialoguer", 1999 + "indicatif", 2000 + "serde", 2001 + "serde_json", 2002 + "tangled-api", 2003 + "tangled-config", 2004 + "tangled-git", 2005 + "tokio", 2006 + ] 2007 + 2008 + [[package]] 2009 + name = "tangled-config" 2010 + version = "0.1.0" 2011 + dependencies = [ 2012 + "anyhow", 2013 + "chrono", 2014 + "dirs", 2015 + "keyring", 2016 + "serde", 2017 + "serde_json", 2018 + "toml", 2019 + ] 2020 + 2021 + [[package]] 2022 + name = "tangled-git" 2023 + version = "0.1.0" 2024 + dependencies = [ 2025 + "anyhow", 2026 + "git2", 2027 + ] 2028 + 2029 + [[package]] 2030 + name = "tempfile" 2031 + version = "3.23.0" 2032 + source = "registry+https://github.com/rust-lang/crates.io-index" 2033 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 2034 + dependencies = [ 2035 + "fastrand", 2036 + "getrandom 0.3.3", 2037 + "once_cell", 2038 + "rustix", 2039 + "windows-sys 0.61.1", 2040 + ] 2041 + 2042 + [[package]] 2043 + name = "terminal_size" 2044 + version = "0.4.3" 2045 + source = "registry+https://github.com/rust-lang/crates.io-index" 2046 + checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" 2047 + dependencies = [ 2048 + "rustix", 2049 + "windows-sys 0.60.2", 2050 + ] 2051 + 2052 + [[package]] 2053 + name = "thiserror" 2054 + version = "1.0.69" 2055 + source = "registry+https://github.com/rust-lang/crates.io-index" 2056 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2057 + dependencies = [ 2058 + "thiserror-impl 1.0.69", 2059 + ] 2060 + 2061 + [[package]] 2062 + name = "thiserror" 2063 + version = "2.0.17" 2064 + source = "registry+https://github.com/rust-lang/crates.io-index" 2065 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 2066 + dependencies = [ 2067 + "thiserror-impl 2.0.17", 2068 + ] 2069 + 2070 + [[package]] 2071 + name = "thiserror-impl" 2072 + version = "1.0.69" 2073 + source = "registry+https://github.com/rust-lang/crates.io-index" 2074 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2075 + dependencies = [ 2076 + "proc-macro2", 2077 + "quote", 2078 + "syn 2.0.106", 2079 + ] 2080 + 2081 + [[package]] 2082 + name = "thiserror-impl" 2083 + version = "2.0.17" 2084 + source = "registry+https://github.com/rust-lang/crates.io-index" 2085 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 2086 + dependencies = [ 2087 + "proc-macro2", 2088 + "quote", 2089 + "syn 2.0.106", 2090 + ] 2091 + 2092 + [[package]] 2093 + name = "tinystr" 2094 + version = "0.8.1" 2095 + source = "registry+https://github.com/rust-lang/crates.io-index" 2096 + checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 2097 + dependencies = [ 2098 + "displaydoc", 2099 + "zerovec", 2100 + ] 2101 + 2102 + [[package]] 2103 + name = "tinyvec" 2104 + version = "1.10.0" 2105 + source = "registry+https://github.com/rust-lang/crates.io-index" 2106 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 2107 + dependencies = [ 2108 + "tinyvec_macros", 2109 + ] 2110 + 2111 + [[package]] 2112 + name = "tinyvec_macros" 2113 + version = "0.1.1" 2114 + source = "registry+https://github.com/rust-lang/crates.io-index" 2115 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2116 + 2117 + [[package]] 2118 + name = "tokio" 2119 + version = "1.47.1" 2120 + source = "registry+https://github.com/rust-lang/crates.io-index" 2121 + checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 2122 + dependencies = [ 2123 + "backtrace", 2124 + "bytes", 2125 + "io-uring", 2126 + "libc", 2127 + "mio", 2128 + "parking_lot", 2129 + "pin-project-lite", 2130 + "signal-hook-registry", 2131 + "slab", 2132 + "socket2", 2133 + "tokio-macros", 2134 + "windows-sys 0.59.0", 2135 + ] 2136 + 2137 + [[package]] 2138 + name = "tokio-macros" 2139 + version = "2.5.0" 2140 + source = "registry+https://github.com/rust-lang/crates.io-index" 2141 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2142 + dependencies = [ 2143 + "proc-macro2", 2144 + "quote", 2145 + "syn 2.0.106", 2146 + ] 2147 + 2148 + [[package]] 2149 + name = "tokio-native-tls" 2150 + version = "0.3.1" 2151 + source = "registry+https://github.com/rust-lang/crates.io-index" 2152 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2153 + dependencies = [ 2154 + "native-tls", 2155 + "tokio", 2156 + ] 2157 + 2158 + [[package]] 2159 + name = "tokio-rustls" 2160 + version = "0.26.4" 2161 + source = "registry+https://github.com/rust-lang/crates.io-index" 2162 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 2163 + dependencies = [ 2164 + "rustls", 2165 + "tokio", 2166 + ] 2167 + 2168 + [[package]] 2169 + name = "tokio-util" 2170 + version = "0.7.16" 2171 + source = "registry+https://github.com/rust-lang/crates.io-index" 2172 + checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 2173 + dependencies = [ 2174 + "bytes", 2175 + "futures-core", 2176 + "futures-sink", 2177 + "pin-project-lite", 2178 + "tokio", 2179 + ] 2180 + 2181 + [[package]] 2182 + name = "toml" 2183 + version = "0.8.23" 2184 + source = "registry+https://github.com/rust-lang/crates.io-index" 2185 + checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 2186 + dependencies = [ 2187 + "serde", 2188 + "serde_spanned", 2189 + "toml_datetime", 2190 + "toml_edit", 2191 + ] 2192 + 2193 + [[package]] 2194 + name = "toml_datetime" 2195 + version = "0.6.11" 2196 + source = "registry+https://github.com/rust-lang/crates.io-index" 2197 + checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 2198 + dependencies = [ 2199 + "serde", 2200 + ] 2201 + 2202 + [[package]] 2203 + name = "toml_edit" 2204 + version = "0.22.27" 2205 + source = "registry+https://github.com/rust-lang/crates.io-index" 2206 + checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 2207 + dependencies = [ 2208 + "indexmap", 2209 + "serde", 2210 + "serde_spanned", 2211 + "toml_datetime", 2212 + "toml_write", 2213 + "winnow", 2214 + ] 2215 + 2216 + [[package]] 2217 + name = "toml_write" 2218 + version = "0.1.2" 2219 + source = "registry+https://github.com/rust-lang/crates.io-index" 2220 + checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 2221 + 2222 + [[package]] 2223 + name = "tower" 2224 + version = "0.5.2" 2225 + source = "registry+https://github.com/rust-lang/crates.io-index" 2226 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2227 + dependencies = [ 2228 + "futures-core", 2229 + "futures-util", 2230 + "pin-project-lite", 2231 + "sync_wrapper", 2232 + "tokio", 2233 + "tower-layer", 2234 + "tower-service", 2235 + ] 2236 + 2237 + [[package]] 2238 + name = "tower-http" 2239 + version = "0.6.6" 2240 + source = "registry+https://github.com/rust-lang/crates.io-index" 2241 + checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 2242 + dependencies = [ 2243 + "bitflags", 2244 + "bytes", 2245 + "futures-util", 2246 + "http", 2247 + "http-body", 2248 + "iri-string", 2249 + "pin-project-lite", 2250 + "tower", 2251 + "tower-layer", 2252 + "tower-service", 2253 + ] 2254 + 2255 + [[package]] 2256 + name = "tower-layer" 2257 + version = "0.3.3" 2258 + source = "registry+https://github.com/rust-lang/crates.io-index" 2259 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2260 + 2261 + [[package]] 2262 + name = "tower-service" 2263 + version = "0.3.3" 2264 + source = "registry+https://github.com/rust-lang/crates.io-index" 2265 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2266 + 2267 + [[package]] 2268 + name = "tracing" 2269 + version = "0.1.41" 2270 + source = "registry+https://github.com/rust-lang/crates.io-index" 2271 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2272 + dependencies = [ 2273 + "pin-project-lite", 2274 + "tracing-core", 2275 + ] 2276 + 2277 + [[package]] 2278 + name = "tracing-core" 2279 + version = "0.1.34" 2280 + source = "registry+https://github.com/rust-lang/crates.io-index" 2281 + checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 2282 + dependencies = [ 2283 + "once_cell", 2284 + ] 2285 + 2286 + [[package]] 2287 + name = "trait-variant" 2288 + version = "0.1.2" 2289 + source = "registry+https://github.com/rust-lang/crates.io-index" 2290 + checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" 2291 + dependencies = [ 2292 + "proc-macro2", 2293 + "quote", 2294 + "syn 2.0.106", 2295 + ] 2296 + 2297 + [[package]] 2298 + name = "try-lock" 2299 + version = "0.2.5" 2300 + source = "registry+https://github.com/rust-lang/crates.io-index" 2301 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2302 + 2303 + [[package]] 2304 + name = "unicase" 2305 + version = "2.8.1" 2306 + source = "registry+https://github.com/rust-lang/crates.io-index" 2307 + checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 2308 + 2309 + [[package]] 2310 + name = "unicode-ident" 2311 + version = "1.0.19" 2312 + source = "registry+https://github.com/rust-lang/crates.io-index" 2313 + checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 2314 + 2315 + [[package]] 2316 + name = "unicode-width" 2317 + version = "0.2.1" 2318 + source = "registry+https://github.com/rust-lang/crates.io-index" 2319 + checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" 2320 + 2321 + [[package]] 2322 + name = "unsigned-varint" 2323 + version = "0.8.0" 2324 + source = "registry+https://github.com/rust-lang/crates.io-index" 2325 + checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" 2326 + 2327 + [[package]] 2328 + name = "untrusted" 2329 + version = "0.9.0" 2330 + source = "registry+https://github.com/rust-lang/crates.io-index" 2331 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2332 + 2333 + [[package]] 2334 + name = "url" 2335 + version = "2.5.7" 2336 + source = "registry+https://github.com/rust-lang/crates.io-index" 2337 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 2338 + dependencies = [ 2339 + "form_urlencoded", 2340 + "idna", 2341 + "percent-encoding", 2342 + "serde", 2343 + ] 2344 + 2345 + [[package]] 2346 + name = "utf8_iter" 2347 + version = "1.0.4" 2348 + source = "registry+https://github.com/rust-lang/crates.io-index" 2349 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2350 + 2351 + [[package]] 2352 + name = "utf8parse" 2353 + version = "0.2.2" 2354 + source = "registry+https://github.com/rust-lang/crates.io-index" 2355 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2356 + 2357 + [[package]] 2358 + name = "vcpkg" 2359 + version = "0.2.15" 2360 + source = "registry+https://github.com/rust-lang/crates.io-index" 2361 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2362 + 2363 + [[package]] 2364 + name = "want" 2365 + version = "0.3.1" 2366 + source = "registry+https://github.com/rust-lang/crates.io-index" 2367 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2368 + dependencies = [ 2369 + "try-lock", 2370 + ] 2371 + 2372 + [[package]] 2373 + name = "wasi" 2374 + version = "0.11.1+wasi-snapshot-preview1" 2375 + source = "registry+https://github.com/rust-lang/crates.io-index" 2376 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 2377 + 2378 + [[package]] 2379 + name = "wasi" 2380 + version = "0.14.7+wasi-0.2.4" 2381 + source = "registry+https://github.com/rust-lang/crates.io-index" 2382 + checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" 2383 + dependencies = [ 2384 + "wasip2", 2385 + ] 2386 + 2387 + [[package]] 2388 + name = "wasip2" 2389 + version = "1.0.1+wasi-0.2.4" 2390 + source = "registry+https://github.com/rust-lang/crates.io-index" 2391 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 2392 + dependencies = [ 2393 + "wit-bindgen", 2394 + ] 2395 + 2396 + [[package]] 2397 + name = "wasm-bindgen" 2398 + version = "0.2.104" 2399 + source = "registry+https://github.com/rust-lang/crates.io-index" 2400 + checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" 2401 + dependencies = [ 2402 + "cfg-if", 2403 + "once_cell", 2404 + "rustversion", 2405 + "wasm-bindgen-macro", 2406 + "wasm-bindgen-shared", 2407 + ] 2408 + 2409 + [[package]] 2410 + name = "wasm-bindgen-backend" 2411 + version = "0.2.104" 2412 + source = "registry+https://github.com/rust-lang/crates.io-index" 2413 + checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" 2414 + dependencies = [ 2415 + "bumpalo", 2416 + "log", 2417 + "proc-macro2", 2418 + "quote", 2419 + "syn 2.0.106", 2420 + "wasm-bindgen-shared", 2421 + ] 2422 + 2423 + [[package]] 2424 + name = "wasm-bindgen-futures" 2425 + version = "0.4.54" 2426 + source = "registry+https://github.com/rust-lang/crates.io-index" 2427 + checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" 2428 + dependencies = [ 2429 + "cfg-if", 2430 + "js-sys", 2431 + "once_cell", 2432 + "wasm-bindgen", 2433 + "web-sys", 2434 + ] 2435 + 2436 + [[package]] 2437 + name = "wasm-bindgen-macro" 2438 + version = "0.2.104" 2439 + source = "registry+https://github.com/rust-lang/crates.io-index" 2440 + checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" 2441 + dependencies = [ 2442 + "quote", 2443 + "wasm-bindgen-macro-support", 2444 + ] 2445 + 2446 + [[package]] 2447 + name = "wasm-bindgen-macro-support" 2448 + version = "0.2.104" 2449 + source = "registry+https://github.com/rust-lang/crates.io-index" 2450 + checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" 2451 + dependencies = [ 2452 + "proc-macro2", 2453 + "quote", 2454 + "syn 2.0.106", 2455 + "wasm-bindgen-backend", 2456 + "wasm-bindgen-shared", 2457 + ] 2458 + 2459 + [[package]] 2460 + name = "wasm-bindgen-shared" 2461 + version = "0.2.104" 2462 + source = "registry+https://github.com/rust-lang/crates.io-index" 2463 + checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" 2464 + dependencies = [ 2465 + "unicode-ident", 2466 + ] 2467 + 2468 + [[package]] 2469 + name = "wasm-streams" 2470 + version = "0.4.2" 2471 + source = "registry+https://github.com/rust-lang/crates.io-index" 2472 + checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 2473 + dependencies = [ 2474 + "futures-util", 2475 + "js-sys", 2476 + "wasm-bindgen", 2477 + "wasm-bindgen-futures", 2478 + "web-sys", 2479 + ] 2480 + 2481 + [[package]] 2482 + name = "web-sys" 2483 + version = "0.3.81" 2484 + source = "registry+https://github.com/rust-lang/crates.io-index" 2485 + checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" 2486 + dependencies = [ 2487 + "js-sys", 2488 + "wasm-bindgen", 2489 + ] 2490 + 2491 + [[package]] 2492 + name = "web-time" 2493 + version = "1.1.0" 2494 + source = "registry+https://github.com/rust-lang/crates.io-index" 2495 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2496 + dependencies = [ 2497 + "js-sys", 2498 + "wasm-bindgen", 2499 + ] 2500 + 2501 + [[package]] 2502 + name = "webpki-roots" 2503 + version = "1.0.2" 2504 + source = "registry+https://github.com/rust-lang/crates.io-index" 2505 + checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" 2506 + dependencies = [ 2507 + "rustls-pki-types", 2508 + ] 2509 + 2510 + [[package]] 2511 + name = "windows-core" 2512 + version = "0.62.1" 2513 + source = "registry+https://github.com/rust-lang/crates.io-index" 2514 + checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" 2515 + dependencies = [ 2516 + "windows-implement", 2517 + "windows-interface", 2518 + "windows-link 0.2.0", 2519 + "windows-result 0.4.0", 2520 + "windows-strings 0.5.0", 2521 + ] 2522 + 2523 + [[package]] 2524 + name = "windows-implement" 2525 + version = "0.60.1" 2526 + source = "registry+https://github.com/rust-lang/crates.io-index" 2527 + checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" 2528 + dependencies = [ 2529 + "proc-macro2", 2530 + "quote", 2531 + "syn 2.0.106", 2532 + ] 2533 + 2534 + [[package]] 2535 + name = "windows-interface" 2536 + version = "0.59.2" 2537 + source = "registry+https://github.com/rust-lang/crates.io-index" 2538 + checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" 2539 + dependencies = [ 2540 + "proc-macro2", 2541 + "quote", 2542 + "syn 2.0.106", 2543 + ] 2544 + 2545 + [[package]] 2546 + name = "windows-link" 2547 + version = "0.1.3" 2548 + source = "registry+https://github.com/rust-lang/crates.io-index" 2549 + checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 2550 + 2551 + [[package]] 2552 + name = "windows-link" 2553 + version = "0.2.0" 2554 + source = "registry+https://github.com/rust-lang/crates.io-index" 2555 + checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" 2556 + 2557 + [[package]] 2558 + name = "windows-registry" 2559 + version = "0.5.3" 2560 + source = "registry+https://github.com/rust-lang/crates.io-index" 2561 + checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 2562 + dependencies = [ 2563 + "windows-link 0.1.3", 2564 + "windows-result 0.3.4", 2565 + "windows-strings 0.4.2", 2566 + ] 2567 + 2568 + [[package]] 2569 + name = "windows-result" 2570 + version = "0.3.4" 2571 + source = "registry+https://github.com/rust-lang/crates.io-index" 2572 + checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 2573 + dependencies = [ 2574 + "windows-link 0.1.3", 2575 + ] 2576 + 2577 + [[package]] 2578 + name = "windows-result" 2579 + version = "0.4.0" 2580 + source = "registry+https://github.com/rust-lang/crates.io-index" 2581 + checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" 2582 + dependencies = [ 2583 + "windows-link 0.2.0", 2584 + ] 2585 + 2586 + [[package]] 2587 + name = "windows-strings" 2588 + version = "0.4.2" 2589 + source = "registry+https://github.com/rust-lang/crates.io-index" 2590 + checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 2591 + dependencies = [ 2592 + "windows-link 0.1.3", 2593 + ] 2594 + 2595 + [[package]] 2596 + name = "windows-strings" 2597 + version = "0.5.0" 2598 + source = "registry+https://github.com/rust-lang/crates.io-index" 2599 + checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" 2600 + dependencies = [ 2601 + "windows-link 0.2.0", 2602 + ] 2603 + 2604 + [[package]] 2605 + name = "windows-sys" 2606 + version = "0.48.0" 2607 + source = "registry+https://github.com/rust-lang/crates.io-index" 2608 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2609 + dependencies = [ 2610 + "windows-targets 0.48.5", 2611 + ] 2612 + 2613 + [[package]] 2614 + name = "windows-sys" 2615 + version = "0.52.0" 2616 + source = "registry+https://github.com/rust-lang/crates.io-index" 2617 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2618 + dependencies = [ 2619 + "windows-targets 0.52.6", 2620 + ] 2621 + 2622 + [[package]] 2623 + name = "windows-sys" 2624 + version = "0.59.0" 2625 + source = "registry+https://github.com/rust-lang/crates.io-index" 2626 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2627 + dependencies = [ 2628 + "windows-targets 0.52.6", 2629 + ] 2630 + 2631 + [[package]] 2632 + name = "windows-sys" 2633 + version = "0.60.2" 2634 + source = "registry+https://github.com/rust-lang/crates.io-index" 2635 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 2636 + dependencies = [ 2637 + "windows-targets 0.53.4", 2638 + ] 2639 + 2640 + [[package]] 2641 + name = "windows-sys" 2642 + version = "0.61.1" 2643 + source = "registry+https://github.com/rust-lang/crates.io-index" 2644 + checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" 2645 + dependencies = [ 2646 + "windows-link 0.2.0", 2647 + ] 2648 + 2649 + [[package]] 2650 + name = "windows-targets" 2651 + version = "0.48.5" 2652 + source = "registry+https://github.com/rust-lang/crates.io-index" 2653 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2654 + dependencies = [ 2655 + "windows_aarch64_gnullvm 0.48.5", 2656 + "windows_aarch64_msvc 0.48.5", 2657 + "windows_i686_gnu 0.48.5", 2658 + "windows_i686_msvc 0.48.5", 2659 + "windows_x86_64_gnu 0.48.5", 2660 + "windows_x86_64_gnullvm 0.48.5", 2661 + "windows_x86_64_msvc 0.48.5", 2662 + ] 2663 + 2664 + [[package]] 2665 + name = "windows-targets" 2666 + version = "0.52.6" 2667 + source = "registry+https://github.com/rust-lang/crates.io-index" 2668 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2669 + dependencies = [ 2670 + "windows_aarch64_gnullvm 0.52.6", 2671 + "windows_aarch64_msvc 0.52.6", 2672 + "windows_i686_gnu 0.52.6", 2673 + "windows_i686_gnullvm 0.52.6", 2674 + "windows_i686_msvc 0.52.6", 2675 + "windows_x86_64_gnu 0.52.6", 2676 + "windows_x86_64_gnullvm 0.52.6", 2677 + "windows_x86_64_msvc 0.52.6", 2678 + ] 2679 + 2680 + [[package]] 2681 + name = "windows-targets" 2682 + version = "0.53.4" 2683 + source = "registry+https://github.com/rust-lang/crates.io-index" 2684 + checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" 2685 + dependencies = [ 2686 + "windows-link 0.2.0", 2687 + "windows_aarch64_gnullvm 0.53.0", 2688 + "windows_aarch64_msvc 0.53.0", 2689 + "windows_i686_gnu 0.53.0", 2690 + "windows_i686_gnullvm 0.53.0", 2691 + "windows_i686_msvc 0.53.0", 2692 + "windows_x86_64_gnu 0.53.0", 2693 + "windows_x86_64_gnullvm 0.53.0", 2694 + "windows_x86_64_msvc 0.53.0", 2695 + ] 2696 + 2697 + [[package]] 2698 + name = "windows_aarch64_gnullvm" 2699 + version = "0.48.5" 2700 + source = "registry+https://github.com/rust-lang/crates.io-index" 2701 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2702 + 2703 + [[package]] 2704 + name = "windows_aarch64_gnullvm" 2705 + version = "0.52.6" 2706 + source = "registry+https://github.com/rust-lang/crates.io-index" 2707 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2708 + 2709 + [[package]] 2710 + name = "windows_aarch64_gnullvm" 2711 + version = "0.53.0" 2712 + source = "registry+https://github.com/rust-lang/crates.io-index" 2713 + checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2714 + 2715 + [[package]] 2716 + name = "windows_aarch64_msvc" 2717 + version = "0.48.5" 2718 + source = "registry+https://github.com/rust-lang/crates.io-index" 2719 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2720 + 2721 + [[package]] 2722 + name = "windows_aarch64_msvc" 2723 + version = "0.52.6" 2724 + source = "registry+https://github.com/rust-lang/crates.io-index" 2725 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2726 + 2727 + [[package]] 2728 + name = "windows_aarch64_msvc" 2729 + version = "0.53.0" 2730 + source = "registry+https://github.com/rust-lang/crates.io-index" 2731 + checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2732 + 2733 + [[package]] 2734 + name = "windows_i686_gnu" 2735 + version = "0.48.5" 2736 + source = "registry+https://github.com/rust-lang/crates.io-index" 2737 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2738 + 2739 + [[package]] 2740 + name = "windows_i686_gnu" 2741 + version = "0.52.6" 2742 + source = "registry+https://github.com/rust-lang/crates.io-index" 2743 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2744 + 2745 + [[package]] 2746 + name = "windows_i686_gnu" 2747 + version = "0.53.0" 2748 + source = "registry+https://github.com/rust-lang/crates.io-index" 2749 + checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2750 + 2751 + [[package]] 2752 + name = "windows_i686_gnullvm" 2753 + version = "0.52.6" 2754 + source = "registry+https://github.com/rust-lang/crates.io-index" 2755 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2756 + 2757 + [[package]] 2758 + name = "windows_i686_gnullvm" 2759 + version = "0.53.0" 2760 + source = "registry+https://github.com/rust-lang/crates.io-index" 2761 + checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2762 + 2763 + [[package]] 2764 + name = "windows_i686_msvc" 2765 + version = "0.48.5" 2766 + source = "registry+https://github.com/rust-lang/crates.io-index" 2767 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2768 + 2769 + [[package]] 2770 + name = "windows_i686_msvc" 2771 + version = "0.52.6" 2772 + source = "registry+https://github.com/rust-lang/crates.io-index" 2773 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2774 + 2775 + [[package]] 2776 + name = "windows_i686_msvc" 2777 + version = "0.53.0" 2778 + source = "registry+https://github.com/rust-lang/crates.io-index" 2779 + checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 2780 + 2781 + [[package]] 2782 + name = "windows_x86_64_gnu" 2783 + version = "0.48.5" 2784 + source = "registry+https://github.com/rust-lang/crates.io-index" 2785 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2786 + 2787 + [[package]] 2788 + name = "windows_x86_64_gnu" 2789 + version = "0.52.6" 2790 + source = "registry+https://github.com/rust-lang/crates.io-index" 2791 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2792 + 2793 + [[package]] 2794 + name = "windows_x86_64_gnu" 2795 + version = "0.53.0" 2796 + source = "registry+https://github.com/rust-lang/crates.io-index" 2797 + checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 2798 + 2799 + [[package]] 2800 + name = "windows_x86_64_gnullvm" 2801 + version = "0.48.5" 2802 + source = "registry+https://github.com/rust-lang/crates.io-index" 2803 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2804 + 2805 + [[package]] 2806 + name = "windows_x86_64_gnullvm" 2807 + version = "0.52.6" 2808 + source = "registry+https://github.com/rust-lang/crates.io-index" 2809 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2810 + 2811 + [[package]] 2812 + name = "windows_x86_64_gnullvm" 2813 + version = "0.53.0" 2814 + source = "registry+https://github.com/rust-lang/crates.io-index" 2815 + checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 2816 + 2817 + [[package]] 2818 + name = "windows_x86_64_msvc" 2819 + version = "0.48.5" 2820 + source = "registry+https://github.com/rust-lang/crates.io-index" 2821 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2822 + 2823 + [[package]] 2824 + name = "windows_x86_64_msvc" 2825 + version = "0.52.6" 2826 + source = "registry+https://github.com/rust-lang/crates.io-index" 2827 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2828 + 2829 + [[package]] 2830 + name = "windows_x86_64_msvc" 2831 + version = "0.53.0" 2832 + source = "registry+https://github.com/rust-lang/crates.io-index" 2833 + checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 2834 + 2835 + [[package]] 2836 + name = "winnow" 2837 + version = "0.7.13" 2838 + source = "registry+https://github.com/rust-lang/crates.io-index" 2839 + checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 2840 + dependencies = [ 2841 + "memchr", 2842 + ] 2843 + 2844 + [[package]] 2845 + name = "wit-bindgen" 2846 + version = "0.46.0" 2847 + source = "registry+https://github.com/rust-lang/crates.io-index" 2848 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 2849 + 2850 + [[package]] 2851 + name = "writeable" 2852 + version = "0.6.1" 2853 + source = "registry+https://github.com/rust-lang/crates.io-index" 2854 + checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 2855 + 2856 + [[package]] 2857 + name = "yoke" 2858 + version = "0.8.0" 2859 + source = "registry+https://github.com/rust-lang/crates.io-index" 2860 + checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 2861 + dependencies = [ 2862 + "serde", 2863 + "stable_deref_trait", 2864 + "yoke-derive", 2865 + "zerofrom", 2866 + ] 2867 + 2868 + [[package]] 2869 + name = "yoke-derive" 2870 + version = "0.8.0" 2871 + source = "registry+https://github.com/rust-lang/crates.io-index" 2872 + checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 2873 + dependencies = [ 2874 + "proc-macro2", 2875 + "quote", 2876 + "syn 2.0.106", 2877 + "synstructure", 2878 + ] 2879 + 2880 + [[package]] 2881 + name = "zerocopy" 2882 + version = "0.8.27" 2883 + source = "registry+https://github.com/rust-lang/crates.io-index" 2884 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 2885 + dependencies = [ 2886 + "zerocopy-derive", 2887 + ] 2888 + 2889 + [[package]] 2890 + name = "zerocopy-derive" 2891 + version = "0.8.27" 2892 + source = "registry+https://github.com/rust-lang/crates.io-index" 2893 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 2894 + dependencies = [ 2895 + "proc-macro2", 2896 + "quote", 2897 + "syn 2.0.106", 2898 + ] 2899 + 2900 + [[package]] 2901 + name = "zerofrom" 2902 + version = "0.1.6" 2903 + source = "registry+https://github.com/rust-lang/crates.io-index" 2904 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2905 + dependencies = [ 2906 + "zerofrom-derive", 2907 + ] 2908 + 2909 + [[package]] 2910 + name = "zerofrom-derive" 2911 + version = "0.1.6" 2912 + source = "registry+https://github.com/rust-lang/crates.io-index" 2913 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2914 + dependencies = [ 2915 + "proc-macro2", 2916 + "quote", 2917 + "syn 2.0.106", 2918 + "synstructure", 2919 + ] 2920 + 2921 + [[package]] 2922 + name = "zeroize" 2923 + version = "1.8.2" 2924 + source = "registry+https://github.com/rust-lang/crates.io-index" 2925 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 2926 + dependencies = [ 2927 + "zeroize_derive", 2928 + ] 2929 + 2930 + [[package]] 2931 + name = "zeroize_derive" 2932 + version = "1.4.2" 2933 + source = "registry+https://github.com/rust-lang/crates.io-index" 2934 + checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" 2935 + dependencies = [ 2936 + "proc-macro2", 2937 + "quote", 2938 + "syn 2.0.106", 2939 + ] 2940 + 2941 + [[package]] 2942 + name = "zerotrie" 2943 + version = "0.2.2" 2944 + source = "registry+https://github.com/rust-lang/crates.io-index" 2945 + checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 2946 + dependencies = [ 2947 + "displaydoc", 2948 + "yoke", 2949 + "zerofrom", 2950 + ] 2951 + 2952 + [[package]] 2953 + name = "zerovec" 2954 + version = "0.11.4" 2955 + source = "registry+https://github.com/rust-lang/crates.io-index" 2956 + checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 2957 + dependencies = [ 2958 + "yoke", 2959 + "zerofrom", 2960 + "zerovec-derive", 2961 + ] 2962 + 2963 + [[package]] 2964 + name = "zerovec-derive" 2965 + version = "0.11.1" 2966 + source = "registry+https://github.com/rust-lang/crates.io-index" 2967 + checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 2968 + dependencies = [ 2969 + "proc-macro2", 2970 + "quote", 2971 + "syn 2.0.106", 2972 + ]
+2 -3
Cargo.toml
··· 41 41 42 42 # Storage 43 43 dirs = "5.0" 44 - keyring = "3.0" 44 + keyring = { version = "3.6", features = ["sync-secret-service", "vendored"] } 45 45 46 46 # Error Handling 47 47 anyhow = "1.0" 48 48 thiserror = "2.0" 49 49 50 50 # Utilities 51 - chrono = "0.4" 51 + chrono = { version = "0.4", features = ["serde"] } 52 52 url = "2.5" 53 53 base64 = "0.22" 54 54 regex = "1.10" ··· 58 58 tempfile = "3.10" 59 59 assert_cmd = "2.0" 60 60 predicates = "3.1" 61 -
+121 -9
crates/tangled-api/src/client.rs
··· 1 - use anyhow::{bail, Result}; 2 - use serde::{Deserialize, Serialize}; 1 + use anyhow::{anyhow, Result}; 2 + use serde::{de::DeserializeOwned, Deserialize, Serialize}; 3 3 use tangled_config::session::Session; 4 4 5 5 #[derive(Clone, Debug)] ··· 16 16 Self::new("https://tangled.org") 17 17 } 18 18 19 - pub async fn login_with_password(&self, _handle: &str, _password: &str, _pds: &str) -> Result<Session> { 20 - // TODO: implement via com.atproto.server.createSession 21 - bail!("login_with_password not implemented") 19 + fn xrpc_url(&self, method: &str) -> String { 20 + format!( 21 + "{}/xrpc/{}", 22 + self.base_url.trim_end_matches('/'), 23 + method 24 + ) 25 + } 26 + 27 + async fn post_json<TReq: Serialize, TRes: DeserializeOwned>( 28 + &self, 29 + method: &str, 30 + req: &TReq, 31 + bearer: Option<&str>, 32 + ) -> Result<TRes> { 33 + let url = self.xrpc_url(method); 34 + let client = reqwest::Client::new(); 35 + let mut reqb = client 36 + .post(url) 37 + .header(reqwest::header::CONTENT_TYPE, "application/json"); 38 + if let Some(token) = bearer { 39 + reqb = reqb.header( 40 + reqwest::header::AUTHORIZATION, 41 + format!("Bearer {}", token), 42 + ); 43 + } 44 + let res = reqb.json(req).send().await?; 45 + let status = res.status(); 46 + if !status.is_success() { 47 + let body = res.text().await.unwrap_or_default(); 48 + return Err(anyhow!("{}: {}", status, body)); 49 + } 50 + Ok(res.json::<TRes>().await?) 22 51 } 23 52 24 - pub async fn list_repos(&self, _user: Option<&str>, _knot: Option<&str>, _starred: bool) -> Result<Vec<Repository>> { 25 - // TODO: implement XRPC sh.tangled.repo.list 26 - Ok(vec![]) 53 + async fn get_json<TRes: DeserializeOwned>( 54 + &self, 55 + method: &str, 56 + params: &[(&str, String)], 57 + bearer: Option<&str>, 58 + ) -> Result<TRes> { 59 + let url = self.xrpc_url(method); 60 + let client = reqwest::Client::new(); 61 + let mut reqb = client.get(url).query(&params); 62 + if let Some(token) = bearer { 63 + reqb = reqb.header( 64 + reqwest::header::AUTHORIZATION, 65 + format!("Bearer {}", token), 66 + ); 67 + } 68 + let res = reqb.send().await?; 69 + let status = res.status(); 70 + if !status.is_success() { 71 + let body = res.text().await.unwrap_or_default(); 72 + return Err(anyhow!("{}: {}", status, body)); 73 + } 74 + Ok(res.json::<TRes>().await?) 75 + } 76 + 77 + pub async fn login_with_password( 78 + &self, 79 + handle: &str, 80 + password: &str, 81 + _pds: &str, 82 + ) -> Result<Session> { 83 + #[derive(Serialize)] 84 + struct Req<'a> { 85 + #[serde(rename = "identifier")] 86 + identifier: &'a str, 87 + #[serde(rename = "password")] 88 + password: &'a str, 89 + } 90 + #[derive(Deserialize)] 91 + struct Res { 92 + #[serde(rename = "accessJwt")] 93 + access_jwt: String, 94 + #[serde(rename = "refreshJwt")] 95 + refresh_jwt: String, 96 + did: String, 97 + handle: String, 98 + } 99 + let body = Req { 100 + identifier: handle, 101 + password, 102 + }; 103 + let res: Res = self 104 + .post_json("com.atproto.server.createSession", &body, None) 105 + .await?; 106 + Ok(Session { 107 + access_jwt: res.access_jwt, 108 + refresh_jwt: res.refresh_jwt, 109 + did: res.did, 110 + handle: res.handle, 111 + ..Default::default() 112 + }) 113 + } 114 + 115 + pub async fn list_repos( 116 + &self, 117 + user: Option<&str>, 118 + knot: Option<&str>, 119 + starred: bool, 120 + bearer: Option<&str>, 121 + ) -> Result<Vec<Repository>> { 122 + #[derive(Deserialize)] 123 + struct Envelope { 124 + repos: Vec<Repository>, 125 + } 126 + let mut q = vec![]; 127 + if let Some(u) = user { 128 + q.push(("user", u.to_string())); 129 + } 130 + if let Some(k) = knot { 131 + q.push(("knot", k.to_string())); 132 + } 133 + if starred { 134 + q.push(("starred", true.to_string())); 135 + } 136 + let env: Envelope = self 137 + .get_json("sh.tangled.repo.list", &q, bearer) 138 + .await?; 139 + Ok(env.repos) 27 140 } 28 141 } 29 142 ··· 36 149 pub description: Option<String>, 37 150 pub private: bool, 38 151 } 39 -
+6 -1
crates/tangled-cli/src/cli.rs
··· 40 40 #[derive(Subcommand, Debug, Clone)] 41 41 pub enum Command { 42 42 /// Authentication commands 43 + #[command(subcommand)] 43 44 Auth(AuthCommand), 44 45 /// Repository commands 46 + #[command(subcommand)] 45 47 Repo(RepoCommand), 46 48 /// Issue commands 49 + #[command(subcommand)] 47 50 Issue(IssueCommand), 48 51 /// Pull request commands 52 + #[command(subcommand)] 49 53 Pr(PrCommand), 50 54 /// Knot management commands 55 + #[command(subcommand)] 51 56 Knot(KnotCommand), 52 57 /// Spindle integration commands 58 + #[command(subcommand)] 53 59 Spindle(SpindleCommand), 54 60 } 55 61 ··· 365 371 #[arg(long)] 366 372 pub lines: Option<usize>, 367 373 } 368 -
+19 -16
crates/tangled-cli/src/commands/auth.rs
··· 1 1 use anyhow::Result; 2 2 use dialoguer::{Input, Password}; 3 + use tangled_config::session::SessionManager; 3 4 4 5 use crate::cli::{AuthCommand, AuthLoginArgs, Cli}; 5 6 ··· 22 23 }; 23 24 let pds = args.pds.unwrap_or_else(|| "https://bsky.social".to_string()); 24 25 25 - // Placeholder: integrate tangled_api authentication here 26 - println!( 27 - "Logging in as '{}' against PDS '{}'... (stub)", 28 - handle, pds 29 - ); 30 - 31 - // Example future flow: 32 - // let client = tangled_api::TangledClient::new(&pds); 33 - // let session = client.login(&handle, &password).await?; 34 - // tangled_config::session::SessionManager::default().save(&session)?; 35 - 26 + let client = tangled_api::TangledClient::new(&pds); 27 + let session = client 28 + .login_with_password(&handle, &password, &pds) 29 + .await?; 30 + SessionManager::default().save(&session)?; 31 + println!("Logged in as '{}' ({})", session.handle, session.did); 36 32 Ok(()) 37 33 } 38 34 39 35 async fn status(_cli: &Cli) -> Result<()> { 40 - // Placeholder: read session from keyring/config 41 - println!("Authentication status: (stub) not implemented"); 36 + let mgr = SessionManager::default(); 37 + match mgr.load()? { 38 + Some(s) => println!("Logged in as '{}' ({})", s.handle, s.did), 39 + None => println!("Not logged in. Run: tangled auth login"), 40 + } 42 41 Ok(()) 43 42 } 44 43 45 44 async fn logout(_cli: &Cli) -> Result<()> { 46 - // Placeholder: remove session from keyring/config 47 - println!("Logged out (stub)"); 45 + let mgr = SessionManager::default(); 46 + if mgr.load()?.is_some() { 47 + mgr.clear()?; 48 + println!("Logged out"); 49 + } else { 50 + println!("No session found"); 51 + } 48 52 Ok(()) 49 53 } 50 -
+7 -8
crates/tangled-cli/src/commands/mod.rs
··· 11 11 use crate::cli::{Cli, Command}; 12 12 13 13 pub async fn dispatch(cli: Cli) -> Result<()> { 14 - match cli.command { 15 - Command::Auth(cmd) => auth::run(&cli, cmd).await, 16 - Command::Repo(cmd) => repo::run(&cli, cmd).await, 17 - Command::Issue(cmd) => issue::run(&cli, cmd).await, 18 - Command::Pr(cmd) => pr::run(&cli, cmd).await, 19 - Command::Knot(cmd) => knot::run(&cli, cmd).await, 20 - Command::Spindle(cmd) => spindle::run(&cli, cmd).await, 14 + match &cli.command { 15 + Command::Auth(cmd) => auth::run(&cli, cmd.clone()).await, 16 + Command::Repo(cmd) => repo::run(&cli, cmd.clone()).await, 17 + Command::Issue(cmd) => issue::run(&cli, cmd.clone()).await, 18 + Command::Pr(cmd) => pr::run(&cli, cmd.clone()).await, 19 + Command::Knot(cmd) => knot::run(&cli, cmd.clone()).await, 20 + Command::Spindle(cmd) => spindle::run(&cli, cmd.clone()).await, 21 21 } 22 22 } 23 23 ··· 25 25 eprintln!("{} {}", "[todo]".yellow().bold(), feature); 26 26 Ok(()) 27 27 } 28 -
+1 -2
crates/tangled-config/src/keychain.rs
··· 24 24 } 25 25 26 26 pub fn delete_password(&self) -> Result<()> { 27 - self.entry()?.delete_password().map_err(|e| anyhow!("keyring error: {e}")) 27 + self.entry()?.delete_credential().map_err(|e| anyhow!("keyring error: {e}")) 28 28 } 29 29 } 30 -