//! OmniVoice Studio — Tauri desktop shell.
//!
//! Module layout:
//! config – persistent app config, region helpers
//! bootstrap – first-run venv creation, progress stages, retry commands
//! tools – sidecar detection, FFmpeg/ffprobe/uv resolution & install
//! backend – spawn backend process, port probing, log paths
//! commands – Tauri IPC commands (sysinfo, logs, HF cache, paste, tray, dictation)
pub mod config;
pub mod bootstrap;
pub mod tools;
pub mod backend;
pub mod commands;
use std::process::Child;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
use std::time::Duration;
use tauri::{Emitter, Manager};
use tauri::menu::{MenuBuilder, MenuItemBuilder};
use tauri::tray::TrayIconBuilder;
use crate::bootstrap::{BootstrapStage, BootstrapState, set_stage};
use crate::config::{default_dictation_shortcut, load_config};
// ── Port ──────────────────────────────────────────────────────────────────
pub fn backend_port() -> u16 {
std::env::var("OMNIVOICE_PORT")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(3900)
}
// ── Shared state types ────────────────────────────────────────────────────
pub struct BackendState {
pub process: Mutex