opencrabs 0.3.21

The autonomous, self-improving AI agent. Single Rust binary. Every channel. Install with: cargo install opencrabs
Documentation
[package]
name = "opencrabs"
version = "0.3.21"
edition = "2024"
rust-version = "1.91"
authors = ["Adolfo Usier <adolfo@meetneura.ai>"]
license = "MIT"
description = "The autonomous, self-improving AI agent. Single Rust binary. Every channel. Install with: cargo install opencrabs"
repository = "https://github.com/adolfousier/opencrabs"
homepage = "https://opencrabs.com"
documentation = "https://docs.opencrabs.com"
keywords = ["ai", "terminal", "assistant", "llm", "cli"]
categories = ["command-line-utilities", "development-tools"]
readme = "README.md"
# exclude = ["src/assets/"]

[dependencies]
# Async Runtime
tokio = { version = "1.43", features = ["full"] }
tokio-util = { version = "0.7", features = ["codec"] }
futures = "0.3"
async-trait = "0.1"

# CLI Framework
clap = { version = "4.5", features = ["derive", "env", "cargo"] }
clap_complete = "4.6"

# TUI
ratatui = { version = "0.30", features = ["all-widgets"] }
crossterm = { version = "0.29", features = ["event-stream"] }

# Database (deadpool-sqlite uses rusqlite 0.38, same as qmd — zero libsqlite3-sys conflicts)
deadpool-sqlite = { version = "0.13", features = ["rt_tokio_1"] }
rusqlite = { version = "0.38", features = ["bundled"] }
rusqlite_migration = "2.4"

# Cron scheduling
cron = "0.15"

# Serialization
serde = { version = "1.0", features = ["derive", "rc"] }
serde_json = "1.0"
toml = "0.8"
toml_edit = "0.25"

# Configuration
config = "0.15"
dirs = "6.0"

# HTTP & LLM Clients
reqwest = { version = "0.12", features = ["json", "multipart", "native-tls", "stream"], default-features = false }

# A2A Gateway (HTTP Server)
axum = "0.8"
tower-http = { version = "0.6", features = ["cors"] }

# Provider Registry (Crabrace - replaces Catwalk)
crabrace = "0.1.0"

# Error Handling
anyhow = "1.0"
thiserror = "2.0"

# Logging & Tracing
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
tracing-appender = "0.2"

# Encoding
base64 = "0.22.1"
sha2 = "0.10"

# Utilities
libc = "0.2.182"
tempfile = "3.25"
uuid = { version = "1.11", features = ["v4", "serde"] }
notify = "6"
chrono = { version = "0.4", features = ["serde"] }
regex = "1.11"
glob = "0.3"
ignore = "0.4"
which = "8.0"
rand = "0.9"
urlencoding = "2.1"

# Syntax & Parsing
syntect = { version = "5.2", default-features = false, features = ["default-fancy"] }
pulldown-cmark = "0.13"
strip-ansi = "0.1"

# Concurrent Data Structures
once_cell = "1.20"

# Security
zeroize = { version = "1.8", features = ["derive"] }

# Telegram
teloxide = { version = "0.13", features = ["macros"], optional = true }

# WhatsApp
whatsapp-rust = { version = "0.4.1", optional = true, default-features = false, features = ["tokio-transport", "ureq-client", "tokio-native", "tokio-runtime"] }
whatsapp-rust-tokio-transport = { version = "0.4.1", optional = true }
whatsapp-rust-ureq-http-client = { version = "0.4.1", optional = true }
wacore = { version = "0.4.1", optional = true, default-features = false }
wacore-binary = { version = "0.4.1", optional = true, default-features = false, features = ["serde"] }
waproto = { version = "0.4.1", optional = true }
qrcode = { version = "0.14", optional = true }
rmp-serde = { version = "1", optional = true }

# Discord
serenity = { version = "0.12", default-features = false, features = ["client", "gateway", "model", "native_tls_backend"], optional = true }

