Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 86 additions & 29 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,21 +38,21 @@ edition = "2021"
# Shared dependency versions to keep all crates aligned
[workspace.dependencies]
# Async runtime
tokio = { version = "1.0", features = ["full"] }
tokio-stream = "0.1"
tokio-util = "0.7"
async-trait = "0.1"
futures = "0.3"
futures-util = "0.3"
tokio = { version = "1.52", features = ["full"] }
tokio-stream = "0.1.18"
tokio-util = "0.7.18"
async-trait = "0.1.89"
futures = "0.3.31"
futures-util = "0.3.31"

# Serialization
serde = { version = "1", features = ["derive"] }
serde_json = "1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.9"

# Error handling
anyhow = "1.0"
thiserror = "1.0"
thiserror = "2"

# Logging
log = "0.4"
Expand All @@ -66,38 +66,52 @@ chrono-tz = "0.10.4"
cron = "0.15.0"
regex = "1"
base64 = "0.22"
# Keep macOS Tauri's dispatch2/bitflags expansion on the known-good bitflags release.
bitflags = "=2.11.1"
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "gif", "webp", "bmp"] }
md5 = "0.7"
dashmap = "5"
dashmap = "6"
indexmap = "2"
include_dir = "0.7"
aes = "0.8"
hex = "0.4"

# HTTP client
reqwest = { version = "0.12", default-features = false, features = ["native-tls", "rustls-tls-native-roots", "json", "stream", "multipart"] }
reqwest = { version = "0.13.4", default-features = false, features = ["native-tls", "rustls", "json", "stream", "multipart", "query", "form"] }

# Debug Log HTTP Server
axum = { version = "0.7", features = ["json", "ws"] }
tower-http = { version = "0.6", features = ["cors", "fs"] }
axum = { version = "0.8", features = ["json", "ws"] }
tower-http = { version = "0.6.11", features = ["cors", "fs"] }

# File system
glob = "0.3"
ignore = "0.4"
notify = "6.1"
dirs = "5.0"
notify = "8.2"
dirs = "6.0"
dark-light = "1.1"
dunce = "1"
filetime = "0.2"
fs2 = "0.4"
zip = "0.6" # plugin load
zip = { version = "4.6", default-features = false, features = ["deflate"] } # plugin load
flate2 = "1.0"
toml = "0.8"
toml = "0.9"

# Git
git2 = { version = "0.18", default-features = false, features = ["https", "vendored-libgit2"] }
git2 = { version = "0.21", default-features = false, features = ["https", "vendored-libgit2"] }

# Terminal
portable-pty = "0.8"
vte = "0.15.0"
clap = { version = "4.6.1", features = ["derive"] }
crossterm = "0.28"
ratatui = "0.29"
unicode-width = "0.2"
pulldown-cmark = "0.11"
syntect = { version = "5", default-features = false, features = ["default-syntaxes", "default-themes", "regex-fancy"] }
syntect-tui = "3.0"
once_cell = "1"
libc = "0.2"
arboard = "3"

# Grep (search)
grep-searcher = "0.1"
Expand All @@ -106,23 +120,47 @@ globset = "0.4"

# SSE
eventsource-stream = "0.2.3"
sse-stream = "0.2.3"

# Command detection (cross-platform)
which = "8.0"
similar = "2.5"
urlencoding = "2.1"

# Tauri (desktop only)
tauri = { version = "2", features = ["unstable", "macos-private-api", "tray-icon"] }
tauri-plugin-opener = "2"
tauri-plugin-dialog = "2.6"
tauri-plugin-fs = "2"
tauri-plugin-log = "2"
tauri-plugin-autostart = "2"
tauri-plugin-notification = "2"
tauri-plugin-updater = "2"
tauri-plugin-global-shortcut = "2"
tauri-build = { version = "2", features = [] }
tauri = { version = "2.11", features = ["unstable", "macos-private-api", "tray-icon"] }
tauri-plugin-opener = "2.5"
tauri-plugin-dialog = "2.7"
tauri-plugin-fs = "2.5"
tauri-plugin-log = "2.8"
tauri-plugin-autostart = "2.5"
tauri-plugin-notification = "2.3"
tauri-plugin-updater = "2.10"
tauri-plugin-global-shortcut = "2.3"
tauri-build = { version = "2.6", features = [] }

