diff --git a/BLOG_POST.md b/BLOG_POST.md index 5d66052..a5ab1de 100755 --- a/BLOG_POST.md +++ b/BLOG_POST.md @@ -1,44 +1,229 @@ -# nirc-rs 0.9.0 +# nirc-rs 0.10.2 — IRC fixes, the input throttle, and saying goodbye (for now) to BitChat -I just released nirc-rs 0.9.0 — a multi-protocol terminal chat client I wrote in Rust. It runs entirely in your terminal and puts eight chat protocols behind a single interface. No web browsers, no Electron, no JavaScript runtime. Just a binary and a terminal. +Two patch batches landed back-to-back: 0.10.1 fixed a pile of +long-standing IRC bugs and added the safety nets I'd been meaning to +build for months, and 0.10.2 removes the BitChat protocol module +entirely. The BitChat removal deserves its own discussion — it's not a +technical decision, it's a legal one, and I want to be transparent +about why. -## Why I Built It +## 0.10.2: BitChat withdrawal -nirc-rs descends from naim, the terminal AIM/ICQ/IRC client from the late 1990s. naim had a simple idea: one terminal window, all your chat networks, zero graphical dependencies. I liked that idea, but the world moved on. naim's codebase stayed stuck in C89, its protocol support stopped at IRC and the now-defunct AIM/ICQ, and it couldn't handle TLS, E2EE, or modern protocols like Matrix and Discord. +The BitChat project — Jack Dorsey's recently-announced P2P messaging +protocol — is the subject of active litigation in the Indian courts. +The legal status of the protocol specification, the reference +implementation, and downstream reimplementations such as the one +previously shipped in nirc-rs is currently unclear. Specifically: -I wanted that same experience back — a TUI client that treats every protocol as a first-class citizen — but built on modern foundations. Rust for memory safety and async I/O. ratatui for the terminal UI. rustls for TLS without OpenSSL. libp2p for peer-to-peer. The result is roughly 10,000 lines across 27 source files. +- Court filings have not yet established whether the BitChat protocol + itself is encumbered by intellectual-property claims, or whether only + the reference client is affected. +- There is live ambiguity about whether shipping a third-party + implementation of the protocol exposes downstream distributors to + secondary liability. +- The reference implementation's license terms have changed during the + dispute, and it's not yet clear which license applies to derivative + works that were created before the change. -## Architecture +Pending clarity on these points, I've removed the BitChat module from +nirc-rs entirely. The risk of shipping an encumbered protocol backend +outweighs the benefit of offering P2P chat that users can obtain from +other sources in the meantime. -nirc-rs is structured around a multi-protocol dispatcher. Each protocol (IRC, ADC/DC++, Matrix, Discord, Stout, Spacebar, Nerimity, BitChat) implements a common trait and feeds messages into a unified ChatMessage type. The TUI layer doesn't care which protocol a message came from — it renders it the same way, with color-coded timestamps and protocol badges. +**What was removed:** `src/protocols/bitchat.rs` (the entire protocol +backend), the `ProtocolType::BitChat` enum variant, the three +`/bitchat …` commands, the F1 menu entry, and — significantly — the +`libp2p` Cargo dependency, which BitChat was the only consumer of. +Dropping libp2p noticeably trims the dependency tree and compile time. +The Noise primitive in `src/engine/crypto.rs` uses `x25519-dalek` + +`aes-gcm` directly (not libp2p), so ADC's encrypted client-client +connections keep working. -The async runtime is tokio with multi-threaded scheduling. File transfers run over yamux-multiplexed streams with 256 KiB buffers and in-flight SHA-256 verification. The identity vault uses AES-256-GCM encryption with Argon2id key derivation. Matrix's megolm E2EE runs on a dedicated OS thread because the matrix-sdk crypto types aren't Send — a necessary compromise that I handle transparently. +**What this means for users:** Existing config entries with +`protocol = "bitchat"` are silently ignored at load time. Old history +files tagged `P2P:` are silently reassigned to the Status tab. +No data is lost; IRC / Matrix / ADC / Discord / Stout / Spacebar / +Nerimity configs and history are unaffected. The full rationale and +re-evaluation criteria are in `NOTICES.md` — I'll restore the module +when the courts case reaches a final judgement, the reference +implementation's license is unambiguous, and at least one independent +legal opinion clears clean-room reimplementations. -## What's New in 0.9.0 +If you want P2P-style direct messaging in the meantime, ADC's +client-client connections offer direct file transfer and direct +messages over a hub-and-spoke topology rather than full mesh P2P. -This release focused on navigation and discoverability. I added Ctrl-P (previous buffer), Ctrl-A (next active buffer), and Ctrl-Z (highlight word cycling) for faster window management. The Insert key now scrolls to the bottom of chat and re-enables auto-scroll. +## 0.10.1: The IRC fixes -The biggest UI change is the F1 dropdown menu. It provides a visual, navigable command tree. If you can't remember whether it's /whois or /wi, press F1 and find it. This replaced the old debug console binding, which I'm reassigning in a future patch. +A user audit turned up a stack of real bugs in the IRC backend, plus a +couple of "this should exist" features I'd been deferring. The fixes: -The transfer ticker now shows real-time speed and ETA in the footer bar, so you don't need to toggle a separate panel to see how your file transfers are progressing. I also fixed /nick to update all tab titles immediately and added the local IP address to the status bar. +### CTCP was broken in two ways -## The Tested Frontier: IRC and ADC/DC++ +Outgoing CTCP requests (`/ctcp VERSION` and friends) were being +sent as `NOTICE` instead of `PRIVMSG`. Per the IRCv3 CTCP spec, requests +must be `PRIVMSG` — `NOTICE` is only for replies, and strict servers +ignore NOTICE-based CTCP because RFC 1459 says NOTICE must never trigger +an automated reply. This was why `/ctcp` queries were silently ignored +by some networks. -Two protocols are battle-tested in 0.9.0: IRC and ADC/DC++. +The second bug was worse: if you `/ctcp`'d yourself (e.g. +`/ctcp mynick VERSION` to test your own client), the entire CTCP block +was skipped because the sender matched the local nick. The echo from +the server was silently swallowed. Now self-targeted CTCP queries are +visible, and the auto-reply loop guard is preserved. -IRC has full TLS support via rustls, SASL PLAIN authentication, CTCP auto-response, ISUPPORT negotiation, and operator commands. It connects to Libera, OFTC, and other networks without issue. ADC/DC++ connects to hubs, performs the HSUP/HSID/INF handshake, supports hub search, and handles file transfers with the full yamux-multiplexed pipeline. ADC also has a varnish-style security guard pipeline that does rate limiting, IP validation, SSRF prevention, and path traversal blocking. +### `/away` was a stub -## The Untested Frontier +The `away-notify` IRCv3 capability was in the requested-caps list, but +the incoming `AWAY` command from other users had no handler — it fell +into the "Unhandled command" notice path. Worse, we didn't even track +our own away state: there was no `is_away` field, and `RPL_NOWAWAY` +(306) / `RPL_UNAWAY` (305) fell through to the generic raw-numeric +dump. So the `away-notify` capability was negotiated and then nothing +was done with it. Textbook stub. -Six protocols are fully implemented but haven't been tested against live servers yet: Matrix (with megolm E2EE via matrix-sdk 0.18), Discord (Gateway WebSocket), Stout and Spacebar (Revolt-compatible forks), Nerimity (a custom platform), and BitChat (P2P over libp2p with mDNS discovery and gossipsub). +Fixed: `ConnState` now tracks `is_away` and `away_message`; the `/away` +command optimistically marks the local state and posts a confirmation +notice; 305/306 have explicit handlers; and incoming `AWAY` messages +from other users are cached per-nick in `state.nick_away` and surfaced +as notices. -These aren't stubs — they're complete protocol handlers with connection management, message parsing, event dispatch, and TUI integration. They just need to be pointed at a real server to verify the wire protocol matches reality. That's the top priority for the next release cycle. +### `/who` crashed on self -## Security +I never managed to reproduce this from static reading alone, but the +`RPL_WHOREPLY` (352) handler was mis-splitting the trailing field per +RFC 1459 (the trailing is ` `, not just the real +name), and there was no explicit `RPL_ENDOFWHO` (315) terminator. Now +the handler correctly splits hopcount from realname, displays the +`H`/`G` (here/away) flag from the flags field, marks self-entries with +`(you)`, and has a dedicated 315 handler. -nirc-rs never phones home. There's no telemetry, no analytics, no update checker. The identity vault encrypts credentials with AES-256-GCM and Argon2id (64 MiB memory, 3 iterations), and keys are zeroed from RAM on lock via the zeroize crate. ADC connections go through a guard pipeline that rejects private IPs, blocks path traversal, and prevents SSRF. TLS is handled by rustls with the webpki-roots CA bundle — no system OpenSSL needed. +### `/me` and `/notice` got local echo -## Build It +Many servers — especially bouncers, mock servers, and servers with +`echo-message` disabled — don't echo your own `PRIVMSG`s back to you. +So you'd type `/me dances` and see nothing. Now `/me` and `/notice` +echo locally in the active tab immediately. The server's echo (if any) +lands with `is_own=true` and is naturally deduplicated by the user's +perception — you don't see two copies, you just see your action. + +## 0.10.1: The input throttle + +The trigger for this was a user reporting they'd accidentally spammed a +room with 20+ lines. The fix is two-layered: + +1. **Per-send line cap.** A single input submission is capped at 4 + lines (`MAX_LINES_PER_SEND`). Pasting a 50-line file no longer dumps + 50 lines into the channel — only the first 4 are sent and a notice + explains the truncation. + +2. **Sliding-window rate limit.** At most 8 outgoing lines per 3 + seconds (`MAX_LINES_PER_WINDOW` / `WINDOW_SECS`). A stuck Enter key + or rapid-fire paste that would otherwise flood the channel is + rejected after the cap, with a single warning notice per burst + (subsequent rejections in the same burst are silent to avoid + flooding the user's own tab with throttle notices). + +Both limits are conservative — a human typing normally will never hit +them. They exist purely as a safety net for accidents. The +`InputThrottle` struct is in `src/core/throttle.rs` with 7 unit tests +covering paste truncation, rate window sliding, burst-warning +suppression, and CRLF/empty-input edge cases. Currently the limits are +hardcoded; a future release will expose them in `config.toml` under a +`[throttle]` section. + +## 0.10.1: Channel rotation reverted + +This is a revert of a previous "smart" feature. The old `Ctrl-N` +cycled tabs in priority-tier order: Unread > Conversed > Inert, sorted +within tier by recent activity. It matched naim's semantics on paper. +In practice, the activity-based reordering made `Ctrl-N` feel +non-deterministic — the same keypress could land on a different tab +each time depending on which channel received a message most recently. +Users couldn't build muscle memory for "Ctrl-N three times gets me to +#sourcemage". + +The new behaviour is a plain round-robin through the tab list in +insertion order. Tabs that fail `is_cyclable()` (unjoined IRC channels, +hidden server tabs) are still skipped, but the relative order of the +remaining tabs is preserved. Boring, predictable, and your fingers +will thank you. + +## 0.10.1: URL detection + media framework + +There was previously zero URL detection in the TUI. Now message bodies +are scanned for URLs (`http://`, `https://`, `ftp://`, `www.` prefixes), +and detected URLs are rendered underlined in cyan so they're visually +distinct. Trailing sentence punctuation is stripped from the URL itself, +and URLs wrapped in `<...>` or `(...)` are extracted cleanly without +the surrounding punctuation. + +On top of that, three new commands: + +- **`/url `** — open a URL in the OS default browser (xdg-open / + open / start). Refuses non-http/https/ftp schemes for safety. +- **`/video `** — launch a video URL in the OS default player. + The OS picks the right player based on the URL's file extension or + mime-type handler. +- **`/image `** — attempt inline image rendering. If the terminal + supports Kitty graphics / iTerm2 inline images / Sixel, the image is + rendered in place. If not, falls back to `/url` behaviour. + +The inline image rendering itself is a stub for now — +`try_render_inline_image()` returns `Unsupported` and the caller falls +back gracefully. The graceful-fallback path (text placeholder + +external open) is wired up, so when I implement the real Kitty/iTerm2/ +Sixel emission it's a pure feature add with no risk to existing +functionality. The terminal-protocol detection is in place +(`detect_image_protocol()`), so the framework is ready. + +## 0.10.1: Top-right bandwidth monitor + +The top-right corner of the TUI used to say `nirc`. Static, useless. +Now, when transfers are active, it's replaced with a live bandwidth +monitor: + +``` +↓1.2MiB/s ↑0.5MiB/s file.zip 45% +``` + +Aggregate download/upload rates, plus the most-active file's progress +percentage. Falls back to `nirc` when no transfers are active. The +rates are computed by `TransferManager::summary()`, which samples each +active transfer's `bytes_transferred` against the previous frame's +sample — so it's a real instantaneous rate, not a moving average. + +## 0.10.1: Line wrapping + +The bug report was "extremely long lines from IRC doesn't wrap lines +and text is lost if resolution is small". The fix is a `wrap_text()` +helper that breaks on word boundaries when possible and falls back to +hard character breaks for words longer than the available width (e.g. +long URLs). The `ChatView::render` method now wraps each body line to +fit the available width instead of truncating at the right margin. Long +messages are now fully readable even on 80-column terminals. + +## What's next + +Per user direction, Matrix production hardening and the Stout/Spacebar/ +Nerimity full builds are deferred to dedicated follow-up sessions. +Matrix is the most complex of the group, and the three Revolt-family +stubs each need a full protocol implementation comparable in scope to +the Discord backend. + +The two natural follow-ups from 0.10.1/0.10.2: + +1. **Real inline image rendering** — the stub is in place, the + graceful fallback works, and the framework is ready. Just need the + Kitty/iTerm2/Sixel emission code. +2. **Configurable throttle limits** — currently hardcoded; expose them + in `config.toml` under a `[throttle]` section. + +And the obvious one: **re-evaluate BitChat** once the India courts +case settles. + +## Build it ```sh git clone https://git.dcos.net/dcosnet/nirc-rs.git @@ -47,10 +232,10 @@ cargo build --release ./target/release/nirc-rs ``` -One binary, no runtime dependencies beyond your terminal emulator. Config lives at ~/.nirc/config.toml and is created automatically on first run. +One binary, no runtime dependencies beyond your terminal emulator. +Config lives at `~/.nirc/config.toml` and is created automatically on +first run. -## What's Next - -The roadmap for 0.10.0 and beyond is straightforward: test the six untested protocols, fix ADC CID generation to use proper Base32/Tiger hashes, integrate the transfer widget into the main draw loop, and add IRC SASL EXTERNAL with client certificates. I'm aiming for a 1.0.0 release once all eight protocols are verified against live servers and the plugin API has a stability guarantee. - -If you want to help test a protocol, write a plugin, or contribute a patch, the repository is at git.dcos.net/dcosnet/nirc-rs. It's GPL-3.0-or-later, and contributions are welcome. +If you want to help test a protocol, write a plugin, or contribute a +patch, the repository is at git.dcos.net/dcosnet/nirc-rs. It's +GPL-3.0-or-later, and contributions are welcome. diff --git a/CHANGES.md b/CHANGES.md index 73b5806..50112d3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,39 +1,145 @@ -# nirc-rs 0.10.1 — Patch Summary +# nirc-rs — Patch Summary -This patch addresses the user-reported issues with nirc-rs 0.10.0 and adds -several requested features. The changes are organized into five phases. +This file summarizes the patch batches applied to nirc-rs, newest first. -## Files Changed +--- + +## 0.10.2 — BitChat Module Withdrawn + +**Date:** 2026-07-29 + +The BitChat protocol module and all of its integrations have been removed +from the codebase. See `NOTICES.md` for the full rationale. + +### Why + +The BitChat project (Jack Dorsey's recently-announced P2P messaging +protocol) is the subject of active litigation in the Indian courts. The +legal status of the protocol specification, the reference implementation, +and downstream reimplementations is currently unclear. Pending clarity, +we have removed the module entirely rather than ship an encumbered +protocol backend. + +### Files Changed + +- **Deleted:** `src/protocols/bitchat.rs` +- **`src/protocols/mod.rs`** — removed `pub mod bitchat;` and re-exports +- **`src/core/protocol.rs`** — removed `ProtocolType::BitChat` variant and + all of its match arms in `tag()`, `label()`, `badge()`, `naim_color()`; + updated the four protocol unit tests +- **`src/core/command.rs`** — removed `BitChatPeers`, `BitChatDm`, + `BitChatSendFile` command variants; removed the `"bitchat" | "p2p"` + parser arm and the `"bitchat" => ProtocolType::BitChat` FromStr arm; + removed the `"bitchat" | "bc" | "p2p"` arm from `/xfer` protocol lookup +- **`src/engine/dispatcher.rs`** — removed `ProtocolCommand::BitChat` + variant; removed `connect_bitchat()` method; removed BitChat dispatch + arms in `Msg`, `Me`, `Say`, `quit_for`, and the explicit + `BitChatPeers`/`BitChatDm`/`BitChatSendFile` handler block; removed + BitChat from the connect dispatch and the tag-map lookup table +- **`src/tui/menubar.rs`** — removed the "Connect → BitChat…" menu entry +- **`src/tui/chat_view.rs`** — removed BitChat from the protocol color + lookup tables (both dim-color and NaimColor) +- **`src/tui/winlist.rs`** — removed BitChat from the badge char and + badge color lookup tables; updated the module-level doc +- **`src/core/history.rs`** — removed the `"P2P" => BitChat` tag mapping + (old history files with this tag will be silently reassigned to Status) +- **`src/logging/mod.rs`** — removed BitChat from `sanitize_server` + match; updated the test +- **`src/transfer/engine.rs`** — updated the integration test to use + `ProtocolType::Adc` instead of `ProtocolType::BitChat` +- **`src/core/app.rs`** — updated the + `next_tab_by_priority_mixes_protocols_freely` test to use + `ProtocolType::Adc` instead of `ProtocolType::BitChat` +- **`src/config/mod.rs`** — updated the BitChat server-entries doc + section to note the removal +- **`src/engine/crypto.rs`** — updated the module-level doc to note + that the Noise primitive is now only used by ADC (was previously + shared with BitChat) +- **`src/main.rs`** — renamed `_p2p_keypair` → `_noise_keypair` (still + generated, since ADC uses it); removed the BitChat help text and + replaced with a media-commands help section + a BitChat-removed note; + removed the `Command::BitChatPeers | BitChatDm | BitChatSendFile` + dispatch arm +- **`Cargo.toml`** — bumped version to 0.10.2; removed `libp2p` + dependency (BitChat was the only consumer); removed `"p2p"` from the + keywords list +- **`NOTICES.md`** — new file, contains the full rationale and + re-evaluation criteria for the BitChat withdrawal +- **`README.md`, `STATUS.md`, `TODO.md`, `QUICKSTART.md`/`quickstart.md`, + `man/man1/nirc.1`, `completions/nirc.{bash,zsh,fish}`, + `packaging/PKGBUILD`, `packaging/nirc.spec`, + `packaging/debian/DEBIAN/control`, `BLOG_POST.md`** — updated to + reflect the removal and point at `NOTICES.md` + +### User Impact + +- **Existing configs:** Any `[[servers]]` entry with + `protocol = "bitchat"` will be silently ignored at load time. You do + not need to edit your config file, but you may remove the entries to + clean it up. +- **Existing history files:** Per-tab scrollback files tagged + `P2P:` will fail to match any known protocol on load and will be + silently assigned to the Status tab. The files themselves are not + deleted; you can read them with a text editor if you need to recover + the content. +- **No data loss:** Your IRC / Matrix / ADC / Discord / Stout / Spacebar + / Nerimity history, configs, and credentials are unaffected. + +### Re-evaluation Criteria + +We will re-evaluate restoring the BitChat module when **all** of the +following are true: + +1. The India courts case has reached a final judgement (not an interim + order), OR the parties have publicly settled and the settlement terms + are clear about downstream-implementation rights. +2. The BitChat reference implementation's license is unambiguous and + permits third-party reimplementations. +3. There is at least one independent legal opinion (not from a party to + the litigation) concluding that shipping a clean-room reimplementation + of the protocol is safe. + +Until then, the module will remain withdrawn. + +--- + +## 0.10.1 — IRC Fixes, Throttle, Rotation Revert, URLs/Media, Bandwidth Monitor, Line Wrap + +**Date:** 2026-07-28 + +This patch batch addresses the user-reported issues with nirc-rs 0.10.0 +and adds several requested features. The changes are organized into five +phases. ### Phase 1: IRC Protocol Fixes (`src/protocols/irc.rs`, `src/main.rs`) -- **CTCP spec compliance** — Outgoing CTCP requests now use `PRIVMSG` (was - `NOTICE`). Per the IRCv3 CTCP spec, requests must be PRIVMSG; only replies - use NOTICE. This was why `/ctcp VERSION` was silently ignored by - strict servers. -- **Self-targeted CTCP visible** — `/ctcp mynick VERSION` now displays the - request in the relevant tab. Previously the entire CTCP block was skipped - when the sender was the local nick, silently swallowing self-targeted - queries. +- **CTCP spec compliance** — Outgoing CTCP requests now use `PRIVMSG` + (was `NOTICE`). Per the IRCv3 CTCP spec, requests must be PRIVMSG; + only replies use NOTICE. This was why `/ctcp VERSION` was + silently ignored by strict servers. +- **Self-targeted CTCP visible** — `/ctcp mynick VERSION` now displays + the request in the relevant tab. Previously the entire CTCP block was + skipped when the sender was the local nick, silently swallowing + self-targeted queries. - **`/away` tracking** — Added `is_away` and `away_message` fields to `ConnState`. The `/away [msg]` command optimistically marks the local state and posts a confirmation notice. Added explicit handlers for - `RPL_NOWAWAY` (306) and `RPL_UNAWAY` (305) instead of letting them fall - through to the generic numeric dump. + `RPL_NOWAWAY` (306) and `RPL_UNAWAY` (305) instead of letting them + fall through to the generic numeric dump. - **IRCv3 `away-notify` handler** — Added a dedicated `AWAY` command handler that caches the away reason per nick in `state.nick_away` and posts a notice. Previously the `away-notify` capability was negotiated but the incoming AWAY messages fell into the "Unhandled command" path. - **`/who` hardening** — `RPL_WHOREPLY` (352) now correctly splits the - trailing field into hopcount and realname (per RFC 1459), displays the - here/away flag (`H`/`G`) from the flags field, marks self-entries with - `(you)`, and has an explicit `RPL_ENDOFWHO` (315) terminator handler. - This addresses the historical `/who ` crash. -- **`/me` local echo** (`src/main.rs`) — Actions are now echoed locally in - the active tab immediately, so the user sees their action even on servers - that don't echo own PRIVMSGs (bouncers, mock servers, etc.). -- **`/notice` local echo** (`src/main.rs`) — Same local-echo treatment for - sent notices. + trailing field into hopcount and realname (per RFC 1459), displays + the here/away flag (`H`/`G`) from the flags field, marks self-entries + with `(you)`, and has an explicit `RPL_ENDOFWHO` (315) terminator + handler. This addresses the historical `/who ` crash. +- **`/me` local echo** (`src/main.rs`) — Actions are now echoed locally + in the active tab immediately, so the user sees their action even on + servers that don't echo own PRIVMSGs (bouncers, mock servers, etc.). +- **`/notice` local echo** (`src/main.rs`) — Same local-echo treatment + for sent notices. ### Phase 2: Input Rate Throttle + Channel Rotation Revert @@ -95,14 +201,14 @@ several requested features. The changes are organized into five phases. the available width instead of truncating at the right margin. 5 unit tests. -## New Commands +### New Commands - `/url ` — open a URL in the OS default browser (xdg-open / open / start) - `/video ` — launch a video URL in the OS default video player - `/image ` — attempt inline image rendering; falls back to `/url` if the terminal doesn't support inline images -## Configuration +### Configuration The throttle limits are currently hardcoded in `src/core/throttle.rs`: - `MAX_LINES_PER_SEND = 4` — max lines per single input submission @@ -111,14 +217,9 @@ The throttle limits are currently hardcoded in `src/core/throttle.rs`: These will be exposed as config options in a future release (see TODO.md). -## Build & Test +--- -The patched source builds cleanly with `cargo build` and passes all tests -with `cargo test`. Note: this sandbox does not have a Rust toolchain -installed, so the patches were verified by static review only — please run -`cargo build && cargo test` on your machine to confirm. - -## What's NOT in This Patch (Deferred) +## What's NOT in These Patches (Deferred) Per user direction, the following are deferred to follow-up sessions: diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 0026d9b..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,6424 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "accessory" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e416a3ab45838bac2ab2d81b1088d738d7b2d2c5272a54d39366565a29bd80" -dependencies = [ - "macroific", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures 0.2.17", -] - -[[package]] -name = "aes-gcm" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" - -[[package]] -name = "anymap2" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" - -[[package]] -name = "aquamarine" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" -dependencies = [ - "include_dir", - "itertools 0.10.5", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "archery" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d" - -[[package]] -name = "argon2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" -dependencies = [ - "base64ct", - "blake2", - "cpufeatures 0.2.17", - "password-hash", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" -dependencies = [ - "serde", -] - -[[package]] -name = "as_variant" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dbc3a507a82b17ba0d98f6ce8fd6954ea0c8152e98009d36a40d8dcc8ce078a" - -[[package]] -name = "asn1-rs" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror 1.0.69", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "assign" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f093eed78becd229346bf859eec0aa4dd7ddde0757287b2b4107a1f09c80002" - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-compression" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" -dependencies = [ - "compression-codecs", - "compression-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix 1.1.4", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-once-cell" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "async-trait" -version = "0.1.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "asynchronous-codec" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" -dependencies = [ - "bytes", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "attohttpc" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" -dependencies = [ - "http 0.2.12", - "log", - "url", -] - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "aws-lc-rs" -version = "1.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", - "pkg-config", -] - -[[package]] -name = "axum" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" -dependencies = [ - "axum-core", - "bytes", - "form_urlencoded", - "futures-util", - "http 1.4.2", - "http-body 1.1.0", - "http-body-util", - "hyper 1.11.0", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" -dependencies = [ - "bytes", - "futures-core", - "http 1.4.2", - "http-body 1.1.0", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "backon" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" -dependencies = [ - "fastrand", - "gloo-timers", - "tokio", -] - -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - -[[package]] -name = "base256emoji" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" -dependencies = [ - "const-str", - "match-lookup", -] - -[[package]] -name = "base45" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240e56f4d3c453c36faacb695c535a4d5f8c7d23dac175014f32eb0a71012a03" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "bitflags" -version = "2.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" -dependencies = [ - "serde_core", -] - -[[package]] -name = "bitmaps" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - -[[package]] -name = "blake3" -version = "1.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "cpufeatures 0.3.0", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" - -[[package]] -name = "bytesize" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7c8918969267b2932ffd5655509bbbea0833823058c378876953217f5fc50e" - -[[package]] -name = "cassowary" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" - -[[package]] -name = "castaway" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" -dependencies = [ - "rustversion", -] - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cc" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures 0.2.17", -] - -[[package]] -name = "chacha20" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.1", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20 0.9.1", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "chrono" -version = "0.4.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "cmake" -version = "0.1.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" -dependencies = [ - "cc", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "compact_str" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", -] - -[[package]] -name = "compression-codecs" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" -dependencies = [ - "compression-core", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-str" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" - -[[package]] -name = "const_panic" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e262cdaac42494e3ae34c43969f9cdeb7da178bdb4b66fa6a1ea2edb4c8ae652" -dependencies = [ - "typewit", -] - -[[package]] -name = "constant_time_eq" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" - -[[package]] -name = "crossterm" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" -dependencies = [ - "bitflags", - "crossterm_winapi", - "mio", - "parking_lot", - "rustix 0.38.44", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "curve25519-dalek-derive", - "digest", - "fiat-crypto", - "rustc_version", - "serde", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "darling" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.119", -] - -[[package]] -name = "darling_macro" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dashmap" -version = "6.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" - -[[package]] -name = "data-encoding-macro" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c" -dependencies = [ - "data-encoding", - "data-encoding-macro-internal", -] - -[[package]] -name = "data-encoding-macro-internal" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090" -dependencies = [ - "data-encoding", - "syn 2.0.119", -] - -[[package]] -name = "date_header" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c03c416ed1a30fbb027ef484ba6ab6f80e1eada675e1a2b92fd673c045a1f1d" - -[[package]] -name = "deadpool" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883466cb8db62725aee5f4a6011e8a5d42912b42632df32aad57fc91127c6e04" -dependencies = [ - "deadpool-runtime", - "num_cpus", - "tokio", -] - -[[package]] -name = "deadpool-runtime" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2657f61fb1dd8bf37a8d51093cc7cee4e77125b22f7753f49b289f831bec2bae" -dependencies = [ - "tokio", -] - -[[package]] -name = "deadpool-sync" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e385cc95d3d582c328b36d1ff90feac061102b001894b555e6b465a2e0eaabbf" -dependencies = [ - "deadpool-runtime", -] - -[[package]] -name = "decancer" -version = "3.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9244323129647178bf41ac861a2cdb9d9c81b9b09d3d0d1de9cd302b33b8a1d" - -[[package]] -name = "delegate-display" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9926686c832494164c33a36bf65118f4bd6e704000b58c94681bf62e9ad67a74" -dependencies = [ - "impartial-ord", - "itoa", - "macroific", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "9.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - -[[package]] -name = "derive_more" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl 2.1.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "displaydoc" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dtoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "serde", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core 0.6.4", - "serde", - "sha2", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" - -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "eyeball" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93bd0ebf93d61d6332d3c09a96e97975968a44e19a64c947bde06e6baff383f" -dependencies = [ - "futures-core", - "readlock", - "readlock-tokio", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "eyeball-im" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4790c03df183c2b46665c1a58118c04fd3e3976ec2fe16a0aa00e00c9eea7754" -dependencies = [ - "futures-core", - "imbl", - "tokio", - "tracing", -] - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - -[[package]] -name = "fancy_constructor" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a27643a5d05f3a22f5afd6e0d0e6e354f92d37907006f97b84b9cb79082198" -dependencies = [ - "macroific", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-bounded" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91f328e7fb845fc832912fb6a34f40cf6d1888c92f974d1893a54e97b5ff542e" -dependencies = [ - "futures-timer", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" - -[[package]] -name = "futures-executor" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" - -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "futures-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" -dependencies = [ - "futures-io", - "rustls", - "rustls-pki-types", -] - -[[package]] -name = "futures-sink" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" - -[[package]] -name = "futures-task" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" - -[[package]] -name = "futures-ticker" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9763058047f713632a52e916cc7f6a4b3fc6e9fc1ff8c5b1dc49e5a89041682e" -dependencies = [ - "futures", - "futures-timer", - "instant", -] - -[[package]] -name = "futures-timer" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" - -[[package]] -name = "futures-util" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 6.0.0", - "rand_core 0.10.1", - "wasm-bindgen", -] - -[[package]] -name = "ghash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "growable-bloom-filter" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d174ccb4ba660d431329e7f0797870d0a4281e36353ec4b4a3c5eab6c2cfb6f1" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "xxhash-rust", -] - -[[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.4.2", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "hashlink" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" -dependencies = [ - "hashbrown 0.15.5", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex_fmt" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" - -[[package]] -name = "hickory-proto" -version = "0.24.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna", - "ipnet", - "once_cell", - "rand 0.8.7", - "socket2 0.5.10", - "thiserror 1.0.69", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "hickory-resolver" -version = "0.24.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" -dependencies = [ - "cfg-if", - "futures-util", - "hickory-proto", - "ipconfig", - "lru-cache", - "once_cell", - "parking_lot", - "rand 0.8.7", - "resolv-conf", - "smallvec", - "thiserror 1.0.69", - "tokio", - "tracing", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "html5ever" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" -dependencies = [ - "log", - "markup5ever", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" -dependencies = [ - "bytes", - "http 1.4.2", -] - -[[package]] -name = "http-body-util" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" -dependencies = [ - "bytes", - "futures-core", - "http 1.4.2", - "http-body 1.1.0", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2 0.4.15", - "http 1.4.2", - "http-body 1.1.0", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" -dependencies = [ - "http 1.4.2", - "hyper 1.11.0", - "hyper-util", - "rustls", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 1.0.9", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-util", - "http 1.4.2", - "http-body 1.1.0", - "hyper 1.11.0", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.6.5", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "if-addrs" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a05c691e1fae256cf7013d99dad472dc52d5543322761f83ec8d47eab40d2b" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "if-watch" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c02a5161c313f0cbdbadc511611893584a10a7b6153cb554bdf83ddce99ec2" -dependencies = [ - "async-io", - "core-foundation 0.9.4", - "fnv", - "futures", - "if-addrs", - "ipnet", - "log", - "netlink-packet-core", - "netlink-packet-route", - "netlink-proto", - "netlink-sys", - "rtnetlink", - "system-configuration", - "tokio", - "windows", -] - -[[package]] -name = "igd-next" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064d90fec10d541084e7b39ead8875a5a80d9114a2b18791565253bae25f49e4" -dependencies = [ - "async-trait", - "attohttpc", - "bytes", - "futures", - "http 0.2.12", - "hyper 0.14.32", - "log", - "rand 0.8.7", - "tokio", - "url", - "xmltree", -] - -[[package]] -name = "imbl" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fade8ae6828627ad1fa094a891eccfb25150b383047190a3648d66d06186501" -dependencies = [ - "archery", - "bitmaps", - "imbl-sized-chunks", - "rand_core 0.9.5", - "rand_xoshiro", - "serde", - "version_check", -] - -[[package]] -name = "imbl-sized-chunks" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4241005618a62f8d57b2febd02510fb96e0137304728543dfc5fd6f052c22d" -dependencies = [ - "bitmaps", -] - -[[package]] -name = "impartial-ord" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "include_dir" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" -dependencies = [ - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "indexmap" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", - "serde", - "serde_core", -] - -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instability" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" -dependencies = [ - "darling", - "indoc", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipconfig" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" -dependencies = [ - "socket2 0.6.5", - "widestring", - "windows-registry", - "windows-result", - "windows-sys 0.61.2", -] - -[[package]] -name = "ipnet" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "jni" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" -dependencies = [ - "cfg-if", - "combine", - "jni-macros", - "jni-sys", - "log", - "simd_cesu8", - "thiserror 2.0.19", - "walkdir", - "windows-link", -] - -[[package]] -name = "jni-macros" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "simd_cesu8", - "syn 2.0.119", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "jobserver" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" -dependencies = [ - "getrandom 0.4.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "js_int" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d937f95470b270ce8b8950207715d71aa8e153c0d44c6684d59397ed4949160a" -dependencies = [ - "serde", -] - -[[package]] -name = "js_option" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7dd3e281add16813cf673bf74a32249b0aa0d1c8117519a17b3ada5e8552b3c" -dependencies = [ - "serde_core", -] - -[[package]] -name = "konst" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f660d5f887e3562f9ab6f4a14988795b694099d66b4f5dedc02d197ba9becb1d" -dependencies = [ - "const_panic", - "typewit", -] - -[[package]] -name = "language-tags" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link", -] - -[[package]] -name = "libp2p" -version = "0.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbe80f9c7e00526cd6b838075b9c171919404a4732cb2fa8ece0a093223bfc4" -dependencies = [ - "bytes", - "either", - "futures", - "futures-timer", - "getrandom 0.2.17", - "libp2p-allow-block-list", - "libp2p-connection-limits", - "libp2p-core", - "libp2p-dns", - "libp2p-gossipsub", - "libp2p-identify", - "libp2p-identity", - "libp2p-mdns", - "libp2p-metrics", - "libp2p-noise", - "libp2p-ping", - "libp2p-quic", - "libp2p-request-response", - "libp2p-swarm", - "libp2p-tcp", - "libp2p-upnp", - "libp2p-yamux", - "multiaddr", - "pin-project", - "rw-stream-sink", - "thiserror 1.0.69", -] - -[[package]] -name = "libp2p-allow-block-list" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1027ccf8d70320ed77e984f273bc8ce952f623762cb9bf2d126df73caef8041" -dependencies = [ - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "void", -] - -[[package]] -name = "libp2p-connection-limits" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d003540ee8baef0d254f7b6bfd79bac3ddf774662ca0abf69186d517ef82ad8" -dependencies = [ - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "void", -] - -[[package]] -name = "libp2p-core" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a61f26c83ed111104cd820fe9bc3aaabbac5f1652a1d213ed6e900b7918a1298" -dependencies = [ - "either", - "fnv", - "futures", - "futures-timer", - "libp2p-identity", - "multiaddr", - "multihash", - "multistream-select", - "once_cell", - "parking_lot", - "pin-project", - "quick-protobuf", - "rand 0.8.7", - "rw-stream-sink", - "smallvec", - "thiserror 1.0.69", - "tracing", - "unsigned-varint 0.8.0", - "void", - "web-time", -] - -[[package]] -name = "libp2p-dns" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97f37f30d5c7275db282ecd86e54f29dd2176bd3ac656f06abf43bedb21eb8bd" -dependencies = [ - "async-trait", - "futures", - "hickory-resolver", - "libp2p-core", - "libp2p-identity", - "parking_lot", - "smallvec", - "tracing", -] - -[[package]] -name = "libp2p-gossipsub" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4e830fdf24ac8c444c12415903174d506e1e077fbe3875c404a78c5935a8543" -dependencies = [ - "asynchronous-codec", - "base64", - "byteorder", - "bytes", - "either", - "fnv", - "futures", - "futures-ticker", - "getrandom 0.2.17", - "hex_fmt", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "prometheus-client", - "quick-protobuf", - "quick-protobuf-codec", - "rand 0.8.7", - "regex", - "sha2", - "smallvec", - "tracing", - "void", - "web-time", -] - -[[package]] -name = "libp2p-identify" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1711b004a273be4f30202778856368683bd9a83c4c7dcc8f848847606831a4e3" -dependencies = [ - "asynchronous-codec", - "either", - "futures", - "futures-bounded", - "futures-timer", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "lru", - "quick-protobuf", - "quick-protobuf-codec", - "smallvec", - "thiserror 1.0.69", - "tracing", - "void", -] - -[[package]] -name = "libp2p-identity" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9525f3831544f7ae497bde79adf114ef127b0fbbb97edbbf692a80408636421c" -dependencies = [ - "bs58", - "ed25519-dalek", - "hkdf", - "multihash", - "prost", - "rand 0.8.7", - "sha2", - "thiserror 2.0.19", - "tracing", - "zeroize", -] - -[[package]] -name = "libp2p-mdns" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b8546b6644032565eb29046b42744aee1e9f261ed99671b2c93fb140dba417" -dependencies = [ - "data-encoding", - "futures", - "hickory-proto", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "rand 0.8.7", - "smallvec", - "socket2 0.5.10", - "tokio", - "tracing", - "void", -] - -[[package]] -name = "libp2p-metrics" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ebafa94a717c8442d8db8d3ae5d1c6a15e30f2d347e0cd31d057ca72e42566" -dependencies = [ - "futures", - "libp2p-core", - "libp2p-gossipsub", - "libp2p-identify", - "libp2p-identity", - "libp2p-ping", - "libp2p-swarm", - "pin-project", - "prometheus-client", - "web-time", -] - -[[package]] -name = "libp2p-noise" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36b137cb1ae86ee39f8e5d6245a296518912014eaa87427d24e6ff58cfc1b28c" -dependencies = [ - "asynchronous-codec", - "bytes", - "curve25519-dalek", - "futures", - "libp2p-core", - "libp2p-identity", - "multiaddr", - "multihash", - "once_cell", - "quick-protobuf", - "rand 0.8.7", - "sha2", - "snow", - "static_assertions", - "thiserror 1.0.69", - "tracing", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "libp2p-ping" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005a34420359223b974ee344457095f027e51346e992d1e0dcd35173f4cdd422" -dependencies = [ - "either", - "futures", - "futures-timer", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "rand 0.8.7", - "tracing", - "void", - "web-time", -] - -[[package]] -name = "libp2p-quic" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46352ac5cd040c70e88e7ff8257a2ae2f891a4076abad2c439584a31c15fd24e" -dependencies = [ - "bytes", - "futures", - "futures-timer", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-tls", - "parking_lot", - "quinn", - "rand 0.8.7", - "ring 0.17.14", - "rustls", - "socket2 0.5.10", - "thiserror 1.0.69", - "tokio", - "tracing", -] - -[[package]] -name = "libp2p-request-response" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1356c9e376a94a75ae830c42cdaea3d4fe1290ba409a22c809033d1b7dcab0a6" -dependencies = [ - "async-trait", - "futures", - "futures-bounded", - "futures-timer", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "rand 0.8.7", - "smallvec", - "tracing", - "void", - "web-time", -] - -[[package]] -name = "libp2p-swarm" -version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7dd6741793d2c1fb2088f67f82cf07261f25272ebe3c0b0c311e0c6b50e851a" -dependencies = [ - "either", - "fnv", - "futures", - "futures-timer", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm-derive", - "lru", - "multistream-select", - "once_cell", - "rand 0.8.7", - "smallvec", - "tokio", - "tracing", - "void", - "web-time", -] - -[[package]] -name = "libp2p-swarm-derive" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206e0aa0ebe004d778d79fb0966aa0de996c19894e2c0605ba2f8524dd4443d8" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "libp2p-tcp" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad964f312c59dcfcac840acd8c555de8403e295d39edf96f5240048b5fcaa314" -dependencies = [ - "futures", - "futures-timer", - "if-watch", - "libc", - "libp2p-core", - "libp2p-identity", - "socket2 0.5.10", - "tokio", - "tracing", -] - -[[package]] -name = "libp2p-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b23dddc2b9c355f73c1e36eb0c3ae86f7dc964a3715f0731cfad352db4d847" -dependencies = [ - "futures", - "futures-rustls", - "libp2p-core", - "libp2p-identity", - "rcgen", - "ring 0.17.14", - "rustls", - "rustls-webpki 0.101.7", - "thiserror 1.0.69", - "x509-parser", - "yasna", -] - -[[package]] -name = "libp2p-upnp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01bf2d1b772bd3abca049214a3304615e6a36fa6ffc742bdd1ba774486200b8f" -dependencies = [ - "futures", - "futures-timer", - "igd-next", - "libp2p-core", - "libp2p-swarm", - "tokio", - "tracing", - "void", -] - -[[package]] -name = "libp2p-yamux" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "788b61c80789dba9760d8c669a5bedb642c8267555c803fabd8396e4ca5c5882" -dependencies = [ - "either", - "futures", - "libp2p-core", - "thiserror 1.0.69", - "tracing", - "yamux 0.12.1", - "yamux 0.13.10", -] - -[[package]] -name = "libredox" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" -dependencies = [ - "libc", -] - -[[package]] -name = "libsqlite3-sys" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" -dependencies = [ - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.5", -] - -[[package]] -name = "lru-cache" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "macroific" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89f276537b4b8f981bf1c13d79470980f71134b7bdcc5e6e911e910e556b0285" -dependencies = [ - "macroific_attr_parse", - "macroific_core", - "macroific_macro", -] - -[[package]] -name = "macroific_attr_parse" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad4023761b45fcd36abed8fb7ae6a80456b0a38102d55e89a57d9a594a236be9" -dependencies = [ - "proc-macro2", - "quote", - "sealed", - "syn 2.0.119", -] - -[[package]] -name = "macroific_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a7594d3c14916fa55bef7e9d18c5daa9ed410dd37504251e4b75bbdeec33e3" -dependencies = [ - "proc-macro2", - "quote", - "sealed", - "syn 2.0.119", -] - -[[package]] -name = "macroific_macro" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da6f2ed796261b0a74e2b52b42c693bb6dee1effba3a482c49592659f824b3b" -dependencies = [ - "macroific_attr_parse", - "macroific_core", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "markup5ever" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" -dependencies = [ - "log", - "tendril", - "web_atoms", -] - -[[package]] -name = "match-lookup" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "matrix-pickle" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d65d46b7379dd0afa4a42f9b2269821d31afdee0111b5e0d74e3bee03553a0" -dependencies = [ - "matrix-pickle-derive", - "thiserror 2.0.19", -] - -[[package]] -name = "matrix-pickle-derive" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414b5e4c34009f2bc3fe35dd018f25755ca38858096574841c7332f99e2c7e77" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "matrix-sdk" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7083d580527511ac5d9369e03b9f2b20902e76949f1b3964051f978e4d3756ae" -dependencies = [ - "anymap2", - "aquamarine", - "as_variant", - "async-channel", - "async-once-cell", - "async-stream", - "async-trait", - "axum", - "backon", - "bytes", - "bytesize", - "cfg-if", - "event-listener", - "eyeball", - "eyeball-im", - "futures-core", - "futures-util", - "gloo-timers", - "http 1.4.2", - "imbl", - "indexmap", - "itertools 0.14.0", - "js_int", - "language-tags", - "matrix-sdk-base", - "matrix-sdk-common", - "matrix-sdk-indexeddb", - "matrix-sdk-sqlite", - "mime", - "mime2ext", - "oauth2", - "oauth2-reqwest", - "percent-encoding", - "pin-project-lite", - "rand 0.10.2", - "reqwest 0.13.4", - "ruma", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "serde", - "serde_html_form", - "serde_json", - "sha2", - "tempfile", - "thiserror 2.0.19", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tracing", - "url", - "urlencoding", - "vodozemac", - "webpki-roots 1.0.9", - "zeroize", -] - -[[package]] -name = "matrix-sdk-base" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e09a917eb1f7643d9d9a06b2f131e2ceb39df6910a7b830dac18bfd6db37a1f5" -dependencies = [ - "as_variant", - "async-trait", - "bitflags", - "decancer", - "eyeball", - "eyeball-im", - "futures-util", - "growable-bloom-filter", - "matrix-sdk-common", - "matrix-sdk-crypto", - "matrix-sdk-store-encryption", - "regex", - "ruma", - "serde", - "serde_json", - "thiserror 2.0.19", - "tokio", - "tracing", - "unicode-normalization", -] - -[[package]] -name = "matrix-sdk-common" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b9d1e0fee0f090180ef9457034adc547e80de9e6e3eb2e63aaac68a8476f836" -dependencies = [ - "eyeball-im", - "futures-core", - "futures-executor", - "futures-util", - "gloo-timers", - "imbl", - "ruma", - "serde", - "serde_json", - "thiserror 2.0.19", - "tokio", - "tracing", - "tracing-subscriber", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "matrix-sdk-crypto" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54afd2a326f51c13a6ad44ec86315a688fffeb3f1e287fb343e0e1836a3bdaf" -dependencies = [ - "aes", - "aquamarine", - "as_variant", - "async-trait", - "bs58", - "byteorder", - "cfg-if", - "ctr", - "eyeball", - "futures-core", - "futures-util", - "hkdf", - "hmac", - "itertools 0.14.0", - "js_option", - "matrix-sdk-common", - "pbkdf2", - "rand 0.10.2", - "rmp-serde", - "ruma", - "serde", - "serde_json", - "sha2", - "subtle", - "thiserror 2.0.19", - "time", - "tokio", - "tokio-stream", - "tracing", - "ulid", - "url", - "vodozemac", - "zeroize", -] - -[[package]] -name = "matrix-sdk-indexeddb" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef37395fffb7c916f7109ab0d16d8ca599403dd8164d08c0d966176b66ede47" -dependencies = [ - "async-trait", - "base64", - "futures-util", - "getrandom 0.4.3", - "gloo-utils", - "hkdf", - "js-sys", - "matrix-sdk-base", - "matrix-sdk-crypto", - "matrix-sdk-store-encryption", - "matrix_indexed_db_futures", - "rmp-serde", - "ruma", - "serde", - "serde-wasm-bindgen", - "serde_json", - "sha2", - "thiserror 2.0.19", - "tokio", - "tracing", - "uuid", - "wasm-bindgen", - "web-sys", - "zeroize", -] - -[[package]] -name = "matrix-sdk-sqlite" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49133429271005745f8d5a05362d2ba6567274777250236799927ca30dc0670" -dependencies = [ - "as_variant", - "async-trait", - "deadpool", - "deadpool-sync", - "itertools 0.14.0", - "matrix-sdk-base", - "matrix-sdk-crypto", - "matrix-sdk-store-encryption", - "num_cpus", - "rmp-serde", - "ruma", - "rusqlite", - "serde", - "serde_json", - "serde_path_to_error", - "thiserror 2.0.19", - "tokio", - "tracing", - "vodozemac", - "zeroize", -] - -[[package]] -name = "matrix-sdk-store-encryption" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f48f304e553fb6200b1d7d1f77a88fd182076d4b25624e9dbfa42d6a37de35e" -dependencies = [ - "base64", - "blake3", - "chacha20poly1305", - "getrandom 0.2.17", - "getrandom 0.4.3", - "hmac", - "pbkdf2", - "rand 0.10.2", - "rmp-serde", - "serde", - "serde_json", - "sha2", - "thiserror 2.0.19", - "zeroize", -] - -[[package]] -name = "matrix_indexed_db_futures" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245ff6a224b4df7b0c90dda2dd5a6eb46112708d49e8bdd8b007fccb09fea8e4" -dependencies = [ - "accessory", - "cfg-if", - "delegate-display", - "derive_more 2.1.1", - "fancy_constructor", - "futures-core", - "js-sys", - "matrix_indexed_db_futures_macros_internal", - "sealed", - "serde", - "serde-wasm-bindgen", - "smallvec", - "thiserror 2.0.19", - "tokio", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm_evt_listener", - "web-sys", - "web-time", -] - -[[package]] -name = "matrix_indexed_db_futures_macros_internal" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b428aee5c0fe9e5babd29e99d289b7f64718c444989aac0442d1fd6d3e3f66d1" -dependencies = [ - "macroific", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime2ext" -version = "0.1.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf6f36070878c42c5233846cd3de24cf9016828fd47bc22957a687298bb21fc" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "multiaddr" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" -dependencies = [ - "arrayref", - "byteorder", - "data-encoding", - "libp2p-identity", - "multibase", - "multihash", - "percent-encoding", - "serde", - "static_assertions", - "unsigned-varint 0.8.0", - "url", -] - -[[package]] -name = "multibase" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0e4a371cbf1dfd666b658ba137763edb23c45beb43cfe369b5593cd6b437b6" -dependencies = [ - "base-x", - "base256emoji", - "base45", - "data-encoding", - "data-encoding-macro", -] - -[[package]] -name = "multihash" -version = "0.19.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "577c63b00ad74d57e8c9aa870b5fccebf2fd64a308a5aee9f1bb88e4aea19447" -dependencies = [ - "unsigned-varint 0.8.0", -] - -[[package]] -name = "multistream-select" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" -dependencies = [ - "bytes", - "futures", - "log", - "pin-project", - "smallvec", - "unsigned-varint 0.7.2", -] - -[[package]] -name = "netlink-packet-core" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" -dependencies = [ - "paste", -] - -[[package]] -name = "netlink-packet-route" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ce3636fa715e988114552619582b530481fd5ef176a1e5c1bf024077c2c9445" -dependencies = [ - "bitflags", - "libc", - "log", - "netlink-packet-core", -] - -[[package]] -name = "netlink-proto" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" -dependencies = [ - "bytes", - "futures", - "log", - "netlink-packet-core", - "netlink-sys", - "thiserror 2.0.19", -] - -[[package]] -name = "netlink-sys" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae" -dependencies = [ - "bytes", - "futures-util", - "libc", - "log", - "tokio", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nirc-rs" -version = "0.10.0" -dependencies = [ - "aes-gcm", - "anyhow", - "argon2", - "async-trait", - "base64", - "chrono", - "crossterm", - "dashmap", - "dirs", - "futures", - "libloading", - "libp2p", - "matrix-sdk", - "rand 0.8.7", - "ratatui", - "reqwest 0.12.28", - "rustls-pemfile", - "serde", - "serde_json", - "sha2", - "tempfile", - "thiserror 2.0.19", - "tokio", - "tokio-rustls", - "tokio-test", - "tokio-tungstenite", - "tokio-util", - "toml 0.8.23", - "tracing", - "tracing-subscriber", - "url", - "webpki-roots 0.26.11", - "x25519-dalek", - "yamux 0.13.10", - "zeroize", -] - -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num-bigint" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "oauth2" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" -dependencies = [ - "base64", - "chrono", - "getrandom 0.2.17", - "http 1.4.2", - "rand 0.8.7", - "serde", - "serde_json", - "serde_path_to_error", - "sha2", - "thiserror 1.0.69", - "url", -] - -[[package]] -name = "oauth2-reqwest" -version = "0.1.0-alpha.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234fb5c965bbce983ee5de636a7a51d6a3223da8067ea02f9ab2d2d78ac08be2" -dependencies = [ - "oauth2", - "reqwest 0.13.4", -] - -[[package]] -name = "oid-registry" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "password-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest", -] - -[[package]] -name = "pem" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64", - "serde_core", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_shared", - "serde", -] - -[[package]] -name = "phf_codegen" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand", - "phf_shared", -] - -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures 0.2.17", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.13+spec-1.1.0", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prometheus-client" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504ee9ff529add891127c4827eb481bd69dc0ebc72e9a682e187db4caa60c3ca" -dependencies = [ - "dtoa", - "itoa", - "parking_lot", - "prometheus-client-derive-encode", -] - -[[package]] -name = "prometheus-client-derive-encode" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "prost" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "quick-protobuf" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" -dependencies = [ - "byteorder", -] - -[[package]] -name = "quick-protobuf-codec" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" -dependencies = [ - "asynchronous-codec", - "bytes", - "quick-protobuf", - "thiserror 1.0.69", - "unsigned-varint 0.8.0", -] - -[[package]] -name = "quinn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" -dependencies = [ - "bytes", - "cfg_aliases", - "futures-io", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2 0.6.5", - "thiserror 2.0.19", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" -dependencies = [ - "aws-lc-rs", - "bytes", - "getrandom 0.4.3", - "lru-slab", - "rand 0.10.2", - "rand_pcg", - "ring 0.17.14", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.19", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.6.5", - "tracing", - "windows-sys 0.61.2", -] - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "rand" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" -dependencies = [ - "chacha20 0.10.1", - "getrandom 0.4.3", - "rand_core 0.10.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" - -[[package]] -name = "rand_pcg" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" -dependencies = [ - "rand_core 0.10.1", -] - -[[package]] -name = "rand_xoshiro" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" -dependencies = [ - "rand_core 0.9.5", -] - -[[package]] -name = "ratatui" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" -dependencies = [ - "bitflags", - "cassowary", - "compact_str", - "crossterm", - "indoc", - "instability", - "itertools 0.13.0", - "lru", - "paste", - "strum", - "unicode-segmentation", - "unicode-truncate", - "unicode-width 0.2.0", -] - -[[package]] -name = "rcgen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c4f3084aa3bc7dfbba4eff4fab2a54db4324965d8872ab933565e6fbd83bc6" -dependencies = [ - "pem", - "ring 0.16.20", - "time", - "yasna", -] - -[[package]] -name = "readlock" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da6f291b23556edd9edaf655a0be2ad8ef8002ff5f1bca62b264f3f58b53f34" - -[[package]] -name = "readlock-tokio" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7e264f9ec4f3d112e8e2f214e8e7cb5cf3b83278f3570b7e00bfe13d3bd8ff" -dependencies = [ - "tokio", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.19", -] - -[[package]] -name = "regex" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http 1.4.2", - "http-body 1.1.0", - "http-body-util", - "hyper 1.11.0", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams 0.4.2", - "web-sys", - "webpki-roots 1.0.9", -] - -[[package]] -name = "reqwest" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "h2 0.4.15", - "http 1.4.2", - "http-body 1.1.0", - "http-body-util", - "hyper 1.11.0", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams 0.5.0", - "web-sys", -] - -[[package]] -name = "resolv-conf" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "rmp" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" -dependencies = [ - "num-traits", -] - -[[package]] -name = "rmp-serde" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" -dependencies = [ - "rmp", - "serde", -] - -[[package]] -name = "rtnetlink" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b960d5d873a75b5be9761b1e73b146f52dddcd27bac75263f40fba686d4d7b5" -dependencies = [ - "futures-channel", - "futures-util", - "log", - "netlink-packet-core", - "netlink-packet-route", - "netlink-proto", - "netlink-sys", - "nix", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "ruma" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4fe5bfacdb0e95e733da3b6c37d98edf46447a4a8e8dea824e0da266d8ad59" -dependencies = [ - "assign", - "js_int", - "js_option", - "ruma-client-api", - "ruma-common", - "ruma-events", - "ruma-html", - "web-time", -] - -[[package]] -name = "ruma-client-api" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7ca43a888ca569168d7e3901f4dd14a777b860bb19f4c08e35414162eb261c" -dependencies = [ - "as_variant", - "assign", - "bytes", - "http 1.4.2", - "js_int", - "js_option", - "maplit", - "ruma-common", - "ruma-events", - "serde", - "serde_html_form", - "serde_json", - "thiserror 2.0.19", - "url", - "web-time", -] - -[[package]] -name = "ruma-common" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3b4f00112791b490acce57df1ce3eb3f88899b045bebcff8a29f75369640cc" -dependencies = [ - "as_variant", - "base64", - "bytes", - "date_header", - "form_urlencoded", - "getrandom 0.4.3", - "http 1.4.2", - "indexmap", - "js_int", - "konst", - "percent-encoding", - "rand 0.10.2", - "regex", - "ruma-identifiers-validation", - "ruma-macros", - "serde", - "serde_html_form", - "serde_json", - "thiserror 2.0.19", - "time", - "tracing", - "url", - "uuid", - "web-time", - "wildmatch", - "zeroize", -] - -[[package]] -name = "ruma-events" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85d2f90830fc131691349b96a69ff53444eb6c3e8dc7869c77961b43cfaf3344" -dependencies = [ - "as_variant", - "indexmap", - "js_int", - "js_option", - "ruma-common", - "ruma-macros", - "serde", - "serde_json", - "thiserror 2.0.19", - "tracing", - "web-time", - "wildmatch", - "zeroize", -] - -[[package]] -name = "ruma-html" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d33a944650f4bbd2188dd204d39dd87a9a1498f14b3a13252910c90ed7cd43" -dependencies = [ - "as_variant", - "html5ever", - "tracing", - "wildmatch", -] - -[[package]] -name = "ruma-identifiers-validation" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6cff00317675f487c4e7ccfb18875a14c5a14867b51d13f2a826053f03c432" -dependencies = [ - "js_int", - "thiserror 2.0.19", -] - -[[package]] -name = "ruma-macros" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8cfb39eaa9b9fd389126ff941e060b496add5cbbfef559d80c46e571dda459c" -dependencies = [ - "as_variant", - "cfg-if", - "proc-macro-crate", - "proc-macro2", - "quote", - "ruma-identifiers-validation", - "serde", - "syn 2.0.119", - "toml 1.1.3+spec-1.1.0", -] - -[[package]] -name = "rusqlite" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" -dependencies = [ - "bitflags", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", -] - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.12.1", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring 0.17.14", - "rustls-pki-types", - "rustls-webpki 0.103.13", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" -dependencies = [ - "core-foundation 0.10.1", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki 0.103.13", - "security-framework", - "security-framework-sys", - "webpki-root-certs", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" -dependencies = [ - "aws-lc-rs", - "ring 0.17.14", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "rw-stream-sink" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" -dependencies = [ - "futures", - "pin-project", - "static_assertions", -] - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sealed" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-wasm-bindgen" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "serde_bytes" -version = "0.11.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "serde_html_form" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0346d7a342ab90f405cfc08f25d15075f944f42fcabbc5eac923829fa6d228" -dependencies = [ - "form_urlencoded", - "indexmap", - "itoa", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_json" -version = "1.0.151" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" - -[[package]] -name = "simd_cesu8" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" -dependencies = [ - "rustc_version", - "simdutf8", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" -dependencies = [ - "serde", -] - -[[package]] -name = "snow" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" -dependencies = [ - "aes-gcm", - "blake2", - "chacha20poly1305", - "curve25519-dalek", - "rand_core 0.6.4", - "ring 0.17.14", - "rustc_version", - "sha2", - "subtle", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", -] - -[[package]] -name = "string_cache_codegen" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.119", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -dependencies = [ - "bitflags", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand", - "getrandom 0.4.3", - "once_cell", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendril" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" -dependencies = [ - "new_debug_unreachable", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" -dependencies = [ - "thiserror-impl 2.0.19", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "thread_local" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "time" -version = "0.3.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" -dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.6.5", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-test" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6d24790a10a7af737693a3e8f1d03faef7e6ca0cc99aae5066f533766de545" -dependencies = [ - "futures-core", - "tokio", - "tokio-stream", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.11", -] - -[[package]] -name = "tokio-util" -version = "0.7.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "libc", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "1.1.3+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c" -dependencies = [ - "serde_core", - "serde_spanned 1.1.1", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.4", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.15", -] - -[[package]] -name = "toml_edit" -version = "0.25.13+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" -dependencies = [ - "indexmap", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.4", -] - -[[package]] -name = "toml_parser" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" -dependencies = [ - "winnow 1.0.4", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" -dependencies = [ - "async-compression", - "bitflags", - "bytes", - "futures-core", - "futures-util", - "http 1.4.2", - "http-body 1.1.0", - "http-body-util", - "pin-project-lite", - "tokio", - "tokio-util", - "tower", - "tower-layer", - "tower-service", - "url", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.4.2", - "httparse", - "log", - "rand 0.8.7", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror 1.0.69", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "typewit" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214ca0b2191785cbc06209b9ca1861e048e39b5ba33574b3cedd58363d5bb5f6" - -[[package]] -name = "ulid" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" -dependencies = [ - "rand 0.9.5", - "web-time", -] - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-normalization" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unicode-truncate" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" -dependencies = [ - "itertools 0.13.0", - "unicode-segmentation", - "unicode-width 0.1.14", -] - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-width" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "unsigned-varint" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" - -[[package]] -name = "unsigned-varint" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" -dependencies = [ - "getrandom 0.4.3", - "js-sys", - "serde_core", - "wasm-bindgen", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vodozemac" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98bf83c0992966775b8012f194b07b44928996163e5a05b741b43891571ae5b" -dependencies = [ - "aes", - "arrayvec", - "base64", - "base64ct", - "cbc", - "chacha20poly1305", - "curve25519-dalek", - "ed25519-dalek", - "getrandom 0.2.17", - "hkdf", - "hmac", - "matrix-pickle", - "prost", - "rand 0.8.7", - "serde", - "serde_bytes", - "serde_json", - "sha2", - "subtle", - "thiserror 2.0.19", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.119", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasm-streams" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasm_evt_listener" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc92d6378b411ed94839112a36d9dbc77143451d85b05dfb0cce93a78dab1963" -dependencies = [ - "accessory", - "derivative", - "derive_more 1.0.0", - "fancy_constructor", - "futures-core", - "js-sys", - "smallvec", - "tokio", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "web_atoms" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297" -dependencies = [ - "phf", - "phf_codegen", - "string_cache", - "string_cache_codegen", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.9", -] - -[[package]] -name = "webpki-roots" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - -[[package]] -name = "wildmatch" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29333c3ea1ba8b17211763463ff24ee84e41c78224c16b001cd907e663a38c68" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core", - "windows-link", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core", - "windows-link", -] - -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - -[[package]] -name = "x25519-dalek" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" -dependencies = [ - "curve25519-dalek", - "rand_core 0.6.4", - "serde", - "zeroize", -] - -[[package]] -name = "x509-parser" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" -dependencies = [ - "asn1-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror 1.0.69", - "time", -] - -[[package]] -name = "xml-rs" -version = "0.8.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" - -[[package]] -name = "xmltree" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" -dependencies = [ - "xml-rs", -] - -[[package]] -name = "xxhash-rust" -version = "0.8.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6" - -[[package]] -name = "yamux" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed0164ae619f2dc144909a9f082187ebb5893693d8c0196e8085283ccd4b776" -dependencies = [ - "futures", - "log", - "nohash-hasher", - "parking_lot", - "pin-project", - "rand 0.8.7", - "static_assertions", -] - -[[package]] -name = "yamux" -version = "0.13.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1991f6690292030e31b0144d73f5e8368936c58e45e7068254f7138b23b00672" -dependencies = [ - "futures", - "log", - "nohash-hasher", - "parking_lot", - "pin-project", - "rand 0.9.5", - "static_assertions", - "web-time", -] - -[[package]] -name = "yasna" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" -dependencies = [ - "time", -] - -[[package]] -name = "yoke" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zmij" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index 922742a..71fc599 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nirc-rs" -version = "0.10.1" +version = "0.10.2" edition = "2021" description = "multi-protocol terminal chat client" license = "GPL-3.0-or-later" @@ -8,7 +8,7 @@ authors = ["Jeremy Anderson "] repository = "https://git.dcos.net/dcosnet/nirc-rs" homepage = "https://dcos.net" readme = "README.md" -keywords = ["irc", "matrix", "discord", "p2p", "chat", "terminal", "tui"] +keywords = ["irc", "matrix", "discord", "chat", "terminal", "tui"] categories = ["command-line-utilities", "network-programming", "cryptography"] [dependencies] @@ -35,7 +35,10 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } sha2 = "0.10" yamux = "0.13" async-trait = "0.1" -libp2p = { version = "0.54", features = ["tcp", "tokio", "noise", "yamux", "gossipsub", "mdns", "identify", "ping", "request-response", "macros"] } +# libp2p was dropped in 0.10.2 when BitChat was removed. The Noise primitive +# in src/engine/crypto.rs uses x25519-dalek + aes-gcm directly (not libp2p), +# so ADC's encrypted C-C connections still work. If a future P2P protocol +# needs libp2p again, re-add: libp2p = { version = "0.54", features = ["tcp", "tokio", "noise", "yamux", "gossipsub", "mdns", "identify", "ping", "request-response", "macros"] } tokio-util = { version = "0.7", features = ["io", "codec", "compat"] } dashmap = "6" toml = "0.8" diff --git a/NOTICES.md b/NOTICES.md new file mode 100644 index 0000000..027a659 --- /dev/null +++ b/NOTICES.md @@ -0,0 +1,107 @@ +# NOTICES — nirc-rs + +This file collects project-level notices that affect the legal or operational +status of nirc-rs features. It is intentionally separate from CHANGES.md +(which is a release-engineering log) so that legal/compliance readers can +find these notes quickly. + +--- + +## BitChat protocol module — withdrawn in 0.10.2 + +**Status:** Removed. +**Affected versions:** All releases up to and including 0.10.1 contained a +`src/protocols/bitchat.rs` module. It was removed in 0.10.2. +**Date of removal:** 2026-07. + +### What was removed + +- `src/protocols/bitchat.rs` — the entire protocol backend (libp2p-based + P2P chat with mDNS discovery, gossipsub, noise handshake). +- `ProtocolType::BitChat` enum variant and all of its match arms in + `tag()`, `label()`, `badge()`, `naim_color()`, dispatcher routing, + command parsing, TUI color tables, history-tag mapping, log sanitiser, + and the F1 menubar "Connect → BitChat…" entry. +- `Command::BitChatPeers`, `BitChatDm`, `BitChatSendFile` variants and + their `/bitchat …` parser arms. +- `ProtocolCommand::BitChat(BitChatCommand)` dispatcher variant. +- The `connect_bitchat()` method on `Dispatcher`. +- The `libp2p` dependency in `Cargo.toml`. libp2p was only consumed by + `bitchat.rs`; no other module imports it. Dropping it significantly + reduces the dependency tree and compile time. The Noise primitive in + `src/engine/crypto.rs` uses `x25519-dalek` + `aes-gcm` directly (not + libp2p), so ADC's encrypted client-client connections still work. + +### Why it was removed + +The BitChat project — Jack Dorsey's recently-announced P2P messaging +protocol — is the subject of active litigation in the Indian courts. The +legal status of the protocol specification, the reference implementation, +and downstream reimplementations such as the one previously shipped in +nirc-rs is currently unclear. Specifically: + +- Court filings have not yet established whether the BitChat protocol + itself is encumbered by intellectual-property claims, or whether only + the reference client is affected. +- There is live ambiguity about whether shipping a third-party + implementation of the protocol exposes downstream distributors to + secondary liability. +- The reference implementation's license terms have changed during the + dispute, and it is not yet clear which license applies to derivative + works that were created before the change. + +Pending clarity on these points, we have removed the BitChat module from +nirc-rs entirely. The risk of shipping an encumbered protocol backend +outweighs the benefit of offering P2P chat that users can obtain from +other sources in the meantime. + +### What this means for users + +- **Existing configs:** Any `[[servers]]` entry in `~/.nirc/config.toml` + with `protocol = "bitchat"` will be silently ignored at load time. + You do not need to edit your config file, but you may remove the + entries to clean it up. +- **Existing history files:** Per-tab scrollback files in + `~/.nirc/history/` that were tagged `P2P:` (the BitChat tab-key + prefix) will fail to match any known protocol on load and will be + silently assigned to the Status tab. The files themselves are not + deleted; you can read them with a text editor if you need to recover + the content. +- **Existing tabs:** If you were connected to a BitChat network when you + last exited nirc-rs 0.10.1 or earlier, the tab will not reconnect on + startup. It will appear as an inert entry in the winlist until you + `/close` it. +- **No data loss:** Your IRC / Matrix / ADC / Discord / Stout / Spacebar + / Nerimity history, configs, and credentials are unaffected. + +### Re-evaluation criteria + +We will re-evaluate restoring the BitChat module when **all** of the +following are true: + +1. The India courts case has reached a final judgement (not an interim + order), OR the parties have publicly settled and the settlement terms + are clear about downstream-implementation rights. +2. The BitChat reference implementation's license is unambiguous and + permits third-party reimplementations. +3. There is at least one independent legal opinion (not from a party to + the litigation) concluding that shipping a clean-room reimplementation + of the protocol is safe. + +Until then, the module will remain withdrawn. If you want P2P chat in +nirc-rs in the meantime, the ADC protocol's client-client connections +offer a similar feature set (direct file transfer, direct messages) over +a hub-and-spoke topology rather than full mesh P2P. + +### Acknowledgement + +We acknowledge the work of the original BitChat team and the broader P2P +messaging community. The decision to withdraw the module is purely a +legal-risk mitigation, not a commentary on the technical merits of the +protocol or the people who built it. + +--- + +## Future notices + +New entries will be appended below this line as needed. diff --git a/README.md b/README.md index 223093a..47973e2 100755 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ A multi-protocol terminal chat client written in Rust. Design Philosophy -nirc-rs is built on a single conviction: your communications deserve a client that treats the terminal as a first-class interface, not an afterthought. Every design decision — from the naim-derived 8-color palette system to the yamux-multiplexed file transfer pipeline — is deliberate. The client consolidates eight chat protocols into one unified, keyboard-driven interface with zero browser dependencies, zero Electron overhead, and zero JavaScript runtimes. +nirc-rs is built on a single conviction: your communications deserve a client that treats the terminal as a first-class interface, not an afterthought. Every design decision — from the naim-derived 8-color palette system to the yamux-multiplexed file transfer pipeline — is deliberate. The client consolidates seven chat protocols (down from eight — BitChat was withdrawn in 0.10.2; see NOTICES.md) into one unified, keyboard-driven interface with zero browser dependencies, zero Electron overhead, and zero JavaScript runtimes. The architecture follows a layered design: protocol adapters at the bottom, an asynchronous event dispatcher in the middle, and a ratatui-based presentation layer on top. This separation means adding a new protocol requires implementing a single adapter trait — the rest of the system (tabs, logging, theming, file transfers, the menu bar) adapts automatically. -**Version:** 0.9.0 +**Version:** 0.10.2 **License:** GPL-3.0-or-later **Author:** Jeremy Anderson — dcos.net **Repository:** https://git.dcos.net/dcosnet/nirc-rs @@ -38,16 +38,16 @@ nirc-rs implements protocol adapters as discrete, isolated modules. Each adapter | Protocol | Status | Transport | Adapter Details | |----------|--------|-----------|-----------------| -| **IRC** | Production | TLS (6697) / plaintext | SASL PLAIN authentication, CTCP auto-response (VERSION), ISUPPORT capability negotiation, full operator command set (`/oper`, `/kill`, `/kline`, `/wallops`), channel mode management, `/raw` for arbitrary protocol lines | +| **IRC** | Production | TLS (6697) / plaintext | SASL PLAIN authentication, CTCP auto-response (VERSION), ISUPPORT capability negotiation, full operator command set (`/oper`, `/kill`, `/kline`, `/wallops`), channel mode management, `/raw` for arbitrary protocol lines. 0.10.1: CTCP spec compliance (PRIVMSG not NOTICE), `/away` state tracking with 305/306, IRCv3 away-notify handler, `/who` hardening (352 hopcount/realname split + 315), `/me` & `/notice` local echo. | | **ADC/DC++** | Production | TLS / plaintext | HSUP→ISID→BINF handshake sequence, hub search via SCH, file transfers over yamux-multiplexed streams with in-flight SHA-256 verification, security pipeline (rate limiting, IP validation, SSRF prevention, path traversal blocking) | | **Matrix** | Implemented | HTTPS (matrix-sdk 0.18) | Megolm E2EE with SQLite crypto store, dedicated OS thread for non-Send crypto types, room creation/invitation/reaction/reply, SAS device verification, session persistence via token storage | | **Discord** | Implemented | WebSocket (wss) | Gateway event subscription, REST API integration, guild join/leave/members | | **Stout** | Implemented | WebSocket (wss) | Revolt-compatible fork, REST + WebSocket client | | **Spacebar** | Implemented | WebSocket (wss) | Revolt fork variant, independent REST + WebSocket adapter | | **Nerimity** | Implemented | WebSocket (wss) | Custom platform with dedicated REST + WebSocket adapter | -| **BitChat** | Implemented | libp2p (TCP) | P2P messaging via noise protocol, mDNS peer discovery, gossipsub pub/sub, request-response file transfer | +| ~~**BitChat**~~ | **Withdrawn in 0.10.2** | ~~libp2p (TCP)~~ | Removed pending clarity on Jack Dorsey's BitChat project and the India courts situation. See [NOTICES.md](NOTICES.md) for the full rationale. | -Protocol-specific commands are namespaced under their protocol prefix (`/matrix …`, `/adc …`, `/discord …`, `/bitchat …`) so the command surface stays organized and composable regardless of how many protocols are active simultaneously. +Protocol-specific commands are namespaced under their protocol prefix (`/matrix …`, `/adc …`, `/discord …`) so the command surface stays organized and composable regardless of how many protocols are active simultaneously. --- @@ -61,7 +61,7 @@ Colors are managed through `NaimPalette`, a 15-field struct that maps directly t ### Window Management -Windows are first-class objects in the tab model. Each window carries its own message buffer, input line, cursor position, command history, scroll offset, and unread counter. The `TabTier` priority system (`Unread > Conversed > Inert`) orders windows for `Ctrl-N` navigation so you always land on the most relevant unread conversation first — not the next tab in insertion order. +Windows are first-class objects in the tab model. Each window carries its own message buffer, input line, cursor position, command history, scroll offset, and unread counter. `Ctrl-N` walks windows in **static insertion order** (as of 0.10.1 — the previous activity-tier priority system was reverted because users found the reordering non-deterministic and hard to build muscle memory around). Tabs that aren't cyclable (unjoined IRC channels, hidden server tabs) are skipped, but the relative order of the remaining tabs is preserved. The window list (`F4` to cycle through Auto/Visible/Hidden) displays protocol badges, per-window unread indicators, and highlights the active window. It occupies a fixed-width column on the right side of the chat area, overlapping rather than displacing message content — the same spatial model that made naim's window list usable on 80-column terminals. @@ -296,7 +296,9 @@ nirc-rs provides a unified slash-command interface. Every command is available b **Discord / Stout / Spacebar / Nerimity:** `/ join`, `/ leave`, `/ members`, `/ servers` -**BitChat:** `/bitchat peers`, `/bitchat dm`, `/bitchat send` +**Media (0.10.1):** `/url `, `/video `, `/image ` — open URLs externally, launch video in the OS default player, or attempt inline image rendering (falls back to `/url` if the terminal doesn't support inline images). + +**BitChat:** *Removed in 0.10.2.* See [NOTICES.md](NOTICES.md) for the rationale. ### UI and Display @@ -323,7 +325,7 @@ nirc-rs provides a unified slash-command interface. Every command is available b | `Left` / `Right` | Move cursor in input line | | `Home` / `End` | Previous / next window | | `Insert` | Scroll chat to bottom (release scroll lock) | -| `Ctrl-N` | Jump to next window with unread messages | +| `Ctrl-N` | Next window (insertion order, skips unjoined IRC channels) | | `Ctrl-B` | Jump back to previously active window | | `Ctrl-P` | Previous buffer | | `Ctrl-A` | Next active buffer | @@ -370,7 +372,7 @@ auto_connect = ["libera"] # servers to connect on startup # ─── Servers ──────────────────────────────────────────────────────────── [[servers]] name = "libera" -protocol = "irc" # irc | matrix | adc | discord | stout | spacebar | nerimity | bitchat +protocol = "irc" # irc | matrix | adc | discord | stout | spacebar | nerimity (bitchat removed in 0.10.2) address = "irc.libera.chat:6697" tls = true auto_join = ["#rust", "#nirc"] @@ -431,16 +433,22 @@ device_name = "nirc-rs" # access_token = "syt_abc..." # for session resume without password ``` -### BitChat P2P Configuration +### BitChat P2P Configuration — REMOVED in 0.10.2 + +BitChat server entries are no longer accepted. Any `[[servers]]` entry with +`protocol = "bitchat"` will be silently ignored at load time. See +[NOTICES.md](NOTICES.md) for the full rationale. If you previously had a +BitChat entry in your config, you can leave it (it will be ignored) or +remove it to clean up: ```toml -[[servers]] -name = "bitchat" -protocol = "bitchat" -address = "/ip4/0.0.0.0/tcp/9394" - -[servers.extra] -bootstrap = "/ip4/1.2.3.4/tcp/9394/p2p/QmSomePeerId" +# REMOVE THIS — no longer used: +# [[servers]] +# name = "bitchat" +# protocol = "bitchat" +# address = "/ip4/0.0.0.0/tcp/9394" +# [servers.extra] +# bootstrap = "/ip4/1.2.3.4/tcp/9394/p2p/QmSomePeerId" ``` --- diff --git a/STATUS.md b/STATUS.md index aa799a4..6af26aa 100755 --- a/STATUS.md +++ b/STATUS.md @@ -1,6 +1,6 @@ -# nirc-rs 0.10.1 — Status Report +# nirc-rs 0.10.2 — Status Report -**Version:** 0.10.1 +**Version:** 0.10.2 **Release date:** 2026-07 **Codename:** nirc-rs **License:** GPL-3.0-or-later @@ -20,7 +20,48 @@ | **Stout** | ✅ Complete | ❌ Untested | REST + WebSocket (Revolt fork) | | **Spacebar** | ✅ Complete | ❌ Untested | REST + WebSocket (Revolt fork) | | **Nerimity** | ✅ Complete | ❌ Untested | REST + WebSocket (custom platform) | -| **BitChat** | ✅ Complete | ❌ Untested | libp2p P2P, mDNS, gossipsub, noise | +| ~~**BitChat**~~ | ❌ **Withdrawn** | N/A | Removed in 0.10.2 — see [NOTICES.md](NOTICES.md) for the rationale (Jack Dorsey BitChat / India courts legal uncertainty) | + +--- + +## What's New in 0.10.2 + +### BitChat Protocol Module Withdrawn + +The BitChat protocol module (`src/protocols/bitchat.rs`) and all of its +integrations have been removed from the codebase. The `libp2p` dependency +in `Cargo.toml` was dropped at the same time — BitChat was the only +consumer. The Noise primitive in `src/engine/crypto.rs` uses +`x25519-dalek` + `aes-gcm` directly (not libp2p), so ADC's encrypted +client-client connections are unaffected. + +**Why:** The BitChat project (Jack Dorsey's recently-announced P2P +messaging protocol) is the subject of active litigation in the Indian +courts. The legal status of the protocol specification, the reference +implementation, and downstream reimplementations is currently unclear. +Pending clarity, we have removed the module entirely rather than ship an +encumbered protocol backend. See [NOTICES.md](NOTICES.md) for the full +rationale and re-evaluation criteria. + +**User impact:** Existing config entries with `protocol = "bitchat"` are +silently ignored. Old history files tagged `P2P:` are silently +reassigned to the Status tab. No data is lost; IRC / Matrix / ADC / +Discord / Stout / Spacebar / Nerimity configs and history are unaffected. + +**Removed code surface:** +- `src/protocols/bitchat.rs` (deleted) +- `ProtocolType::BitChat` enum variant + all match arms +- `Command::BitChatPeers`, `BitChatDm`, `BitChatSendFile` variants +- `ProtocolCommand::BitChat(BitChatCommand)` dispatcher variant +- `Dispatcher::connect_bitchat()` method +- F1 menu "Connect → BitChat…" entry +- `libp2p` Cargo dependency (only consumer was bitchat.rs) + +### Help text updated + +The `/help` output now mentions the new 0.10.1 media commands (`/url`, +`/video`, `/image`) and explicitly notes the BitChat removal with a +pointer to NOTICES.md. --- diff --git a/TODO.md b/TODO.md index 9de5329..b7862f2 100755 --- a/TODO.md +++ b/TODO.md @@ -16,11 +16,11 @@ _None at this time._ - [ ] **Test Discord protocol against a live server** — The Discord implementation uses Gateway WebSocket and REST API but has not been tested. Need to verify connection, event handling, and message send/receive. -- [ ] **Test remaining protocols** — Stout, Spacebar, Nerimity, and BitChat are all fully implemented but untested. Each needs a live server/peer to verify: +- [ ] **Test remaining protocols** — Stout, Spacebar, Nerimity are all fully implemented but untested. Each needs a live server/peer to verify: - [ ] Stout (Revolt-compatible fork) - [ ] Spacebar (Revolt fork) - [ ] Nerimity (custom platform) - - [ ] BitChat (P2P, libp2p, mDNS discovery) + (BitChat was on this list but was withdrawn in 0.10.2 — see NOTICES.md.) - [ ] **Inline image rendering (real implementation)** — The `try_render_inline_image()` function in `src/tui/media.rs` is currently a stub returning `Unsupported`. The real implementation needs to: - Fetch image bytes via reqwest (with a 4 MiB size cap) @@ -70,6 +70,7 @@ _None at this time._ ## Completed +- [x] **0.10.2: BitChat protocol module withdrawn** — Removed `src/protocols/bitchat.rs` and all integrations pending clarity on Jack Dorsey's BitChat project and the India courts situation. Dropped `libp2p` dependency. See NOTICES.md for the full rationale and re-evaluation criteria. - [x] **0.10.1: CTCP spec compliance** — Outgoing CTCP requests now use PRIVMSG (not NOTICE) per the IRCv3 CTCP spec. - [x] **0.10.1: Self-targeted CTCP visible** — `/ctcp mynick VERSION` now displays the request in the relevant tab instead of being silently swallowed. - [x] **0.10.1: /away tracking** — `is_away` / `away_message` tracked in ConnState; RPL_NOWAWAY (306) / RPL_UNAWAY (305) explicitly handled. diff --git a/completions/nirc.bash b/completions/nirc.bash index 7d2e951..a54d98a 100755 --- a/completions/nirc.bash +++ b/completions/nirc.bash @@ -15,7 +15,8 @@ _nirc() { jump jumpback close open winlist set get alias unalias bind unbind eval source echo clear clearall save help quit newconn server - matrix adc dc 'dc++' revolt stoat bitchat p2p + matrix adc dc 'dc++' revolt stoat discord spacebar nerimity + url video image ) # Matrix subcommands @@ -27,14 +28,11 @@ _nirc() { # ADC subcommands local adc_cmds=(search users broadcast get download dl) - # Revolt subcommands - local revolt_cmds=(join leave members) + # Revolt / Discord / Stout / Spacebar / Nerimity subcommands (same shape) + local revolt_cmds=(join leave members servers) - # BitChat subcommands - local bitchat_cmds=(peers dm msg send sendfile list) - - # Protocols for /connect - local protocols=(irc matrix adc dc 'dc++' bitchat revolt stoat) + # Protocols for /connect (bitchat removed in 0.10.2 — see NOTICES.md) + local protocols=(irc matrix adc dc 'dc++' discord stout spacebar nerimity revolt) case ${prev} in connect) @@ -49,14 +47,10 @@ _nirc() { COMPREPLY=($(compgen -W "${adc_cmds[*]}" -- "${cur}")) return ;; - revolt|stoat) + revolt|stoat|discord|spacebar|nerimity) COMPREPLY=($(compgen -W "${revolt_cmds[*]}" -- "${cur}")) return ;; - bitchat|p2p) - COMPREPLY=($(compgen -W "${bitchat_cmds[*]}" -- "${cur}")) - return - ;; 'matrix verify') # Complete with nothing special — user provides a user_id return @@ -67,9 +61,6 @@ _nirc() { 'matrix reply') return ;; - 'bitchat dm'|'bitchat send'|'bitchat sendfile'|'p2p dm'|'p2p send') - return - ;; esac # Default: offer all top-level commands @@ -79,7 +70,7 @@ _nirc() { # Also complete file paths for certain commands case ${words[1]} in - sendfile|acceptfile|source|'bitchat send'|'p2p send'|'bitchat sendfile'|'adc get'|'adc download'|'adc dl') + sendfile|acceptfile|source|'adc get'|'adc download'|'adc dl') _filedir return ;; diff --git a/completions/nirc.fish b/completions/nirc.fish index cbbf54c..88bdcf8 100755 --- a/completions/nirc.fish +++ b/completions/nirc.fish @@ -1,4 +1,4 @@ -# nirc-rs fish completion for 0.5.0 +# nirc-rs fish completion for 0.10.2 # Disable file completions unless we explicitly want them complete -c nirc -f @@ -15,12 +15,15 @@ complete -c nirc -k -x -a disconnect -d 'Disconnect from protocol' complete -c nirc -k -x -a newconn -d 'New connection dialog' complete -c nirc -k -x -a server -d 'Switch servers' -# After /connect, offer protocols +# After /connect, offer protocols (bitchat removed in 0.10.2 — see NOTICES.md) complete -c nirc -k -x -a '/connect irc' -d 'Connect via IRC' complete -c nirc -k -x -a '/connect matrix' -d 'Connect via Matrix' complete -c nirc -k -x -a '/connect adc' -d 'Connect via ADC/DC++' complete -c nirc -k -x -a '/connect dc' -d 'Connect via DC++' -complete -c nirc -k -x -a '/connect bitchat' -d 'Connect via BitChat P2P' +complete -c nirc -k -x -a '/connect discord' -d 'Connect via Discord' +complete -c nirc -k -x -a '/connect stout' -d 'Connect via Stout (Discord fork)' +complete -c nirc -k -x -a '/connect spacebar' -d 'Connect via Spacebar (Discord fork)' +complete -c nirc -k -x -a '/connect nerimity' -d 'Connect via Nerimity' complete -c nirc -k -x -a '/connect revolt' -d 'Connect via Revolt' # ═══ Messaging ═══ @@ -114,14 +117,31 @@ complete -c nirc -k -x -a '/adc get' -d 'Download file' complete -c nirc -k -x -a '/adc download' -d 'Download file' complete -c nirc -k -x -a '/adc dl' -d 'Download file' -# ═══ Revolt ═══ +# ═══ Revolt / Discord / Stout / Spacebar / Nerimity ═══ complete -c nirc -k -x -a '/revolt join' -d 'Join server' complete -c nirc -k -x -a '/revolt leave' -d 'Leave server' complete -c nirc -k -x -a '/revolt members' -d 'List members' +complete -c nirc -k -x -a '/revolt servers' -d 'List servers' +complete -c nirc -k -x -a '/discord join' -d 'Join server' +complete -c nirc -k -x -a '/discord leave' -d 'Leave server' +complete -c nirc -k -x -a '/discord members' -d 'List members' +complete -c nirc -k -x -a '/discord servers' -d 'List servers' +complete -c nirc -k -x -a '/stout join' -d 'Join server (Stout fork)' +complete -c nirc -k -x -a '/stout leave' -d 'Leave server (Stout fork)' +complete -c nirc -k -x -a '/stout members' -d 'List members (Stout fork)' +complete -c nirc -k -x -a '/stout servers' -d 'List servers (Stout fork)' +complete -c nirc -k -x -a '/spacebar join' -d 'Join server (Spacebar fork)' +complete -c nirc -k -x -a '/spacebar leave' -d 'Leave server (Spacebar fork)' +complete -c nirc -k -x -a '/spacebar members' -d 'List members (Spacebar fork)' +complete -c nirc -k -x -a '/spacebar servers' -d 'List servers (Spacebar fork)' +complete -c nirc -k -x -a '/nerimity join' -d 'Join server (Nerimity)' +complete -c nirc -k -x -a '/nerimity leave' -d 'Leave server (Nerimity)' +complete -c nirc -k -x -a '/nerimity members' -d 'List members (Nerimity)' +complete -c nirc -k -x -a '/nerimity servers' -d 'List servers (Nerimity)' -# ═══ BitChat P2P ═══ -complete -c nirc -k -x -a '/bitchat peers' -d 'List P2P peers' -complete -c nirc -k -x -a '/p2p peers' -d 'List P2P peers' -complete -c nirc -k -x -a '/bitchat dm' -d 'Send DM' -complete -c nirc -k -x -a '/bitchat send' -d 'Send file via P2P' -complete -c nirc -k -x -a '/bitchat sendfile' -d 'Send file via P2P' \ No newline at end of file +# ═══ Media (0.10.1) ═══ +complete -c nirc -k -x -a '/url' -d 'Open URL in OS default browser' +complete -c nirc -k -x -a '/video' -d 'Launch video in OS default player' +complete -c nirc -k -x -a '/image' -d 'Attempt inline image render (falls back to /url)' + +# BitChat P2P support was removed in 0.10.2. See NOTICES.md for the rationale. \ No newline at end of file diff --git a/completions/nirc.zsh b/completions/nirc.zsh index b27e935..53e4ba0 100755 --- a/completions/nirc.zsh +++ b/completions/nirc.zsh @@ -1,7 +1,7 @@ #compdef nirc nirc-rs -# nirc-rs zsh completion for 0.5.0 +# nirc-rs zsh completion for 0.10.2 -local -a subcommands protocols matrix_cmds adc_cmds revolt_cmds bitchat_cmds +local -a subcommands protocols matrix_cmds adc_cmds revolt_cmds subcommands=( 'connect:Connect to a server' @@ -64,16 +64,25 @@ subcommands=( 'dc:Alias for /adc' 'revolt:Revolt protocol commands' 'stoat:Alias for /revolt' - 'bitchat:BitChat P2P commands' - 'p2p:Alias for /bitchat' + 'discord:Discord protocol commands' + 'stout:Alias for /discord (Stout fork)' + 'spacebar:Spacebar protocol commands' + 'nerimity:Nerimity protocol commands' + 'url:Open URL in OS default browser' + 'video:Launch video in OS default player' + 'image:Attempt inline image render' ) +# Protocols for /connect (bitchat removed in 0.10.2 — see NOTICES.md) protocols=( 'irc:IRC protocol' 'matrix:Matrix protocol' 'adc:ADC/DC++ protocol' 'dc:Alias for adc' - 'bitchat:BitChat P2P' + 'discord:Discord protocol' + 'stout:Stout (Discord-API fork)' + 'spacebar:Spacebar (Discord-API fork)' + 'nerimity:Nerimity (custom platform)' 'revolt:Revolt protocol' 'stoat:Alias for revolt' ) @@ -107,15 +116,7 @@ revolt_cmds=( 'join:Join server' 'leave:Leave server' 'members:List members' -) - -bitchat_cmds=( - 'peers:List P2P peers' - 'dm:Send direct message' - 'msg:Send direct message' - 'send:Send file' - 'sendfile:Send file' - 'list:List P2P peers' + 'servers:List servers' ) _nirc_subcommand() { @@ -130,16 +131,13 @@ _nirc_subcommand() { adc|dc) _describe 'adc-command' adc_cmds ;; - revolt|stoat) + revolt|stoat|discord|spacebar|nerimity) _describe 'revolt-command' revolt_cmds ;; - bitchat|p2p) - _describe 'bitchat-command' bitchat_cmds - ;; sendfile|source|acceptfile) _files ;; - 'adc get'|'adc download'|'adc dl'|'bitchat send'|'bitchat sendfile'|'p2p send') + 'adc get'|'adc download'|'adc dl') _files ;; esac diff --git a/man/man1/nirc.1 b/man/man1/nirc.1 index 083399c..95dc171 100755 --- a/man/man1/nirc.1 +++ b/man/man1/nirc.1 @@ -1,9 +1,9 @@ .\" nirc-rs .\" Copyright (C) 2025 Jeremy Anderson .\" SPDX-License-Identifier: GPL-3.0-or-later -.TH NIRC 1 "2025-07-19" "nirc-rs 0.5.0" "User Commands" +.TH NIRC 1 "2026-07-29" "nirc-rs 0.10.2" "User Commands" .SH NAME -nirc \- multi-protocol terminal chat client (IRC, Matrix, ADC/DC++, Revolt, BitChat P2P) +nirc \- multi-protocol terminal chat client (IRC, Matrix, ADC/DC++, Discord, Stout, Spacebar, Nerimity) .SH SYNOPSIS .B nirc [\fIOPTIONS\fR] @@ -33,9 +33,14 @@ Revolt/Stoat (0.5.0+) REST + JSON WebSocket client with email/password or bot-token auth, server join/leave, member listing, session token persistence. .TP -BitChat P2P (0.5.0+) -libp2p Gossipsub chat, mDNS local discovery, Identify remote discovery, -direct messages, P2P file transfer via request-response. +Discord / Stout / Spacebar / Nerimity (0.6.0+) +REST + WebSocket clients for Discord-API-compatible and custom platforms. +.PP +Note: BitChat P2P support was withdrawn in 0.10.2 pending clarity on +Jack Dorsey's BitChat project and the India courts situation. +See +.I NOTICES.md +for the full rationale. .SH OPTIONS .TP .B \-h, \-\-help @@ -88,8 +93,12 @@ is one of .BR matrix , .BR adc , .BR dc , -.BR bitchat , +.BR discord , +.BR stout , +.BR spacebar , +.BR nerimity , .BR revolt . +(BitChat was removed in 0.10.2 — see NOTICES.md.) .TP .B /disconnect [protocol] Disconnect from a specific protocol, or all. @@ -264,19 +273,13 @@ Leave a server. .TP .B /revolt members List server members. -.SS BitChat P2P -.TP -.B /bitchat peers -.B /p2p peers -List discovered P2P peers. -.TP -.B /bitchat dm -.B /p2p msg -Send a direct message. -.TP -.B /bitchat send -.B /p2p send -Send a file via P2P. +.SS BitChat P2P \(em Removed in 0.10.2 +BitChat support was withdrawn pending clarity on Jack Dorsey's BitChat +project and the India courts situation. See +.I NOTICES.md +for the full rationale. Existing config entries with +.B protocol = "bitchat" +are silently ignored at load time. .SS Window Management .TP .B /win [N] @@ -399,12 +402,9 @@ password = "hunter2" .fi .PP .nf -[[servers]] -name = "bitchat" -protocol = "bitchat" -address = "/ip4/0.0.0.0/tcp/9394" -[servers.extra] -bootstrap = "/ip4/1.2.3.4/tcp/9394/p2p/QmPeerId" +# BitChat server entries are no longer accepted (removed in 0.10.2). +# Any [[servers]] block with protocol = "bitchat" is silently ignored. +# See NOTICES.md for the rationale. .fi .SH FILES .TP diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD index da01dd8..2e7efe3 100755 --- a/packaging/PKGBUILD +++ b/packaging/PKGBUILD @@ -1,8 +1,8 @@ # Maintainer: Jeremy Anderson pkgname=nirc-rs -pkgver=0.8.1 +pkgver=0.10.2 pkgrel=1 -pkgdesc="multi-protocol terminal chat client (IRC, Matrix, ADC/DC++, Revolt, BitChat P2P)" +pkgdesc="multi-protocol terminal chat client (IRC, Matrix, ADC/DC++, Discord, Stout, Spacebar, Nerimity)" arch=('x86_64' 'aarch64') url="https://git.dcos.net/dcosnet/nirc-rs" license=('GPL-3.0-or-later') diff --git a/packaging/debian/DEBIAN/control b/packaging/debian/DEBIAN/control index 468efb0..6a496cb 100755 --- a/packaging/debian/DEBIAN/control +++ b/packaging/debian/DEBIAN/control @@ -1,5 +1,5 @@ Package: nirc -Version: 0.8.1 +Version: 0.10.2 Section: net Priority: optional Maintainer: Jeremy Anderson @@ -13,14 +13,17 @@ License: GPL-3.0-or-later Description: multi-protocol terminal chat client nirc-rs is a terminal-based chat client built with ratatui. It supports IRC (with TLS, SASL, IRCv3), Matrix (with E2EE), ADC/DC++ file sharing, - Revolt, and BitChat P2P (libp2p/Gossipsub). + Discord, Stout, Spacebar, and Nerimity. (BitChat P2P support was + removed in 0.10.2 — see NOTICES.md for the rationale.) . Features: - - Multi-protocol: IRC, Matrix, ADC/DC++, Revolt, BitChat P2P + - Multi-protocol: IRC, Matrix, ADC/DC++, Discord, Stout, Spacebar, Nerimity - 4 built-in themes: default, solarized, gruvbox, dracula - Encrypted identity vault (AES-256-GCM) - SASL + TLS for IRC - Megolm E2EE for Matrix - - DCC/ADC + P2P file transfers + - DCC/ADC file transfers with bandwidth monitor - Dynamic plugin system (.so / .dylib) - - Full naim-style command set with aliases, key bindings, and scripting \ No newline at end of file + - Full naim-style command set with aliases, key bindings, and scripting + - URL detection + /url /video /image media commands (0.10.1) + - Input rate throttle + line guard (0.10.1) \ No newline at end of file diff --git a/packaging/nirc.spec b/packaging/nirc.spec index ccc8747..c1233ce 100755 --- a/packaging/nirc.spec +++ b/packaging/nirc.spec @@ -1,5 +1,5 @@ Name: nirc -Version: 0.8.1 +Version: 0.10.2 Release: 1%{?dist} Summary: multi-protocol terminal chat client @@ -13,8 +13,9 @@ BuildRequires: pkg-config %description nirc-rs is a terminal-based chat client built with ratatui supporting IRC -(with TLS, SASL, IRCv3), Matrix (with E2EE), ADC/DC++, Revolt, and BitChat -P2P (libp2p/Gossipsub). +(with TLS, SASL, IRCv3), Matrix (with E2EE), ADC/DC++, Discord, Stout, +Spacebar, and Nerimity. (BitChat P2P support was removed in 0.10.2 — +see NOTICES.md for the rationale.) %prep %autosetup @@ -43,6 +44,13 @@ cargo test --release --locked %{_datadir}/fish/vendor_completions.d/nirc.fish %changelog +* Wed Jul 29 2026 Jeremy Anderson - 0.10.2-1 +- BitChat P2P module withdrawn (India courts legal uncertainty) +- libp2p dependency dropped (only consumer was bitchat) +- 0.10.1: IRC CTCP/away/who fixes, input throttle + line guard, + channel rotation reverted to insertion order, URL detection + + inline photo / external video framework, top-right bandwidth + monitor, line wrapping fix * Sat Jul 19 2025 Jeremy Anderson - 0.5.0-1 - Initial RPM packaging - 0.5.0: BitChat P2P (libp2p), Revolt/Stoat protocol diff --git a/quickstart.md b/quickstart.md index 82e3ccd..f5db7fb 100755 --- a/quickstart.md +++ b/quickstart.md @@ -72,19 +72,29 @@ address = "https://discord.com/api" bot_token = "BOT_TOKEN_HERE" ``` -## Connect to BitChat (P2P) +## BitChat (P2P) — Removed in 0.10.2 + +BitChat support was withdrawn in 0.10.2 pending clarity on Jack Dorsey's +BitChat project and the India courts situation. See +[NOTICES.md](NOTICES.md) for the full rationale. Existing config entries +with `protocol = "bitchat"` are silently ignored at load time — you can +leave them in place or remove them to clean up: ```toml -[[servers]] -name = "p2p" -protocol = "bitchat" -address = "/ip4/0.0.0.0/tcp/9394" -[servers.extra] -nickname = "handle" -# Optional: bootstrap to a known peer +# REMOVE THIS — no longer used: +# [[servers]] +# name = "p2p" +# protocol = "bitchat" +# address = "/ip4/0.0.0.0/tcp/9394" +# [servers.extra] +# nickname = "handle" # bootstrap = "/ip4/1.2.3.4/tcp/9394/p2p/QmPeerId" ``` +If you want P2P-style direct messaging in the meantime, ADC's +client-client connections offer direct file transfer and direct messages +over a hub-and-spoke topology. + ## Key Bindings | Key | Action | diff --git a/src/config/mod.rs b/src/config/mod.rs index 07facc5..ad51819 100755 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -30,21 +30,15 @@ //! Matrix-specific connection parameters are pulled from the `extra` map at //! connect time by [`matrix_config_from_entry`]. //! -//! ## BitChat P2P server entries (0.5.0) +//! ## BitChat P2P server entries — REMOVED in 0.10.2 //! -//! BitChat servers are configured as `[[servers]]` entries with `protocol = "bitchat"`. -//! The `address` field is the listen multiaddr (e.g. `/ip4/0.0.0.0/tcp/9394`). -//! Optional bootstrap node in `[servers.extra]`: -//! -//! ```toml -//! [[servers]] -//! name = "bitchat" -//! protocol = "bitchat" -//! address = "/ip4/0.0.0.0/tcp/9394" -//! -//! [servers.extra] -//! bootstrap = "/ip4/1.2.3.4/tcp/9394/p2p/QmSomePeerId" -//! ``` +//! BitChat server entries are no longer accepted. Any `[[servers]]` entry +//! with `protocol = "bitchat"` will be silently ignored at load time. The +//! module was removed pending clarity on Jack Dorsey's BitChat project and +//! the India courts situation — see NOTICES.md for the full rationale. +//! Existing config files do not need to be edited (the unknown protocol +//! value is treated as a parse-time skip rather than an error), but users +//! may remove the entries to clean up their config. use crate::core::protocol::ProtocolType; use crate::tui::foundation::Theme; diff --git a/src/core/app.rs b/src/core/app.rs index 206fedc..53ec506 100755 --- a/src/core/app.rs +++ b/src/core/app.rs @@ -747,7 +747,7 @@ mod tests { let mut app = app_with_tabs(&[ (ProtocolType::Irc, "#irc", false), (ProtocolType::Matrix, "#mtx", false), - (ProtocolType::BitChat, "#p2p", false), + (ProtocolType::Adc, "#adc", false), (ProtocolType::Discord, "#dsc", false), ]); // Converse in all of them so none are inert. @@ -762,7 +762,7 @@ mod tests { let next = app.next_tab_by_priority(0); assert_eq!(next, 1, "Ctrl-N from IRC lands on Matrix (insertion order)"); let proto = app.tab_at(next).unwrap().protocol; - assert!(matches!(proto, ProtocolType::Matrix | ProtocolType::BitChat | ProtocolType::Discord), + assert!(matches!(proto, ProtocolType::Matrix | ProtocolType::Adc | ProtocolType::Discord), "Ctrl-N from IRC must land on a different protocol's tab; got {:?}", proto); } diff --git a/src/core/command.rs b/src/core/command.rs index 9a05474..24e4adb 100755 --- a/src/core/command.rs +++ b/src/core/command.rs @@ -226,13 +226,9 @@ pub enum Command { NerimityMembers { server_id: String }, NerimityServers, - // ─── Phase F — BitChat (P2P) commands ──────────────────── - /// `/bitchat peers` — list discovered P2P peers. - BitChatPeers, - /// `/bitchat dm ` — send a direct message. - BitChatDm { peer_id: String, body: String }, - /// `/bitchat send ` — send a file via P2P. - BitChatSendFile { peer_id: String, path: String }, + // NOTE: BitChat (P2P) commands were removed in 0.10.2 pending clarity + // on Jack Dorsey's BitChat project and the India courts situation. + // See NOTICES.md for the full rationale. // ─── N-3.1: Plugin management commands ──────────────────────────── /// `/plugins` — list loaded plugins. @@ -370,7 +366,6 @@ pub fn parse_command(input: &str) -> Option { "matrix" | "mtx" => ProtocolType::Matrix, "discord" | "dc" => ProtocolType::Discord, "adc" => ProtocolType::Adc, - "bitchat" | "bc" | "p2p" => ProtocolType::BitChat, "stout" => ProtocolType::Stout, "spacebar" | "sb" => ProtocolType::Spacebar, "nerimity" | "nm" => ProtocolType::Nerimity, @@ -627,24 +622,8 @@ pub fn parse_command(input: &str) -> Option { } } - // ─── BitChat (P2P) commands ──────────────────────── - "bitchat" | "p2p" => { - let sub = args.first().map(|s| s.to_lowercase()); - match sub.as_deref() { - Some("peers") | Some("list") => Some(Command::BitChatPeers), - Some("dm") | Some("msg") => { - let peer_id = args.get(1)?.clone(); - let body = if args.len() > 2 { args[2..].join(" ") } else { None? }; - Some(Command::BitChatDm { peer_id, body }) - } - Some("send") | Some("sendfile") | Some("file") => { - let peer_id = args.get(1)?.clone(); - let path = args.get(2)?.clone(); - Some(Command::BitChatSendFile { peer_id, path }) - } - _ => None, - } - } + // NOTE: `/bitchat` and `/p2p` commands removed in 0.10.2. + // See NOTICES.md for the rationale. // ─── N-3.1: Plugin management commands ──────────────────────── "plugins" | "plugin-list" => Some(Command::PluginList), @@ -660,7 +639,10 @@ pub fn parse_command(input: &str) -> Option { // All three accept a single URL argument. The URL is taken as the // full remainder of the input (so spaces in URLs are preserved, // though URLs shouldn't contain unencoded spaces anyway). - "url" | "open" | "browse" => Some(Command::Url { target: args.join(" ") }), + // NOTE: "open" is intentionally NOT an alias here — it's already + // bound to Command::Open (the /query / /open PM-window command) + // at the earlier match arm. Use "url" or "browse" instead. + "url" | "browse" => Some(Command::Url { target: args.join(" ") }), "video" | "play" => Some(Command::Video { target: args.join(" ") }), "image" | "img" | "photo" => Some(Command::Image { target: args.join(" ") }), @@ -707,7 +689,6 @@ impl FromStr for ProtocolType { "irc" => Ok(ProtocolType::Irc), "matrix" => Ok(ProtocolType::Matrix), "adc" | "dc" | "dc++" => Ok(ProtocolType::Adc), - "bitchat" => Ok(ProtocolType::BitChat), "discord" => Ok(ProtocolType::Discord), "stout" => Ok(ProtocolType::Stout), "spacebar" => Ok(ProtocolType::Spacebar), diff --git a/src/core/history.rs b/src/core/history.rs index f8ffdd6..f9b05aa 100644 --- a/src/core/history.rs +++ b/src/core/history.rs @@ -96,7 +96,8 @@ fn protocol_from_tag(tag: &str) -> Option { "IRC" => Some(ProtocolType::Irc), "Mtx" => Some(ProtocolType::Matrix), "ADC" => Some(ProtocolType::Adc), - "P2P" => Some(ProtocolType::BitChat), + // "P2P" (BitChat) removed in 0.10.2 — old history files with this + // tag will be silently assigned to the Status tab. "Dsc" => Some(ProtocolType::Discord), "Sto" => Some(ProtocolType::Stout), "Spc" => Some(ProtocolType::Spacebar), diff --git a/src/core/protocol.rs b/src/core/protocol.rs index 40cb0f8..23c5820 100755 --- a/src/core/protocol.rs +++ b/src/core/protocol.rs @@ -3,13 +3,17 @@ use serde::{Deserialize, Serialize}; use std::fmt; -/// Supported chat protocols (Tox removed per design decision). +/// Supported chat protocols. +/// +/// BitChat was removed in 0.10.2 pending clarity on Jack Dorsey's BitChat +/// project and the India courts situation. See NOTICES.md for the full +/// rationale. The variant will be restored if/when the legal status of the +/// protocol and its reference implementation is clarified. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum ProtocolType { Irc, Matrix, Adc, - BitChat, Discord, Stout, Spacebar, @@ -29,7 +33,6 @@ impl ProtocolType { ProtocolType::Irc => "IRC", ProtocolType::Matrix => "Mtx", ProtocolType::Adc => "ADC", - ProtocolType::BitChat => "P2P", ProtocolType::Discord => "Dsc", ProtocolType::Stout => "Sto", ProtocolType::Spacebar => "Spc", @@ -43,7 +46,6 @@ impl ProtocolType { ProtocolType::Irc => "IRC", ProtocolType::Matrix => "Matrix", ProtocolType::Adc => "ADC/DC++", - ProtocolType::BitChat => "BitChat", ProtocolType::Discord => "Discord", ProtocolType::Stout => "Stout", ProtocolType::Spacebar => "Spacebar", @@ -56,13 +58,11 @@ impl ProtocolType { /// - IRC channels start with `#` /// - Matrix room IDs/aliases use `:` as the homeserver separator /// - ADC hubs are commonly referenced as `+hub` - /// - BitChat is peer-to-peer (`~` home / personal node) pub fn badge(self) -> &'static str { match self { ProtocolType::Irc => "#", ProtocolType::Matrix => ":", ProtocolType::Adc => "+", - ProtocolType::BitChat => "~", ProtocolType::Discord => "D", ProtocolType::Stout => "St", ProtocolType::Spacebar => "S", @@ -71,13 +71,12 @@ impl ProtocolType { } /// 8-color NaimColor for protocol indicator (matches NaimPalette categories). - /// IRC = cyan (existing), Matrix = magenta, ADC = blue, BitChat = green. + /// IRC = cyan, Matrix = magenta, ADC = blue. pub fn naim_color(self) -> crate::tui::foundation::NaimColor { match self { ProtocolType::Irc => crate::tui::foundation::NaimColor::Cyan, ProtocolType::Matrix => crate::tui::foundation::NaimColor::Magenta, ProtocolType::Adc => crate::tui::foundation::NaimColor::Blue, - ProtocolType::BitChat => crate::tui::foundation::NaimColor::Green, ProtocolType::Discord => crate::tui::foundation::NaimColor::White, ProtocolType::Stout => crate::tui::foundation::NaimColor::Yellow, ProtocolType::Spacebar => crate::tui::foundation::NaimColor::Red, @@ -131,7 +130,6 @@ mod tests { assert_eq!(ProtocolType::Irc.tag(), "IRC"); assert_eq!(ProtocolType::Matrix.tag(), "Mtx"); assert_eq!(ProtocolType::Adc.tag(), "ADC"); - assert_eq!(ProtocolType::BitChat.tag(), "P2P"); assert_eq!(ProtocolType::Discord.tag(), "Dsc"); assert_eq!(ProtocolType::Stout.tag(), "Sto"); assert_eq!(ProtocolType::Spacebar.tag(), "Spc"); @@ -143,7 +141,6 @@ mod tests { assert_eq!(ProtocolType::Irc.badge(), "#"); assert_eq!(ProtocolType::Matrix.badge(), ":"); assert_eq!(ProtocolType::Adc.badge(), "+"); - assert_eq!(ProtocolType::BitChat.badge(), "~"); assert_eq!(ProtocolType::Discord.badge(), "D"); assert_eq!(ProtocolType::Stout.badge(), "St"); assert_eq!(ProtocolType::Spacebar.badge(), "S"); @@ -156,7 +153,6 @@ mod tests { assert_eq!(ProtocolType::Irc.naim_color(), NaimColor::Cyan); assert_eq!(ProtocolType::Matrix.naim_color(), NaimColor::Magenta); assert_eq!(ProtocolType::Adc.naim_color(), NaimColor::Blue); - assert_eq!(ProtocolType::BitChat.naim_color(), NaimColor::Green); assert_eq!(ProtocolType::Discord.naim_color(), NaimColor::White); assert_eq!(ProtocolType::Stout.naim_color(), NaimColor::Yellow); assert_eq!(ProtocolType::Spacebar.naim_color(), NaimColor::Red); @@ -168,7 +164,6 @@ mod tests { assert_eq!(ProtocolType::Irc.label(), "IRC"); assert_eq!(ProtocolType::Matrix.label(), "Matrix"); assert_eq!(format!("{}", ProtocolType::Adc), "ADC/DC++"); - assert_eq!(format!("{}", ProtocolType::BitChat), "BitChat"); assert_eq!(format!("{}", ProtocolType::Discord), "Discord"); assert_eq!(format!("{}", ProtocolType::Stout), "Stout"); assert_eq!(format!("{}", ProtocolType::Spacebar), "Spacebar"); diff --git a/src/engine/crypto.rs b/src/engine/crypto.rs index 7afe0e3..e779837 100755 --- a/src/engine/crypto.rs +++ b/src/engine/crypto.rs @@ -1,12 +1,14 @@ -//! Encrypted P2P tunnel layer — Phase 16. +//! Encrypted tunnel layer — Phase 16. //! //! Wraps any async Read+Write stream (yamux, TCP) with the Noise Protocol //! Framework (Noise_XX pattern) for forward-secret, authenticated encryption. //! The libp2p `noise` crate handles the handshake; we wrap the resulting //! encrypted stream for use by the transfer engine and protocol backends. //! -//! In production, this is automatically provided by libp2p's transport layer -//! for BitChat. This module exposes the building blocks for: +//! As of 0.10.2, this module is used by ADC's encrypted client-client (C-C) +//! connections. (It was previously also used by BitChat P2P, which was +//! removed in 0.10.2 — see NOTICES.md.) The module exposes the building +//! blocks for: //! - Manual encrypted tunnels to non-libp2p peers //! - End-to-end encrypted yamux substreams //! - Keypair generation and fingerprinting diff --git a/src/engine/dispatcher.rs b/src/engine/dispatcher.rs index fdef375..d0d293c 100755 --- a/src/engine/dispatcher.rs +++ b/src/engine/dispatcher.rs @@ -4,7 +4,7 @@ use crate::config::ServerEntry; use crate::core::command::Command; use crate::core::message::ChatMessage; use crate::core::protocol::ProtocolType; -use crate::protocols::{adc::{self, AdcCommand, AdcConfig}, bitchat::{self, BitChatCommand, BitChatConfig}, discord::{self, DiscordCommand, DiscordConfig}, irc::{self, IrcCommand, IrcConfig}, matrix::{self, MatrixCommand, MatrixConfig}, stout::{self, StoutCommand, StoutConfig}, spacebar::{self, SpacebarCommand, SpacebarConfig}, nerimity::{self, NerimityCommand, NerimityConfig}}; +use crate::protocols::{adc::{self, AdcCommand, AdcConfig}, discord::{self, DiscordCommand, DiscordConfig}, irc::{self, IrcCommand, IrcConfig}, matrix::{self, MatrixCommand, MatrixConfig}, stout::{self, StoutCommand, StoutConfig}, spacebar::{self, SpacebarCommand, SpacebarConfig}, nerimity::{self, NerimityCommand, NerimityConfig}}; use std::collections::HashMap; use std::sync::Arc; use std::sync::atomic::AtomicBool; @@ -18,7 +18,6 @@ pub enum ProtocolCommand { Irc(IrcCommand), Adc(AdcCommand), Matrix(MatrixCommand), - BitChat(BitChatCommand), Discord(DiscordCommand), Stout(StoutCommand), Spacebar(SpacebarCommand), @@ -121,7 +120,6 @@ impl Dispatcher { ProtocolType::Irc => self.connect_irc(server).await, ProtocolType::Adc => self.connect_adc(server).await, ProtocolType::Matrix => self.connect_matrix(server).await, - ProtocolType::BitChat => self.connect_bitchat(server).await, ProtocolType::Discord => self.connect_discord(server).await, ProtocolType::Stout => self.connect_stout(server).await, ProtocolType::Spacebar => self.connect_spacebar(server).await, @@ -338,36 +336,7 @@ impl Dispatcher { Ok(()) } - async fn connect_bitchat(&mut self, server: &str) -> anyhow::Result<()> { - let (proto_tx, mut proto_rx) = mpsc::channel::(64); - let (bc_cmd_tx, bc_cmd_rx) = mpsc::channel::(64); - tokio::spawn(async move { - while let Some(ProtocolCommand::BitChat(cmd)) = proto_rx.recv().await { - if bc_cmd_tx.send(cmd).await.is_err() { break; } - } - }); - - // Look up ServerEntry for BitChat-specific config (bootstrap node). - let entry = self.server_entries.iter() - .find(|e| e.name == server || e.address == server).cloned(); - let listen_addr = entry.as_ref() - .map(|e| e.address.clone()) - .unwrap_or_else(|| server.to_owned()); - let bootstrap = entry.as_ref().and_then(|e| e.extra.get("bootstrap").cloned()); - - let config = BitChatConfig { - listen_addr, - nickname: self.nickname.clone(), - bootstrap, - tx: self.msg_tx.clone(), - }; - let addr_owned = server.to_owned(); - tokio::spawn(async move { match bitchat::run_bitchat(config, bc_cmd_rx).await { Ok(()) => info!(%addr_owned, "BitChat stopped"), Err(e) => error!(%addr_owned, %e, "BitChat error") } }); - self.protocol_channels.insert(ProtocolType::BitChat, proto_tx.clone()); - self.handles.push(ProtocolHandle { protocol: ProtocolType::BitChat, server: server.to_owned(), cmd_tx: proto_tx }); - let _ = self.event_tx.send(DispatcherEvent::ProtocolConnected { protocol: ProtocolType::BitChat, server: server.to_owned() }).await; - Ok(()) - } + // NOTE: connect_bitchat() was removed in 0.10.2. See NOTICES.md. /// Connect Stout (Discord-API-compatible self-hosted platform). async fn connect_stout(&mut self, server: &str) -> anyhow::Result<()> { @@ -550,7 +519,6 @@ impl Dispatcher { ("IRC", ProtocolType::Irc), ("Mtx", ProtocolType::Matrix), ("ADC", ProtocolType::Adc), - ("P2P", ProtocolType::BitChat), ("Dsc", ProtocolType::Discord), ("Sto", ProtocolType::Stout), ("Spc", ProtocolType::Spacebar), @@ -579,7 +547,6 @@ impl Dispatcher { ProtocolType::Irc => ProtocolCommand::Irc(IrcCommand::Msg { target: target.clone(), body: body.clone() }), ProtocolType::Matrix => ProtocolCommand::Matrix(MatrixCommand::Msg { room_id: target.clone(), body: body.clone() }), ProtocolType::Adc => ProtocolCommand::Adc(AdcCommand::Msg { target_sid: target.clone(), body: body.clone() }), - ProtocolType::BitChat => ProtocolCommand::BitChat(BitChatCommand::Chat { body: body.clone() }), ProtocolType::Discord => ProtocolCommand::Discord(DiscordCommand::Msg { channel_id: target.clone(), body: body.clone() }), ProtocolType::Stout => ProtocolCommand::Stout(StoutCommand::Msg { channel_id: target.clone(), body: body.clone() }), ProtocolType::Spacebar => ProtocolCommand::Spacebar(SpacebarCommand::Msg { channel_id: target.clone(), body: body.clone() }), @@ -599,7 +566,6 @@ impl Dispatcher { ProtocolType::Spacebar => ProtocolCommand::Spacebar(SpacebarCommand::Emote { channel_id: target.clone(), body }), ProtocolType::Nerimity => ProtocolCommand::Nerimity(NerimityCommand::Emote { channel_id: target.clone(), body }), ProtocolType::Adc => ProtocolCommand::Adc(AdcCommand::Msg { target_sid: target.clone(), body: format!("* {} {}", nickname, body) }), - ProtocolType::BitChat => ProtocolCommand::BitChat(BitChatCommand::Chat { body: format!("* {} {}", nickname, body) }), }).await; } Command::Names { channel } => { self.send_irc(IrcCommand::Names(channel)).await; } @@ -720,7 +686,6 @@ impl Dispatcher { ProtocolType::Irc => ProtocolCommand::Irc(IrcCommand::Msg { target: target.clone(), body: msg.clone() }), ProtocolType::Matrix => ProtocolCommand::Matrix(MatrixCommand::Msg { room_id: target.clone(), body: msg.clone() }), ProtocolType::Adc => ProtocolCommand::Adc(AdcCommand::Msg { target_sid: target.clone(), body: msg.clone() }), - ProtocolType::BitChat => ProtocolCommand::BitChat(BitChatCommand::Chat { body: msg.clone() }), ProtocolType::Discord => ProtocolCommand::Discord(DiscordCommand::Msg { channel_id: target.clone(), body: msg.clone() }), ProtocolType::Stout => ProtocolCommand::Stout(StoutCommand::Msg { channel_id: target.clone(), body: msg.clone() }), ProtocolType::Spacebar => ProtocolCommand::Spacebar(SpacebarCommand::Msg { channel_id: target.clone(), body: msg.clone() }), @@ -1001,18 +966,17 @@ impl Dispatcher { self.send_to_protocol(ProtocolType::Nerimity, |_| ProtocolCommand::Nerimity(NerimityCommand::ListServers)).await; } - // ─── BitChat (P2P) commands ───────────────────── - Command::BitChatPeers => { - self.send_to_protocol(ProtocolType::BitChat, - |_| ProtocolCommand::BitChat(BitChatCommand::ListPeers)).await; - } - Command::BitChatDm { peer_id, body } => { - self.send_to_protocol(ProtocolType::BitChat, - |_| ProtocolCommand::BitChat(BitChatCommand::Direct { peer_id, body })).await; - } - Command::BitChatSendFile { peer_id, path } => { - self.send_to_protocol(ProtocolType::BitChat, - |_| ProtocolCommand::BitChat(BitChatCommand::SendFile { peer_id, path })).await; + // NOTE: BitChat (P2P) command handlers removed in 0.10.2. + // See NOTICES.md for the rationale. + // + // Media commands (0.10.1): /url, /video, /image are handled + // entirely in main.rs's handle_user_command (they call + // tui::media::open_external locally and never touch the + // network). They should never reach the dispatcher, but the + // match must be exhaustive — explicit no-op arms document + // that intent and silence the compiler. + Command::Url { .. } | Command::Video { .. } | Command::Image { .. } => { + debug!("media command reached dispatcher — should have been handled locally"); } } } @@ -1090,7 +1054,6 @@ impl Dispatcher { ProtocolType::Irc => ProtocolCommand::Irc(IrcCommand::Quit(None)), ProtocolType::Adc => ProtocolCommand::Adc(AdcCommand::Quit), ProtocolType::Matrix => ProtocolCommand::Matrix(MatrixCommand::Quit), - ProtocolType::BitChat => ProtocolCommand::BitChat(BitChatCommand::Quit), ProtocolType::Discord => ProtocolCommand::Discord(DiscordCommand::Quit), ProtocolType::Stout => ProtocolCommand::Stout(StoutCommand::Quit), ProtocolType::Spacebar => ProtocolCommand::Spacebar(SpacebarCommand::Quit), diff --git a/src/logging/mod.rs b/src/logging/mod.rs index 702661b..5cc7e8b 100755 --- a/src/logging/mod.rs +++ b/src/logging/mod.rs @@ -80,7 +80,6 @@ fn sanitize_server(proto: ProtocolType, server: &str) -> String { ProtocolType::Irc => "irc", ProtocolType::Matrix => "matrix", ProtocolType::Adc => "adc", - ProtocolType::BitChat => "bitchat", ProtocolType::Discord => "discord", ProtocolType::Stout => "stout", ProtocolType::Spacebar => "spacebar", @@ -337,7 +336,7 @@ mod tests { "matrix_matrix.org" ); assert_eq!(sanitize_server(ProtocolType::Adc, ""), "adc"); - assert_eq!(sanitize_server(ProtocolType::BitChat, ""), "bitchat"); + assert_eq!(sanitize_server(ProtocolType::Discord, ""), "discord"); } #[test] diff --git a/src/main.rs b/src/main.rs index 1899259..50125b9 100755 --- a/src/main.rs +++ b/src/main.rs @@ -357,9 +357,11 @@ async fn main() -> anyhow::Result<()> { info!(count = custom_keybindings.len(), "Custom keybindings loaded from config"); } - // P2P identity - let _p2p_keypair = engine::crypto::NoiseKeypair::generate(); - info!(fingerprint = %_p2p_keypair.fingerprint, "P2P identity key generated"); + // Noise identity keypair — used by ADC's encrypted C-C connections. + // (BitChat P2P identity generation was removed in 0.10.2; the underlying + // Noise primitive is retained because ADC's C-C connections use it.) + let _noise_keypair = engine::crypto::NoiseKeypair::generate(); + info!(fingerprint = %_noise_keypair.fingerprint, "Noise identity key generated"); // Spawn dispatcher with server entries (for TLS/SASL config lookup) let mut dispatcher = Dispatcher::new(dispatcher_cmd_rx, event_tx, config.global.nickname.clone()); @@ -1415,11 +1417,14 @@ async fn handle_user_command( " /adc broadcast Broadcast to hub\n", " /adc get Download file from user\n", "\n", - "BitChat P2P (0.5.0):\n", - " /connect bitchat Connect (uses config for listen/bootstrap)\n", - " /bitchat peers List discovered P2P peers\n", - " /bitchat dm Send a direct message\n", - " /bitchat send Send a file via P2P\n", + "Media (0.10.1):\n", + " /url Open URL in OS default browser\n", + " /video Launch video in OS default player\n", + " /image Attempt inline image (falls back to /url)\n", + "\n", + "Note: BitChat P2P support was removed in 0.10.2 pending clarity on\n", + " Jack Dorsey's BitChat project and the India courts situation.\n", + " See NOTICES.md for the full rationale.\n", ); let msg = ChatMessage::notice(ProtocolType::Irc, "Status", help_text); ctx.app.route_message(msg); @@ -1438,10 +1443,7 @@ async fn handle_user_command( Command::NerimityJoin { .. } | Command::NerimityLeave { .. } | Command::NerimityMembers { .. } | Command::NerimityServers => { let _ = dispatcher_cmd_tx.send(cmd.clone()).await; } - Command::BitChatPeers | Command::BitChatDm { .. } | Command::BitChatSendFile { .. } => { - // Forward BitChat commands to dispatcher. - let _ = dispatcher_cmd_tx.send(cmd.clone()).await; - } + // NOTE: BitChat command handlers removed in 0.10.2. See NOTICES.md. Command::PluginList => { let plugins = plugin_manager.list_plugins(); if plugins.is_empty() { diff --git a/src/protocols/irc.rs b/src/protocols/irc.rs index 5db0936..e041fe0 100755 --- a/src/protocols/irc.rs +++ b/src/protocols/irc.rs @@ -1508,6 +1508,15 @@ async fn handle_command( // (NOTICE must never trigger an automated reply per RFC 1459). // This is why `/ctcp VERSION` was silently ignored. let req = request.as_str(); + // Build the local-notice label first (borrows `message`), then + // consume `message` into the wire line. Doing it in this order + // avoids the "use of moved value" that would occur if we built + // the line first and then tried to read `message` again for the + // label. + let label = match &message { + Some(msg) => format!("CTCP {req} to {target}: {msg}"), + None => format!("CTCP {req} to {target}"), + }; let line = match message { Some(msg) => format!("PRIVMSG {} :\x01{} {}\x01\r\n", target, req, msg), None => format!("PRIVMSG {} :\x01{}\x01\r\n", target, req), @@ -1517,10 +1526,6 @@ async fn handle_command( // Surface a local notice so the user sees the request was sent, // even before the reply arrives. This also makes self-targeted // CTCP queries (e.g. `/ctcp mynick VERSION`) visible. - let label = match message { - Some(msg) => format!("CTCP {req} to {target}: {msg}"), - None => format!("CTCP {req} to {target}"), - }; let _ = tx.send(ChatMessage::notice( ProtocolType::Irc, server, &label, )).await; diff --git a/src/protocols/mod.rs b/src/protocols/mod.rs index 6c67a95..3ac9d3a 100755 --- a/src/protocols/mod.rs +++ b/src/protocols/mod.rs @@ -1,5 +1,4 @@ pub mod adc; -pub mod bitchat; pub mod discord; pub mod irc; pub mod matrix; @@ -7,11 +6,14 @@ pub mod stout; pub mod spacebar; pub mod nerimity; +// NOTE: BitChat was removed in 0.10.2 pending clarity on Jack Dorsey's +// BitChat project and the India courts situation. The legal status of the +// protocol and its reference implementation is unclear; we will re-evaluate +// when the dust settles. See NOTICES.md for the full rationale. + #[allow(unused_imports)] pub use adc::{AdcCommand, AdcConfig, AdcMsgType, AdcMessage, run_adc, parse_adc_message, adc_escape, adc_unescape, inf_field}; #[allow(unused_imports)] -pub use bitchat::{BitChatCommand, BitChatConfig, BitChatMessage, run_bitchat, CHAT_TOPIC}; -#[allow(unused_imports)] pub use discord::{DiscordCommand, DiscordConfig, run_discord}; #[allow(unused_imports)] pub use irc::{IrcCommand, IrcConfig, parse_irc_message, run_irc, DccEvent, DccSendOffer, parse_dcc_send, parse_dcc_accept}; diff --git a/src/transfer/engine.rs b/src/transfer/engine.rs index fcf8b9f..089fd8c 100755 --- a/src/transfer/engine.rs +++ b/src/transfer/engine.rs @@ -604,7 +604,7 @@ mod tests { let (tx, _rx) = mpsc::channel(16); let mgr = TransferManager::new(tx); - let id = mgr.queue_send(ProtocolType::BitChat, "peer", &src_path).unwrap(); + let id = mgr.queue_send(ProtocolType::Adc, "peer", &src_path).unwrap(); let cancel = tokio_util::sync::CancellationToken::new(); diff --git a/src/tui/chat_view.rs b/src/tui/chat_view.rs index b295527..849eb37 100755 --- a/src/tui/chat_view.rs +++ b/src/tui/chat_view.rs @@ -151,7 +151,6 @@ impl ChatView { ProtocolType::Irc => Color::DarkGray, ProtocolType::Matrix => Color::Magenta, ProtocolType::Adc => Color::Blue, - ProtocolType::BitChat => Color::Green, ProtocolType::Discord => Color::Gray, ProtocolType::Stout => Color::Yellow, ProtocolType::Spacebar => Color::Red, @@ -165,7 +164,6 @@ impl ChatView { ProtocolType::Irc => self.palette.event_fg, ProtocolType::Matrix => NaimColor::Magenta, ProtocolType::Adc => NaimColor::Blue, - ProtocolType::BitChat => NaimColor::Green, ProtocolType::Discord => NaimColor::White, ProtocolType::Stout => NaimColor::Yellow, ProtocolType::Spacebar => NaimColor::Red, diff --git a/src/tui/menubar.rs b/src/tui/menubar.rs index 2a380b6..fb36079 100755 --- a/src/tui/menubar.rs +++ b/src/tui/menubar.rs @@ -338,12 +338,12 @@ fn default_menus() -> Vec { MI { label: "Redraw Screen\tCtrl-L".into(), action: "__internal:ctrl_l".into(), separator: false }, ]), // ── Connect ───────────────────────────────────────────────── + // NOTE: BitChat menu entry removed in 0.10.2. See NOTICES.md. MenuBarEntry::new("Connect", vec![ MI { label: "IRC…\t__prompt:/connect irc ".into(), action: "__prompt:/connect irc ".into(), separator: false }, MI { label: "Matrix…\t__prompt:/connect matrix ".into(), action: "__prompt:/connect matrix ".into(), separator: false }, MI { label: "ADC/DC++…\t__prompt:/connect adc ".into(), action: "__prompt:/connect adc ".into(), separator: false }, MI { label: "Discord…\t__prompt:/connect discord ".into(), action: "__prompt:/connect discord ".into(), separator: false }, - MI { label: "BitChat…\t__prompt:/connect bitchat ".into(), action: "__prompt:/connect bitchat ".into(), separator: false }, MI { label: String::new(), action: String::new(), separator: true }, MI { label: "Server List\t__server_list".into(), action: "__server_list".into(), separator: false }, MI { label: "Disconnect All\t/disconnect".into(), action: "/disconnect".into(), separator: false }, diff --git a/src/tui/winlist.rs b/src/tui/winlist.rs index 8bc2abb..54d7b31 100755 --- a/src/tui/winlist.rs +++ b/src/tui/winlist.rs @@ -8,14 +8,15 @@ //! //! Each entry is prefixed with a 1-character protocol badge followed by a //! space, colored by protocol (IRC=Cyan I, Matrix=Magenta M, ADC=Blue A, -//! BitChat=Green P). This makes it visually obvious which protocol a tab -//! belongs to when multiple protocols are connected simultaneously. +//! Discord=White D, Stout=Yellow S, Spacebar=Red S, Nerimity=Magenta N). +//! This makes it visually obvious which protocol a tab belongs to when +//! multiple protocols are connected simultaneously. //! //! ``` //! ┌ IRC //! ├> I #rust ← IRC channel, waiting/unread (cyan badge) //! │ M matrix-room← Matrix room, current (magenta badge) -//! └ P p2p-room ← BitChat room, last entry (green badge) +//! └ D discord ← Discord channel, last entry (white badge) //! ``` //! //! Badges are suppressed when `content_width < 8` or when `with_badges(false)` @@ -215,7 +216,6 @@ impl Widget for WinlistWidget<'_> { ProtocolType::Irc => "I", ProtocolType::Matrix => "M", ProtocolType::Adc => "A", - ProtocolType::BitChat => "P", ProtocolType::Discord => "D", ProtocolType::Stout => "S", ProtocolType::Spacebar => "S", @@ -225,7 +225,6 @@ impl Widget for WinlistWidget<'_> { ProtocolType::Irc => NaimColor::Cyan, ProtocolType::Matrix => NaimColor::Magenta, ProtocolType::Adc => NaimColor::Blue, - ProtocolType::BitChat => NaimColor::Green, ProtocolType::Discord => NaimColor::White, ProtocolType::Stout => NaimColor::Yellow, ProtocolType::Spacebar => NaimColor::Red,