Files
WhispAssist/src-tauri/Cargo.toml
T
2026-07-14 19:53:03 -05:00

142 lines
7.2 KiB
TOML

[package]
name = "whispassist"
version = "0.7.0"
description = "Privacy-first, fully local Windows meeting assistant"
authors = ["WhispAssist contributors"]
license = "MIT OR Apache-2.0"
edition = "2021"
rust-version = "1.77"
# NOTE: versions are indicative. Pin + verify at implementation time
# (see docs/07-research-findings.md "Open items").
[lib]
name = "whispassist_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
[build-dependencies]
tauri-build = { version = "2", features = [] }
[dependencies]
tauri = { version = "2", features = ["tray-icon", "image-png"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
thiserror = "1"
async-trait = "0.1"
tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "time", "fs", "io-util", "net"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
uuid = { version = "1", features = ["v4"] }
# Local<->UTC, DST-aware — needed for calendar recurrence (T6.2); already in
# the dependency tree transitively (sqlx), this just promotes it to direct.
chrono = { version = "0.4", default-features = false, features = ["clock"] }
# storage
sqlx = { version = "0.8", features = ["runtime-tokio", "sqlite", "migrate"] }
# llm + sync (HTTP/WebDAV)
reqwest = { version = "0.12", default-features = false, features = ["json", "stream", "rustls-tls"] }
futures-util = "0.3"
sha2 = "0.10" # skip-if-unchanged hashing (sync)
# At-rest encryption vault (Phase 8, T8.8, FR-SEC-3). Pure-Rust RustCrypto — no
# C build. Argon2id derives the vault key from the password; XChaCha20-Poly1305
# (24-byte nonce → safe random nonces) is the AEAD for artifacts + key wrapping.
argon2 = "0.5"
chacha20poly1305 = "0.10"
getrandom = "0.2"
zeroize = "1" # wipe key material from memory on lock
keyring = { version = "3", optional = true, features = ["windows-native"] } # OS credential store (sync + AI creds); windows-native = real Credential Manager (else keyring 3.x uses a no-op mock store)
# MCP server (ADR-0011). `client`/`transport-streamable-http-client-reqwest`
# are only ever constructed by this crate's own in-process tests (an actual
# MCP client talking to our loopback server) -- WA never opens an outbound
# MCP connection at runtime, so this adds no egress (FR-MCP-7).
rmcp = { version = "0.16", optional = true, features = [
"server", "transport-streamable-http-server", "transport-io",
"client", "transport-streamable-http-client-reqwest",
] }
# Low-level HTTP glue for the Streamable HTTP transport: `rmcp`'s
# `StreamableHttpService` is a bare `tower_service::Service`, so something has
# to actually accept TCP connections and run HTTP/1 on top of it. All four
# versions are already in Cargo.lock transitively (via reqwest/tauri), so this
# just promotes them to direct deps -- no new crates.
hyper = { version = "1", optional = true, features = ["server", "http1"] }
hyper-util = { version = "0.1", optional = true, features = ["tokio"] }
http-body-util = { version = "0.1", optional = true }
http = { version = "1", optional = true }
bytes = { version = "1", optional = true }
tower-service = { version = "0.3", optional = true }
tokio-util = { version = "0.7", optional = true }
# audio / transcription / diarization / calendar are integrated per-phase and are
# feature-gated so the CPU-only build always compiles (NFR-MNT-4).
hound = { version = "3", optional = true } # WAV I/O (Phase 1)
whisper-rs = { version = "0.16", optional = true } # whisper.cpp bindings (Phase 1)
# NPU transcription (Phase 3, T3.4): ONNX Runtime + OpenVINO EP. `load-dynamic`
# dlopens the on-demand-downloaded runtime, so cargo compiles no C++/OpenVINO —
# keeps the CPU-only build untouched (NFR-MNT-4). `rustfft` powers the log-mel
# front-end (detok is hand-rolled off serde_json, no `tokenizers`/C dep).
ort = { version = "=2.0.0-rc.10", optional = true, default-features = false, features = ["load-dynamic", "openvino", "directml"] }
rustfft = { version = "6", optional = true }
sherpa-rs = { version = "0.6", optional = true, default-features = false, features = ["download-binaries"] } # sherpa-onnx bindings (Phase 4, ADR-0005)
tauri-plugin-dialog = "2" # native Save/choose-folder (Phase 2 export)
tauri-plugin-autostart = "2" # opt-in launch-on-login (per-user HKCU\Run, no admin; NFR-RES-4)
# notes export (Phase 8, FR-NOTE-4) — pure-Rust, no external binary/cloud
# conversion service, consistent with the fully-local invariant.
pulldown-cmark = "0.12"
printpdf = "0.7"
docx-rs = "0.4"
# Extracts the on-demand NPU/DirectML runtime bundles (7z, LZMA2+BCJ). Optional +
# npu-gated so the CPU-only build stays lean (NFR-MNT-4). Pinned to 0.7.0: newer
# releases raise the MSRV above the project's rust-version.
sevenz-rust2 = { version = "0.7.0", optional = true }
[target.'cfg(windows)'.dependencies]
windows = { version = "0.58", features = [
"Win32_Media_Audio", # WASAPI (Phase 1)
"Win32_Graphics_Dxgi", # GPU enumeration (Phase 3)
"Win32_Devices_DeviceAndDriverInstallation", # SetupAPI: NPU detection (Phase 3, T3.4)
"Win32_System_Com",
"Win32_UI_Shell", # SetCurrentProcessExplicitAppUserModelID (Phase 8, T8.6)
"Win32_UI_WindowsAndMessaging", # MessageBoxW: fatal-startup error dialog (see run())
"UI_Notifications", # scheduled toast reminders (Phase 8, T8.6, FR-CAL-5) — the
"Data_Xml_Dom", # OS delivers these itself at the due time, no polling timer
"Foundation",
"Foundation_Collections", # IVectorView iteration (GetScheduledToastNotifications)
] }
wasapi = { version = "0.15", optional = true } # Phase 1
[features]
# `npu` ships in the default build: `ort` uses load-dynamic (no build-time
# linking/OpenVINO needed), and the on-demand runtime/model download only works
# if this code path is actually compiled in. NPU stays inert until an NPU is
# detected AND its runtime is downloaded, so shipping it is safe (NFR-MNT-4).
default = ["audio", "cpu-transcription", "diarization", "pst", "sync", "npu"]
# Phase 1
audio = ["dep:wasapi", "dep:hound"]
cpu-transcription = ["dep:whisper-rs"] # whisper-rs CPU build
# Phase 3 acceleration (built on capable CI runners; never required)
cuda = ["whisper-rs?/cuda"] # whisper.cpp CUDA
vulkan = ["whisper-rs?/vulkan"] # whisper.cpp Vulkan
npu = ["dep:ort", "dep:rustfft", "dep:sevenz-rust2"] # ort + OpenVINO EP NPU path (T3.4); 7z for runtime bundles
# Phase 4 / 6 (added when integrated)
diarization = ["dep:sherpa-rs"] # sherpa-onnx
pst = [] # shells out to readpst (libpst) — no crate dep, see ADR-0008 update
# Phase 9
sync = ["dep:keyring"] # remote upload (WebDAV + OAuth providers)
# Phase 10
mcp = [
"dep:rmcp", "dep:keyring", "dep:hyper", "dep:hyper-util",
"dep:http-body-util", "dep:http", "dep:bytes", "dep:tower-service",
"dep:tokio-util",
] # WhispAssist as an MCP server + hosted-AI creds
[profile.release]
opt-level = "z" # optimize for size — keep the binary small (NFR-RES-1)
lto = true
codegen-units = 1
strip = true
panic = "abort"