# Desktop support
screenshots = "0.8"
enigo = "0.2"
resvg = { version = "0.47", default-features = false }
atspi = "0.29"
leptess = "0.14"
core-foundation = "0.9"
core-graphics = { version = "0.23", features = ["elcapitan", "highsierra"] }
dispatch = "0.2"
block2 = "0.6"
objc2 = "0.6"
objc2-foundation = "0.3"
objc2-app-kit = "0.3"
objc2-vision = { version = "0.3.2", features = ["VNRecognizeTextRequest", "VNRequest", "VNObservation", "VNRequestHandler", "VNUtils", "VNTypes", "objc2-core-foundation"] }
objc2-web-kit = { version = "0.3", features = ["WKWebView", "WKSnapshotConfiguration", "WKPDFConfiguration", "block2", "objc2-app-kit"] }
tempfile = "3"
webview2-com = "0.38"
windows = "0.61"
windows-core = "0.61"
glib = "0.18"
gtk = "0.18"
webkit2gtk = "2.0"

# Windows-specific dependencies
win32job = "2.0"
Expand All @@ -147,7 +185,26 @@ hostname = "0.4"
qrcode = "0.14"

# WebSocket client
tokio-tungstenite = { version = "0.24", features = ["rustls-tls-native-roots"] }
tokio-tungstenite = { version = "0.29", features = ["rustls-tls-native-roots"] }

# MCP and remote runtimes
rmcp = { version = "1.7", default-features = false, features = [
"auth",
"base64",
"client",
"elicitation",
"macros",
"reqwest",
"schemars",
"server",
] }
agent-client-protocol = { version = "0.12", features = ["unstable"] }
russh = "0.45"
russh-sftp = "2.1"
russh-keys = "0.45"
shellexpand = "3"
ssh_config = "0.1"
rustls = { version = "0.23", default-features = false }

[profile.dev]
incremental = true
Expand Down
22 changes: 11 additions & 11 deletions src/apps/cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ bitfun-events = { path = "../../crates/events" }
bitfun-acp = { path = "../../crates/acp" }

# CLI framework
clap = { version = "4", features = ["derive"] }
clap = { workspace = true }

# TUI framework (Terminal User Interface)
ratatui = "0.28"
crossterm = "0.28"
ratatui = { workspace = true }
crossterm = { workspace = true }

# Config and serialization
dirs = { workspace = true }
Expand All @@ -35,29 +35,29 @@ dashmap = { workspace = true }
async-trait = { workspace = true }

# Unicode width calculation (for correct wide-char handling)
unicode-width = "0.1"
unicode-width = { workspace = true }

# Path canonicalization without Windows UNC prefix
dunce = { workspace = true }

# Markdown parsing and rendering
pulldown-cmark = "0.11"
pulldown-cmark = { workspace = true }

# Diff computation for tool card rendering
similar = "2"
similar = { workspace = true }

# Syntax highlighting for code blocks and tool cards
syntect = { version = "5", default-features = false, features = ["default-syntaxes", "default-themes", "regex-fancy"] }
syntect-tui = "3.0"
syntect = { workspace = true }
syntect-tui = { workspace = true }

# Lazy initialization for syntax highlighter singleton
once_cell = "1"
once_cell = { workspace = true }

# Unix-only best-effort terminal color detection (OSC 11)
libc = "0.2"
libc = { workspace = true }

# Clipboard access (for reliable paste on Windows where bracketed paste is broken)
arboard = "3"
arboard = { workspace = true }

# Inherited from workspace
tokio = { workspace = true }
Expand Down
31 changes: 16 additions & 15 deletions src/apps/desktop/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,27 +51,28 @@ ignore = { workspace = true }
urlencoding = { workspace = true }
reqwest = { workspace = true }
zip = { workspace = true }
thiserror = "1.0"
thiserror = { workspace = true }
futures = { workspace = true }
async-trait = { workspace = true }
sha1 = { workspace = true }
screenshots = "0.8"
enigo = "0.2"
screenshots = { workspace = true }
enigo = { workspace = true }
image = { version = "0.24", default-features = false, features = ["png", "jpeg"] }
resvg = { version = "0.47.0", default-features = false }
resvg = { workspace = true }

[target.'cfg(target_os = "macos")'.dependencies]
core-foundation = "0.9"
core-graphics = { version = "0.23", features = ["elcapitan", "highsierra"] }
dispatch = "0.2"
objc2 = { version = "0.6", features = ["exception"] }
objc2-foundation = "0.3"
objc2-app-kit = "0.3"
objc2-vision = { version = "0.3.2", features = ["VNRecognizeTextRequest", "VNRequest", "VNObservation", "VNRequestHandler", "VNUtils", "VNTypes", "objc2-core-foundation"] }
bitflags = { workspace = true }
core-foundation = { workspace = true }
core-graphics = { workspace = true }
dispatch = { workspace = true }
objc2 = { workspace = true, features = ["exception"] }
objc2-foundation = { workspace = true }
objc2-app-kit = { workspace = true }
objc2-vision = { workspace = true }

