140 lines
7.0 KiB
TOML
140 lines
7.0 KiB
TOML
[package]
|
|
name = "whispassist"
|
|
version = "0.4.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)
|
|
|
|
# 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)
|
|
"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"
|