# Slack
slack-morphism = { version = "2", features = ["hyper"], optional = true }
# slack-morphism's "rustls-native-certs" maps to the wrong tokio-tungstenite
# feature (loads certs but doesn't enable TLS). We force the correct one here.
tokio-tungstenite = { version = "0.28", features = ["rustls-tls-native-roots"], optional = true }
rustls = { version = "0.23", features = ["ring"], optional = true }

# Local STT (rwhisper — candle-based, pure Rust, no ggml conflict)
# Metal/Accelerate features are enabled per-platform below
rwhisper = { version = "0.4", optional = true }
rodio = { version = "0.20", optional = true, default-features = false }
hound = { version = "3.5", optional = true }
rubato = { version = "0.14", optional = true }
symphonia = { version = "0.5", features = ["ogg", "vorbis", "wav", "pcm"], optional = true }
symphonia-adapter-libopus = { version = "0.2", optional = true }
opusic-sys = { version = "0.5", optional = true, default-features = false }

# Browser Automation (CDP via chromey — fork of chromiumoxide)
chromey = { version = "2.42", optional = true, default-features = false }

# Misc
unicode-width = "0.2"
unicode-segmentation = "1.12"

# Document Parsing
pdf-extract = "0.10"
pdfium-render = { version = "0.9", optional = true }
zip = "6.0"
quick-xml = "0.37"
tiktoken-rs = "0.9.1"

# Archive extraction (for /evolve self-update)
flate2 = "1"
tar = "0.4"

# Memory Search (FTS5 + vector search)
qmd = "0.3"
llama-cpp-2 = "0.1.137"
emojis = "0.8.0"
url = "2.5.8"

[dev-dependencies]
rstest = "0.25"
proptest = "1.6"
mockall = "0.13"
criterion = { version = "0.5", features = ["html_reports"] }
insta = { version = "1.42", features = ["json", "yaml"] }
tempfile = "3.25"
tokio-test = "0.4"
tower = { version = "0.5", features = ["util"] }
mockito = "1.7"

# Platform-specific dependencies
[target.'cfg(unix)'.dependencies]
# Profiling (Unix-only - not supported on Windows)
pprof = { version = "0.15", features = ["flamegraph", "frame-pointer"], optional = true }

# macOS: Metal GPU acceleration for local STT (rwhisper/candle)
[target.'cfg(target_os = "macos")'.dependencies]
rwhisper = { version = "0.4", optional = true, features = ["metal", "accelerate"] }

[target.'cfg(target_os = "windows")'.build-dependencies]
winresource = "0.1"

[features]
default = ["telegram", "whatsapp", "discord", "slack", "trello", "local-stt", "local-tts", "browser"]
# Profiling feature enables pprof on Unix only (no-op on Windows)
profiling = []
telegram = ["teloxide"]
trello = []
whatsapp = ["whatsapp-rust", "whatsapp-rust-tokio-transport", "whatsapp-rust-ureq-http-client", "wacore", "wacore-binary", "waproto", "dep:qrcode", "dep:rmp-serde"]
discord = ["serenity"]
slack = ["slack-morphism", "tokio-tungstenite", "rustls"]
local-stt = ["rwhisper", "rodio", "hound", "rubato", "symphonia", "symphonia-adapter-libopus"]
local-tts = ["opusic-sys", "rubato"]
browser = ["chromey"]
pdfium = ["dep:pdfium-render"]

[profile.dev]
opt-level = 0
debug = true

[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
strip = true
panic = "unwind"

[profile.release-small]
inherits = "release"
opt-level = "z"
strip = true

[[bin]]
name = "opencrabs"
path = "src/main.rs"

# Benchmarks
[[bench]]
name = "database"
harness = false
path = "src/benches/database.rs"

[[bench]]
name = "memory"
harness = false
path = "src/benches/memory.rs"


[lints.clippy]