[package] name = "whispassist" version = "0.7.3" 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"