//! Meeting auto-capture — the single-signal variant. //! //! The frontend polls `detect_meeting_processes` on an interval with the //! user's app patterns. On a positive hit it surfaces a non-modal toast //! that reminds the user to start recording with their hotkey. We do not //! start recording from this signal — the user decides. use std::sync::Mutex; use lumotia_core::process_watch::{self, ProcessLister}; /// Tauri-managed state for the meeting poller. Holds a long-lived /// `ProcessLister` so each poll refreshes the existing `sysinfo::System` /// in place instead of allocating a fresh one — the previous implementation /// rebuilt the process table from scratch every 15 s. pub struct MeetingState { lister: Mutex, } impl MeetingState { pub fn new() -> Self { Self { lister: Mutex::new(ProcessLister::new()), } } } impl Default for MeetingState { fn default() -> Self { Self::new() } } #[tauri::command] pub fn detect_meeting_processes( state: tauri::State<'_, MeetingState>, patterns: Vec, ) -> Result, String> { if patterns.is_empty() { return Ok(Vec::new()); } let processes = { let mut lister = state .lister .lock() .map_err(|e| format!("MeetingState lister poisoned: {e}"))?; lister.snapshot() }; Ok(process_watch::match_meeting_patterns(&processes, &patterns)) }