mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
The bundled ACP bridges are shell shims that exec node; without a suitable Node.js on the spawn PATH the first agent session dies with a bare exit 127. Surface the requirement in the Doctor panel instead: - New managed_agents::node_runtime module reads the staged resources/acp/node-runtime.json manifest (one entry per npm-sourced bridge, each with its own required Node major), resolves node from the same augmented PATH the agent spawn and CLI auth probes use (so the check cannot disagree with what the wrapper shims find at spawn time), probes `node -p process.versions.node` with a 10s timeout, and reports pass/warn with a per-bridge satisfied/unmet/unknown verdict list. A missing manifest keeps the check silent (no npm-sourced bridges bundled); an unreadable one warns instead of hiding a packaging break. - New check_acp_node_runtime Tauri command plus a Doctor panel section (message, node path, per-bridge requirements, Install Node.js fix link on warn) that the Re-run button refreshes alongside the runtime rows. The e2e mock bridge grows a nodeRuntimeCheck fixture knob. - tokio gains the "process" feature for the async node probe. Readiness gating for bundled bridges needs no code here: Buzz's classify_runtime already reports adapter_missing when find_command (which prefers the bundle since the previous commit) cannot resolve the bridge, and cli_login_requirements resolves the adapter the same way — so a broken bundle reads not_installed instead of ready. This is the behaviour squareup/berd 17c5e9e5 had to add explicitly. Ports block/builderbot apps/staged adea4017 (node-runtime doctor manifest), itself a port of squareup/berd 07087303. Verification: - cargo test --manifest-path desktop/src-tauri/Cargo.toml --lib: 1392 passed, 0 failed, 11 ignored (10 new tests: version parsing, requirement labels, all four check states, manifest missing/invalid/ loaded including the exact staging-script JSON shape) - cargo clippy --all-targets: clean; cargo fmt --check: clean - desktop: tsc --noEmit clean; biome clean; pnpm test 2744 passed - playwright doctor-states.spec.ts (smoke): 8 passed, including new 06-node-runtime-pass / 07-node-runtime-warn / 08-node-runtime-hidden-when-not-bundled Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Matt Toohey <contact@matttoohey.com>
114 lines
4.5 KiB
TOML
114 lines
4.5 KiB
TOML
[workspace]
|
|
|
|
[package]
|
|
name = "buzz-desktop"
|
|
version = "0.4.5"
|
|
description = "Buzz desktop app"
|
|
authors = ["you"]
|
|
edition = "2021"
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[lib]
|
|
# The `_lib` suffix may seem redundant but it is necessary
|
|
# to make the lib name unique and wouldn't conflict with the bin name.
|
|
# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
|
|
name = "buzz_lib"
|
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
|
|
|
[features]
|
|
default = ["system-keyring"]
|
|
mesh-llm = ["dep:mesh-llm-sdk", "dep:mesh-llm-host-runtime"]
|
|
# OS keyring backing for desktop secret storage (nsec private keys). When
|
|
# disabled, secrets fall back to 0o600 files. On by default for real builds.
|
|
system-keyring = ["dep:keyring"]
|
|
|
|
[build-dependencies]
|
|
base64 = "0.22"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
tauri-build = { version = "2", features = [] }
|
|
|
|
[target.'cfg(unix)'.dependencies]
|
|
libc = "0.2"
|
|
ctrlc = { version = "3", features = ["termination"] }
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
keyring = { version = "3.6.3", default-features = false, features = ["sync-secret-service", "vendored"], optional = true }
|
|
# Used directly (alongside tauri-plugin-notification) so we can hold the posting
|
|
# D-Bus connection open. GNOME 46+ dismisses a notification the moment that
|
|
# connection is dropped, which the plugin does immediately. Default features
|
|
# keep the pure-Rust zbus backend, matching the plugin (no libdbus needed).
|
|
notify-rust = "4"
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
objc2-app-kit = { version = "0.3.2", default-features = false, features = ["NSHapticFeedback"] }
|
|
keyring = { version = "3.6.3", default-features = false, features = ["apple-native", "vendored"], optional = true }
|
|
security-framework = { version = "3.7.0", features = ["OSX_10_15"] }
|
|
window-vibrancy = "0.6"
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
windows-sys = { version = "0.61", features = ["Win32_Security", "Win32_Storage_FileSystem", "Win32_System_JobObjects", "Win32_System_Registry", "Win32_System_Threading", "Win32_Foundation"] }
|
|
keyring = { version = "3.6.3", default-features = false, features = ["windows-native", "vendored"], optional = true }
|
|
|
|
[dependencies]
|
|
atomic-write-file = "0.3"
|
|
anyhow = "1"
|
|
dirs = "6"
|
|
tauri = { version = "2", features = ["macos-private-api"] }
|
|
tauri-plugin-deep-link = "2"
|
|
tauri-plugin-opener = "2"
|
|
tauri-plugin-single-instance = { version = "2", features = ["deep-link"] }
|
|
tauri-plugin-window-state = "2"
|
|
tauri-plugin-websocket = "2"
|
|
tauri-plugin-dialog = "2"
|
|
tauri-plugin-updater = "2"
|
|
tauri-plugin-process = "2"
|
|
infer = "0.19"
|
|
hex = "0.4"
|
|
tokio = { version = "1", features = ["fs", "sync", "rt", "macros", "time", "process"] }
|
|
tokio-tungstenite = { version = "0.29", features = ["rustls-tls-webpki-roots"] }
|
|
tokio-util = { version = "0.7", features = ["rt"] }
|
|
bytes = "1"
|
|
futures-util = "0.3"
|
|
opus = "0.3"
|
|
neteq = { version = "0.8", default-features = false }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
serde_yaml = "0.9"
|
|
toml = "0.8"
|
|
nostr = { version = "0.44", features = ["nip44"] }
|
|
zeroize = "1"
|
|
reqwest = { version = "0.13", features = ["json", "query", "stream"] }
|
|
url = "2"
|
|
buzz_core_pkg = { package = "buzz-core", path = "../../crates/buzz-core" }
|
|
buzz_persona_pkg = { package = "buzz-persona", path = "../../crates/buzz-persona" }
|
|
buzz_sdk_pkg = { package = "buzz-sdk", path = "../../crates/buzz-sdk" }
|
|
buzz_agent_pkg = { package = "buzz-agent", path = "../../crates/buzz-agent" }
|
|
mesh-llm-sdk = { git = "https://github.com/Mesh-LLM/mesh-llm.git", rev = "ebc3ab4c4b5f4a45d5bc942c66c18583800c3f82", package = "mesh-llm-sdk", default-features = false, features = ["client", "serving"], optional = true }
|
|
mesh-llm-host-runtime = { git = "https://github.com/Mesh-LLM/mesh-llm.git", rev = "ebc3ab4c4b5f4a45d5bc942c66c18583800c3f82", package = "mesh-llm-host-runtime", default-features = false, features = ["dynamic-native-runtime"], optional = true }
|
|
base64 = "0.22"
|
|
sha2 = "0.11"
|
|
tar = "0.4"
|
|
bzip2 = "0.6"
|
|
chrono = { version = "0.4", features = ["serde"] }
|
|
tauri-plugin-global-shortcut = "2"
|
|
tauri-plugin-notification = "2.3.3"
|
|
uuid = { version = "1", features = ["v4"] }
|
|
png = "0.18"
|
|
arboard = "3"
|
|
image = { version = "0.25", default-features = false, features = ["jpeg", "png", "webp", "gif"] }
|
|
zip = "8"
|
|
sherpa-onnx = "1.12"
|
|
regex = "1"
|
|
rusqlite = { version = "0.37", features = ["bundled"] }
|
|
axum = "0.8"
|
|
rodio = "0.22"
|
|
earshot = "1.0"
|
|
rubato = "3.0"
|
|
audioadapter-buffers = "3.0"
|
|
tempfile = "3"
|
|
strip-ansi-escapes = "0.2"
|
|
|
|
[dev-dependencies]
|