pub mod ai;
pub mod meetings;
pub mod notes;
pub mod openrouter;
pub mod playback;
pub mod recorder;
pub mod settings;
pub mod speakers;
pub mod transcribe;
pub mod transcript;
mod commands;
use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::{Arc, Mutex, RwLock};
use tauri::Manager;
pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_dialog::init())
.setup(|app| {
let config_dir = app.path().app_config_dir()?;
let data_dir = app.path().app_data_dir()?;
let settings_path = settings::settings_path(&config_dir);
let default_meetings_dir = data_dir.join("meetings");
let voices_model = app
.path()
.resource_dir()
.map(|d| d.join("models").join("voices.onnx"))
.unwrap_or_default();
let chosen = settings::Settings::load(&settings_path)
.map(|s| s.storage_dir)
.unwrap_or_default();
let root = if chosen.trim().is_empty() {
default_meetings_dir.clone()
} else {
PathBuf::from(chosen)
};
commands::allow_playback(app.handle(), &root);
let store = Arc::new(meetings::Store::new(root));
let _ = store.recover_interrupted();
app.manage(commands::AppState {
settings_path,
store: RwLock::new(store),
default_meetings_dir,
secrets: Arc::new(settings::Keyring),
recording: Mutex::new(None),
jobs: Mutex::new(HashMap::new()),
voices_model,
check: Mutex::new(None),
});
Ok(())
})
.invoke_handler(tauri::generate_handler![
commands::get_settings,
commands::save_settings,
commands::set_openrouter_key,
commands::check_openrouter_key,
commands::delete_openrouter_key,
commands::list_meetings,
commands::get_meeting,
commands::save_note,
commands::remove_section,
commands::cancel_job,
commands::set_storage_dir,
commands::open_folder,
commands::rename_meeting,
commands::delete_meeting,
commands::add_audio,
commands::transcribe_meeting,
commands::regroup_speakers,
commands::add_marker,
commands::set_markers,
commands::playback,
commands::run_command,
commands::recorder_status,
commands::audio_check_start,
commands::audio_check_stop,
commands::open_privacy,
commands::recorder_start,
commands::recorder_pause,
commands::recorder_stop,
])
.run(tauri::generate_context!())
.expect("Skillok Meet не запустился");
}