Files
TRIPandHKLHaoBin 6f9af89583 release: OpenLess 2.0.0-Beta.4+build.20260930 (#1126)
Integrate ASR/Omni fixes, API Route, Android IME and confirmation-based vocabulary learning. Complete settings transitions and macOS single-item credential storage. Synchronize all application versions to 2.0.0-Beta.4+build.20260930.

Integrated PRs: #1116, #1120, #1121, #1123, #1124, #1067 and #1128. Linux #1117 remains independent and is excluded from automatic release.

Validated: full cross-platform CI, 18 UI motion cases, 112 frontend test files, 1245 Core tests (1 ignored) and 572 macOS native tests.

Co-authored-by: HKLHaoBin <we3q@qq.com>
2026-09-30 20:32:53 +08:00

199 lines
7.9 KiB
TOML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[package]
name = "openless"
version = "2.0.0-Beta.4+build.20260930"
license = "AGPL-3.0-only"
description = "OpenLess — local voice input that types where your cursor is"
authors = ["OpenLess"]
edition = "2021"
rust-version = "1.88"
[lib]
name = "openless_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
[build-dependencies]
# Keep on the same train as `tauri = "=2.11.2"`. Floating `version = "2"` resolves
# to tauri-build 2.7 when CI regenerates the lockfile.
tauri-build = { version = "=2.6.2", features = [] }
# Compile vendored Open-Less/qwen-asr C sources for the local ASR engine on macOS.
cc = "1.1"
[dependencies]
zeroize = "1"
# Framework-independent business core. Tauri remains an adapter and owns the
# window/plugin/IPC concerns; Linux must depend on the same crate directly.
openless-core = { path = "../crates/openless-core" }
# Pin the whole 2.11.2 train. tauri 2.11.2 allows `tauri-runtime ^2.11`, so an
# unlocked resolve picks 2.12.0 and fails to compile (Monitor / UnexpectedMenuKind).
# Direct pins keep `cargo generate-lockfile` (ci-disable-macos-qwen3) compatible.
# macos-private-api must live in [dependencies] so tauri_build can match tauri.conf.json
# macOSPrivateApi; tray-icon stays desktop-only in the target table below.
tauri = { version = "=2.11.2", features = ["macos-private-api"] }
tauri-runtime = "=2.11.2"
tauri-runtime-wry = "=2.11.2"
tauri-macros = "=2.6.2"
tauri-utils = "=2.9.2"
# 锁 >=2.3.5 修复 GHSA-c9pr-q8gx-3mgp:tauri-plugin-shell `open` 端点作用域校验绕过(CRITICAL,issue #668)。
tauri-plugin-shell = "2.3.5"
tauri-plugin-dialog = "2.7.2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
semver = "1"
# OpenRouter ASR 把音频以标准 base64(带 padding)放进 JSON body(issue #582)。
base64 = "0.22"
# Android in-app updater and host tests for Tauri-wrapped minisign pubkey/signature.
minisign-verify = "0.2"
sha2 = "0.10"
# 讯飞 RTASR/IFASR 签名:signa = Base64(HmacSHA1(MD5(appid + ts), apiKey))。
md-5 = "0.10"
# HmacSHA1 的摘要实现(signa 签名用);已在依赖树(传递依赖),提升为直接依赖零成本。
sha1 = "0.10"
# issue #609 F-03:history.json 完整性校验(HMAC-SHA256),密钥存系统凭据库。
hmac = "0.12"
# issue #609 H-02:HMAC 比较走常量时间,避免计时侧信道。已在依赖树(sha2/hmac 传递),
# 提升为直接依赖零额外编译成本。
subtle = "2"
# F-03 的 HMAC 密钥首次生成用 OS CSPRNG。0.3.x 已在依赖树里,提升为直接依赖零额外编译成本。
getrandom = "0.3"
bzip2 = "0.4"
tar = "0.4"
tokio = { version = "1", features = ["full"] }
tokio-tungstenite = { version = "0.24", features = ["rustls-tls-webpki-roots"] }
futures-util = "0.3"
reqwest = { version = "0.12", default-features = false, features = ["json", "multipart", "rustls-tls", "stream", "system-proxy"] }
zip = "2"
thiserror = "1"
anyhow = "1"
log = "0.4"
env_logger = "0.11"
simplelog = "0.12"
parking_lot = "0.12"
once_cell = "1"
uuid = { version = "1", features = ["v4", "serde"] }
chrono = { version = "0.4", features = ["serde"] }
regex = "1"
bytes = "1"
url = "2"
raw-window-handle = "0.6"
# Audio capture — shared across desktop and mobile.
cpal = "0.15"
[target.'cfg(any(target_os = "android", target_os = "ios"))'.dependencies]
tauri-plugin-fs = "2.5.1"
# Desktop-only plugins, hotkey/insertion helpers, and tray-icon (not built for mobile).
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
reqwest = { version = "0.12", default-features = false, features = ["native-tls"] }
tauri = { version = "=2.11.2", features = ["macos-private-api", "tray-icon"] }
tauri-plugin-updater = "=2.10.1"
tauri-plugin-single-instance = "2"
tauri-plugin-autostart = "2"
global-hotkey = "0.6"
enigo = "0.3"
arboard = "3"
rcgen = { version = "0.13", features = ["x509-parser"] }
x509-parser = { version = "0.16", features = ["verify"] }
time = "0.3"
tempfile = "3"
local-ip-address = "^0.6"
rustls = { version = "^0.23", default-features = false, features = ["ring", "std", "tls12", "logging"] }
tokio-rustls = { version = "^0.26", default-features = false, features = ["ring", "tls12", "logging"] }
axum = { version = "^0.7", default-features = false, features = ["ws", "http1", "tokio", "query"] }
hyper = { version = "^1", features = ["server", "http1"] }
hyper-util = { version = "^0.1", features = ["tokio", "server-auto", "server", "http1"] }
tower = { version = "^0.5", features = ["util"] }
[target.'cfg(target_os = "macos")'.dependencies.keyring]
version = "3.6.3"
default-features = false
features = ["apple-native"]
[target.'cfg(target_os = "windows")'.dependencies.keyring]
version = "3.6.3"
default-features = false
features = ["windows-native"]
[target.'cfg(unix)'.dependencies]
# PIN persistence uses O_NOFOLLOW/O_NONBLOCK/O_CLOEXEC; macOS qwen-asr also
# uses libc::free for strings allocated by the C runtime.
libc = "0.2"
[target.'cfg(target_os = "android")'.dependencies]
jni = "0.21"
ndk-context = "0.1"
tao = "0.35"
[target.'cfg(target_os = "macos")'.dependencies]
security-framework = "=3.7.0"
block2 = "0.5"
core-foundation = "0.10"
tokenizers = "0.21"
whisper-rs = { version = "0.14", features = ["metal"] }
core-graphics = "0.24"
# issue #470:托盘麦克风设备变更改用 CoreAudio AudioObjectAddPropertyListener 原生通知
# (替代 10s 轮询,空闲零唤醒)。符号本就在依赖树(cpal → coreaudio-sys 0.2),提升为
# 直接依赖零额外编译成本。
coreaudio-sys = "0.2"
objc2 = { version = "0.5", features = ["exception"] }
objc2-foundation = "0.2"
objc2-app-kit = "0.2"
tauri-nspanel = { git = "https://github.com/ahkohd/tauri-nspanel", branch = "v2" }
[target.'cfg(all(target_os = "macos", target_arch = "aarch64"))'.dependencies]
# 注意:path 依赖的 manifest 会被 Cargo 解析器跨所有 target 读取(与 cfg gating
# 无关),所以**所有平台**源码构建都必须先 `git submodule update --init --recursive`,
# 否则 cargo check 会在解析阶段硬失败。CI 里非 macOS 任务依赖
# scripts/ci-disable-macos-qwen3.mjs 删掉本行来规避。
qwen3-asr-rs = { path = "vendor/qwen3-asr-rs", default-features = false, features = ["mlx"] }
[target.'cfg(target_os = "windows")'.dependencies]
windows-core = "0.58"
foundry-local-sdk = { version = "=1.2.1", features = ["winml"] }
raw-window-handle = "0.6"
sherpa-onnx = { version = "1.13.2", default-features = false, features = ["static"] }
windows = { version = "0.58", features = [
"implement",
"Win32_UI_Accessibility",
"Win32_System_Variant",
"Win32_Foundation",
"Win32_Globalization",
"Win32_Graphics_Dwm",
"Win32_Graphics_Gdi",
"Win32_Media_Audio",
"Win32_Media_Audio_Endpoints",
"Win32_Security",
"Win32_Storage_FileSystem",
"Win32_System_Com",
"Win32_System_DataExchange",
"Win32_System_Diagnostics_ToolHelp",
"Win32_System_JobObjects",
"Win32_System_Ole",
"Win32_System_Registry",
"Win32_System_Threading",
"Win32_UI_HiDpi",
"Win32_UI_Input_KeyboardAndMouse",
"Win32_UI_Shell",
"Win32_UI_TextServices",
"Win32_UI_WindowsAndMessaging",
] }
winreg = "0.52"
# 跨平台磨砂层(macOS NSVisualEffectView / Windows Mica)。
[target.'cfg(any(target_os = "macos", target_os = "windows"))'.dependencies]
window-vibrancy = "0.7"
[features]
default = ["custom-protocol"]
custom-protocol = ["tauri/custom-protocol"]
[profile.release]
# 之前没有 [profile.release] —— 发布版走 Cargo 默认(无 LTO、不 strip、
# codegen-units=16)。这个体量的 Tauri 应用(tokio-full / reqwest / axum /
# sherpa-onnx / windows crate 全家桶)开 LTO + codegen-units=1 + strip 能
# 明显减小二进制体积并提升运行速度。保留默认 panic="unwind":后台线程 panic
# 时只杀该线程、不 abort 掉常驻进程,稳健性与改动前一致。
opt-level = 3
lto = "thin"
codegen-units = 1
# Xcode 27 beta 的 strip 会损坏 proc-macro dylib;本地构建加 CARGO_PROFILE_RELEASE_STRIP=none。
strip = "symbols"