[package] name = "souveraine" version = "1.0.0" edition = "2021" rust-version = "1.94" authors = ["Souveraine Contributors"] description = "Souveraine - a sovereign consciousness substrate for personal agents" license = "AGPL-3.0-or-later" [dependencies] # Core runtime tokio = { version = "1", features = ["full", "rt-multi-thread"] } tokio-util = "0.7" tokio-stream = { version = "0.1", features = ["fs"] } futures = "0.3" async-trait = "0.1" # Web/WebSocket (for external clients) axum = { version = "0.7", features = ["ws"] } tower = "0.4" tower-http = { version = "0.6", features = ["cors", "trace", "fs"] } tokio-tungstenite = "0.24" # Outbound WS client — federation bridge connects to peer endpoints # Serialization serde = { version = "1", features = ["derive"] } serde_yaml = "0.9" serde_json = "1" toml = "0.8" # Git operations git2 = { version = "0.19", default-features = false } # Database (server mode) sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "sqlite", "migrate", "chrono", "json"] } # Concurrent collections (server sessions) dashmap = "5" # File system notify = "7" # File watching # Environment (.env file loading) dotenvy = "0.15" tempfile = "3" walkdir = "2" # HTTP client (for Bifrost/Ollama) reqwest = { version = "0.12", default-features = false, features = ["json", "stream", "rustls-tls", "multipart"] } # Voice channel — mic capture, mp3 playback, WAV encoding, STT/TTS HTTP clients cpal = "0.15" rodio = { version = "0.19", default-features = false, features = ["mp3"] } hound = "3.5" # Embeddings/ML # tokenizers = "0.15" # For local tokenization # Terminal/UI crossterm = { version = "0.28", features = ["bracketed-paste"] } # Terminal control (bracketed paste for paste detection) — kept for old TUI ratatui = { version = "0.30", features = ["crossterm"] } # TUI framework with crossterm backend — kept for old TUI tuie = { path = "../tuie", features = ["harmonious", "images"] } # New composable widget toolkit — replacing ratatui chord_macro = { path = "../tuie/chord_macro" } # chord!() input-matching macro — the one the tuie-demo widgets use axis2d = "0.1.0" # Axis2D/Vec2 geometry — re-exported by tuie, used directly by the demo widgets unicode-width = "0.1" arboard = { version = "3", features = ["wayland-data-control"] } # Clipboard — click-to-copy a message bubble colored = "2" # Color gradients and effects image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp"] } # Per-agent portraits (assets/portrait.{png,jpg}) + multimodal images ratatui-image = { version = "11", default-features = false, features = ["crossterm", "image-defaults"] } # Real photo rendering in TUI (kitty/sixel/halfblock) — chafa-dyn default dropped, souveraine uses picker/protocols only, avoids a cross chafa+glib sysroot ratatui-ratty = { version = "0.2", optional = true } # Inline 3D graphics via Ratty Graphics Protocol # Logging/tracing tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } # Full USB KVM receiver. Optional because only the aarch64 phone package ships # it; the main substrate and desktop builds do not need a windowing stack. gadgetry-most-foul = { version = "0.1.1", optional = true } gud-gadget = { git = "https://github.com/samcday/gud-gadget", rev = "33024b6152633eb8359375419281fa3ebac9c9cb", optional = true } softbuffer = { version = "0.4", optional = true } winit = { version = "0.30", optional = true } # Error handling anyhow = "1" thiserror = "1" # Process management (subagents) sysinfo = "0.30" # Time chrono = { version = "0.4", features = ["serde"] } # UUIDs for conversation IDs uuid = { version = "1", features = ["v4"] } # Regex regex = "1" # Token counting (cl100k_base for context pressure estimation) tiktoken = "3" # System directories dirs = "5" # OS-native credential storage keyring = "4" keyring-core = "1" # Cryptographic identity (seed-id, event signing, federation trust root) ed25519-dalek = { version = "2", features = ["rand_core", "pem"] } sha2 = "0.10" rand = "0.8" # SO_PEERCRED on the machined socket — the daemon logs who asked for what libc = "0.2" # Cron expression parsing (schedule system) cron = "0.13" # Markdown parsing for the TUI chat renderer (lift from jcode pattern) pulldown-cmark = "0.12" # Tauri (desktop app wrapper) tauri = { version = "2", features = ["tray-icon", "devtools"], optional = true } tauri-plugin-shell = { version = "2", optional = true } # CLI argument parsing clap = { version = "4", features = ["derive", "env"] } clap_complete = "4" # Interactive REPL rustyline = "13" shellexpand = "3" figlet-rs = { version = "1.0.0", optional = true } cowsay = { version = "0.14.0", optional = true } tui-big-text = "0.8.4" tui-widgets = "0.7.2" base64 = "0.22.1" hex = "0.4" once_cell = "1.21.4" glob = "0.3" # Matrix sensorium — optional surface. matrix-sdk is only compiled in when # the `matrix` feature is enabled; a default build never links it. # matrix-sdk 0.17 always uses rustls (no tls feature flag). # NOTE: `e2e-encryption` disabled for Phase 3 — it pulls matrix-sdk-sqlite # → rusqlite → libsqlite3-sys 0.35, conflicting with sqlx 0.7's # libsqlite3-sys 0.26 (both `links = "sqlite3"`). Phase 3 uses the # in-memory store; e2ee + sqlite store return in Phase 6. matrix-sdk = { version = "0.17", optional = true, default-features = false } # Secret Service daemon (org.freedesktop.secrets) — optional binary target. # Backs libsecret clients (Chatty/libcmatrix, and our own keyring-core above) # from the existing SeedId, so the machine identity is the trust root instead # of gnome-keyring/KWallet. zbus = session bus; aes/cbc = AES-128-CBC + PKCS7 # (the OpenSession "dh-ietf1024-sha256-aes128-cbc-pkcs7" transport); hkdf = # session key derivation (sha2/rand already plain deps above); num-bigint = # RFC 2409 MODP-1024 group math for the OpenSession DH exchange itself. zbus = { version = "5", optional = true, default-features = false, features = ["tokio"] } zvariant = { version = "5", optional = true } aes = { version = "0.8", optional = true } cbc = { version = "0.1", optional = true, features = ["alloc"] } cipher = { version = "0.4", optional = true } hkdf = { version = "0.12", optional = true } num-bigint = { version = "0.4", optional = true } num-traits = { version = "0.2", optional = true } # At-rest sealing per STORAGE-ENCRYPTION.md: AES-256-GCM for the item store # and key wraps (the AEAD the tree previously lacked), Argon2id for the # passphrase KEK — the slot that puts the user's real lockscreen passphrase # into the at-rest hierarchy. aes-gcm = { version = "0.10", optional = true } argon2 = { version = "0.5", optional = true } # Session authority daemon (souveraine-sessiond) — ext-session-lock client. # Pure-Rust Wayland stack. The daemon owns locking and the holding surface; it # deliberately has no unlock UI or PAM conversation (`src/sessiond/lock.rs`). wayland-client = { version = "0.31", optional = true } wayland-protocols = { version = "0.32", optional = true, features = ["client", "staging"] } wry = { version = "0.56.0", optional = true } tao = { version = "0.36.0", optional = true } gtk = { version = "0.18", optional = true } [dev-dependencies] tokio-test = "0.4" colored = "2" tempfile = "3" [[example]] name = "demo" path = "examples/demo.rs" [[bin]] name = "souveraine" path = "src/main.rs" [[bin]] name = "souveraine-secrets" path = "src/bin/souveraine-secrets.rs" required-features = ["secrets"] # System-tier machine identity daemon. No feature gate: zero new heavy deps, # and the phone package should always ship it. [[bin]] name = "souveraine-machined" path = "src/bin/souveraine-machined.rs" [[bin]] name = "souveraine-sessiond" path = "src/bin/souveraine-sessiond.rs" required-features = ["sessiond"] # The sensor reporter. No features: it speaks to sessiond over the socket like # any other client and pulls in none of the lock/PAM/Wayland machinery. [[bin]] name = "souveraine-sensord" path = "src/bin/souveraine-sensord.rs" [[bin]] name = "souveraine-usb-kvm" path = "src/bin/souveraine-usb-kvm.rs" required-features = ["usb-kvm"] [profile.release] opt-level = 3 lto = true codegen-units = 1 strip = true panic = "abort" [features] web = ["dep:wry", "dep:tao", "dep:gtk"] default = ["figlet-rs"] figlet-rs = ["dep:figlet-rs"] cowsay = ["dep:cowsay"] tauri-desktop = ["dep:tauri", "dep:tauri-plugin-shell"] rgp = ["dep:ratatui-ratty"] # Matrix sensorium — opt-in surface. `cargo build --features matrix`. matrix = ["dep:matrix-sdk"] # GUI render mode — forwards to tuie's windowed backend (winit/wgpu). Gates the # color-scheme / font-size controls in theme.rs and global_chords.rs. gui = ["tuie/gui"] # Secret Service daemon (org.freedesktop.secrets), backed by the existing SeedId. secrets = ["dep:zbus", "dep:zvariant", "dep:aes", "dep:cbc", "dep:cipher", "dep:hkdf", "dep:num-bigint", "dep:num-traits", "dep:aes-gcm", "dep:argon2"] # Session authority daemon — holds ext-session-lock before/under the shell. sessiond = ["dep:wayland-client", "dep:wayland-protocols"] usb-kvm = ["dep:gadgetry-most-foul", "dep:gud-gadget", "dep:softbuffer", "dep:winit"] wry = ["dep:wry"] tao = ["dep:tao"] gtk = ["dep:gtk"] [patch."https://github.com/samcday/gadgetry-most-foul.git"] gadgetry-most-foul = { version = "0.1.1" } [[bin]] name = "souveraine-web" path = "src/bin/souveraine-web.rs" required-features = ["web"]