[target.'cfg(windows)'.dependencies]
win32job = { workspace = true }
windows = { version = "0.61.3", features = [
windows = { workspace = true, features = [
"Foundation",
"Globalization",
"Graphics_Imaging",
Expand All @@ -82,7 +83,7 @@ windows = { version = "0.61.3", features = [
"Win32_UI_Accessibility",
"Win32_UI_WindowsAndMessaging",
] }
windows-core = "0.61.2"
windows-core = { workspace = true }

[features]
default = []
Expand All @@ -92,5 +93,5 @@ default = []
devtools = ["tauri/devtools"]

[target.'cfg(target_os = "linux")'.dependencies]
atspi = "0.29"
leptess = "0.14.0"
atspi = { workspace = true }
leptess = { workspace = true }
10 changes: 5 additions & 5 deletions src/apps/desktop/src/crash_diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use std::fs::{self, File};
use std::io::{Read, Write};
use std::path::{Path, PathBuf};
use std::sync::OnceLock;
use zip::write::FileOptions;
use zip::write::SimpleFileOptions;

const RUN_STATE_FILE: &str = "run-state.json";
const CRASH_REPORT_FILE: &str = "crash-report.json";
Expand Down Expand Up @@ -211,7 +211,7 @@ pub fn export_diagnostics_bundle() -> Result<DiagnosticsBundleInfo, String> {
let file = File::create(&bundle_path)
.map_err(|error| format!("Failed to create diagnostics bundle: {}", error))?;
let mut zip = zip::ZipWriter::new(file);
let options = FileOptions::default().compression_method(zip::CompressionMethod::Deflated);
let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Deflated);

let metadata = DiagnosticMetadata {
exported_at: Utc::now().to_rfc3339(),
Expand Down Expand Up @@ -309,7 +309,7 @@ fn add_directory_entries(
zip: &mut zip::ZipWriter<File>,
dir: &Path,
archive_prefix: &str,
options: FileOptions,
options: SimpleFileOptions,
) -> Result<(), String> {
for entry in fs::read_dir(dir)
.map_err(|error| format!("Failed to read directory {}: {}", dir.display(), error))?
Expand All @@ -333,7 +333,7 @@ fn add_json_entry<T: Serialize>(
zip: &mut zip::ZipWriter<File>,
archive_path: &str,
value: &T,
options: FileOptions,
options: SimpleFileOptions,
) -> Result<(), String> {
let content = serde_json::to_vec_pretty(value)
.map_err(|error| format!("Failed to serialize {}: {}", archive_path, error))?;
Expand All @@ -356,7 +356,7 @@ fn add_file_entry(
zip: &mut zip::ZipWriter<File>,
source_path: &Path,
archive_path: &str,
options: FileOptions,
options: SimpleFileOptions,
) -> Result<(), String> {
let mut file = File::open(source_path)
.map_err(|error| format!("Failed to open {}: {}", source_path.display(), error))?;
Expand Down
30 changes: 15 additions & 15 deletions src/apps/relay-server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,28 +15,28 @@ path = "src/main.rs"

[dependencies]
# Web framework
axum = { version = "0.7", features = ["json", "ws"] }
tower-http = { version = "0.6", features = ["cors", "fs"] }
axum = { workspace = true }
tower-http = { workspace = true }

# Async runtime
tokio = { version = "1.0", features = ["full"] }
futures-util = "0.3"
tokio = { workspace = true }
futures-util = { workspace = true }

# Serialization
serde = { version = "1", features = ["derive"] }
serde_json = "1"
serde = { workspace = true }
serde_json = { workspace = true }

# Error handling
anyhow = "1.0"
anyhow = { workspace = true }

# Logging
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tracing = { workspace = true }
tracing-subscriber = { workspace = true }

# Utilities
uuid = { version = "1.0", features = ["v4", "serde"] }
chrono = { version = "0.4", features = ["serde", "clock"] }
dashmap = "5.5"
rand = "0.8"
base64 = "0.21"
sha2 = "0.10"
uuid = { workspace = true }
chrono = { workspace = true }
dashmap = { workspace = true }
rand = { workspace = true }
base64 = { workspace = true }
sha2 = { workspace = true }
7 changes: 6 additions & 1 deletion src/apps/relay-server/src/routes/websocket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,12 @@ async fn handle_socket(socket: WebSocket, state: AppState) {

let write_task = tokio::spawn(async move {
while let Some(msg) = out_rx.recv().await {
if !msg.text.is_empty() && ws_sender.send(Message::Text(msg.text)).await.is_err() {
if !msg.text.is_empty()
&& ws_sender
.send(Message::Text(msg.text.into()))
.await
.is_err()
{
break;
}
}
Expand Down
Loading
Loading