From 2ca16d47b9c2cae631712ba3a79c77ff728154f9 Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:16:38 +0200 Subject: [PATCH 01/19] fix(ui): enable scrolling in issue triage list and add page/home/end navigation --- src/app/filters.rs | 53 ++++++++++++++++++++++++++++++++++++ src/app/input.rs | 56 ++++++++++++++++++++++++++++++++++++++ src/ui/mod.rs | 32 ++++++++++++++++++++++ src/ui/views/issue_list.rs | 6 ++-- 4 files changed, 145 insertions(+), 2 deletions(-) diff --git a/src/app/filters.rs b/src/app/filters.rs index 591e8ef..4461e10 100644 --- a/src/app/filters.rs +++ b/src/app/filters.rs @@ -106,6 +106,35 @@ impl App { } } + pub fn first_issue(&mut self) { + let indices = self.filtered_issue_indices(); + if !indices.is_empty() { + self.selected_filtered_index = 0; + } + } + + pub fn last_issue(&mut self) { + let indices = self.filtered_issue_indices(); + if !indices.is_empty() { + self.selected_filtered_index = indices.len() - 1; + } + } + + pub fn page_up_issue(&mut self, step: usize) { + let indices = self.filtered_issue_indices(); + if !indices.is_empty() { + self.selected_filtered_index = self.selected_filtered_index.saturating_sub(step); + } + } + + pub fn page_down_issue(&mut self, step: usize) { + let indices = self.filtered_issue_indices(); + if !indices.is_empty() { + self.selected_filtered_index = + (self.selected_filtered_index + step).min(indices.len() - 1); + } + } + pub fn toggle_severity_filter(&mut self, sev: Severity) { if self.severity_filter == Some(sev) { self.severity_filter = None; @@ -349,4 +378,28 @@ mod tests { app.clear_filters(); assert!(!app.has_active_filters()); } + + #[test] + fn paging_and_boundary_jumps() { + let mut app = app_with_issues(); + assert_eq!(app.selected_filtered_index, 0); + + app.last_issue(); + assert_eq!(app.selected_filtered_index, 2); + + app.first_issue(); + assert_eq!(app.selected_filtered_index, 0); + + app.page_down_issue(1); + assert_eq!(app.selected_filtered_index, 1); + + app.page_down_issue(10); + assert_eq!(app.selected_filtered_index, 2); + + app.page_up_issue(1); + assert_eq!(app.selected_filtered_index, 1); + + app.page_up_issue(10); + assert_eq!(app.selected_filtered_index, 0); + } } diff --git a/src/app/input.rs b/src/app/input.rs index be5f17b..d17b95d 100644 --- a/src/app/input.rs +++ b/src/app/input.rs @@ -179,18 +179,22 @@ pub fn handle_key(app: &mut App, code: KeyCode) { }, KeyCode::PageUp => match app.active_tab { TAB_SCANNER | TAB_REPAIR => app.scroll_log_up(10), + TAB_TRIAGE => app.page_up_issue(10), _ => {} }, KeyCode::PageDown => match app.active_tab { TAB_SCANNER | TAB_REPAIR => app.scroll_log_down(10), + TAB_TRIAGE => app.page_down_issue(10), _ => {} }, KeyCode::Home => match app.active_tab { TAB_SCANNER | TAB_REPAIR => app.scroll_log_top(), + TAB_TRIAGE => app.first_issue(), _ => {} }, KeyCode::End => match app.active_tab { TAB_SCANNER | TAB_REPAIR => app.scroll_log_bottom(), + TAB_TRIAGE => app.last_issue(), _ => {} }, @@ -690,4 +694,56 @@ mod tests { assert!(app.setting_input.is_none()); assert_eq!(app.config.temp_clean_threshold_mb, 800); } + + #[test] + fn triage_navigation_keys() { + let mut app = app(); + app.active_tab = TAB_TRIAGE; + for i in 0..15 { + app.issues.push(Issue::new( + format!("iss_{i}"), + "sys", + format!("Issue {i}"), + "Category", + Severity::Info, + RiskScore::Low, + "Desc", + "Details", + "Fix", + vec![], + )); + } + + assert_eq!(app.selected_filtered_index, 0); + + handle_key(&mut app, KeyCode::Down); + assert_eq!(app.selected_filtered_index, 1); + + handle_key(&mut app, KeyCode::Char('j')); + assert_eq!(app.selected_filtered_index, 2); + + handle_key(&mut app, KeyCode::Up); + assert_eq!(app.selected_filtered_index, 1); + + handle_key(&mut app, KeyCode::Char('k')); + assert_eq!(app.selected_filtered_index, 0); + + handle_key(&mut app, KeyCode::End); + assert_eq!(app.selected_filtered_index, 14); + + handle_key(&mut app, KeyCode::Home); + assert_eq!(app.selected_filtered_index, 0); + + handle_key(&mut app, KeyCode::PageDown); + assert_eq!(app.selected_filtered_index, 10); + + handle_key(&mut app, KeyCode::PageDown); + assert_eq!(app.selected_filtered_index, 14); + + handle_key(&mut app, KeyCode::PageUp); + assert_eq!(app.selected_filtered_index, 4); + + handle_key(&mut app, KeyCode::PageUp); + assert_eq!(app.selected_filtered_index, 0); + } } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index a36a103..9696a91 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -319,4 +319,36 @@ mod tests { assert!(!screen(&app, 160, 45).contains("Last action:")); } + + #[test] + fn triage_scrolls_down_when_navigating_to_lower_issues() { + let mut app = App::new(); + app.pending_confirm = None; + app.active_tab = TAB_TRIAGE; + for i in 0..30 { + app.issues.push(crate::engine::issue::Issue::new( + format!("issue_{i}"), + "system_integrity", + format!("Issue #{i:02} Finding Title"), + "System & Integrity", + crate::engine::issue::Severity::Warning, + crate::engine::issue::RiskScore::Low, + "Description", + "Technical details", + "Fix step", + vec![], + )); + } + + // At index 0, Issue #00 is visible and Issue #25 is off-screen + app.selected_filtered_index = 0; + let rendered_top = screen(&app, 120, 24); + assert!(rendered_top.contains("Issue #00 Finding Title")); + assert!(!rendered_top.contains("Issue #25 Finding Title")); + + // When navigating down to index 25, the list must scroll down and display Issue #25 + app.selected_filtered_index = 25; + let rendered_bottom = screen(&app, 120, 24); + assert!(rendered_bottom.contains("Issue #25 Finding Title")); + } } diff --git a/src/ui/views/issue_list.rs b/src/ui/views/issue_list.rs index 2791346..b64b59b 100644 --- a/src/ui/views/issue_list.rs +++ b/src/ui/views/issue_list.rs @@ -4,7 +4,7 @@ use ratatui::Frame; use ratatui::layout::{Constraint, Direction, Layout, Rect}; use ratatui::style::{Modifier, Style}; use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, List, ListItem, Paragraph, Wrap}; +use ratatui::widgets::{Block, Borders, List, ListItem, ListState, Paragraph, Wrap}; pub struct IssueListViewState<'a> { pub issues: &'a [Issue], @@ -174,7 +174,9 @@ pub fn render_issue_list(f: &mut Frame, area: Rect, state: &IssueListViewState) .title(list_title), ); - f.render_widget(issue_list, main_split[0]); + let mut list_state = ListState::default(); + list_state.select(Some(state.selected_filtered_index)); + f.render_stateful_widget(issue_list, main_split[0], &mut list_state); } // Right Pane: Detailed Issue View From 0ee2d0645f574b9914fdcb8047bc545abc217c5c Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:18:10 +0200 Subject: [PATCH 02/19] test(engine): use MockCommandRunner in runner tests to eliminate real OS command execution --- src/engine/runner.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/engine/runner.rs b/src/engine/runner.rs index e83b7ab..55b8271 100644 --- a/src/engine/runner.rs +++ b/src/engine/runner.rs @@ -997,7 +997,8 @@ mod tests { #[tokio::test] async fn test_cancelled_scan_reports_progress() { - let engine = DiagnosticEngine::new(&AppConfig::default()); + let mock = Arc::new(crate::utils::cmd::MockCommandRunner::new()); + let engine = DiagnosticEngine::with_runner(&AppConfig::default(), mock); let (tx, mut rx) = channel::(200); let cancel = CancellationToken::new(); @@ -1021,7 +1022,8 @@ mod tests { #[tokio::test] async fn test_run_scan_emits_events_and_completes() { - let engine = DiagnosticEngine::new(&AppConfig::default()); + let mock = Arc::new(crate::utils::cmd::MockCommandRunner::new()); + let engine = DiagnosticEngine::with_runner(&AppConfig::default(), mock); let (tx, mut rx) = channel::(200); let _issues = engine.run_scan(tx, CancellationToken::new()).await; @@ -1101,7 +1103,8 @@ mod tests { verbose_logging: true, ..Default::default() }; - let engine = DiagnosticEngine::new(&config); + let mock = Arc::new(crate::utils::cmd::MockCommandRunner::new()); + let engine = DiagnosticEngine::with_runner(&config, mock); assert!(engine.verbose_logging); let (tx, mut rx) = channel::(200); From 1af5f1786b462c0295b67e8d80ee71e1e3a7971a Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:22:03 +0200 Subject: [PATCH 03/19] refactor(ui): remove redundant Quick Access box from dashboard tab --- src/ui/mod.rs | 21 +--- src/ui/views/dashboard.rs | 104 +----------------- .../challenger_m2_adversarial.rs | 0 .../m3_adversarial_challenger_test.rs | 0 .../test_milestone3_challenger2.rs | 0 tests/{ => integration}/tier1_features.rs | 0 tests/{ => integration}/tier2_boundaries.rs | 0 tests/{ => integration}/tier3_combinations.rs | 0 tests/{ => integration}/tier4_scenarios.rs | 0 9 files changed, 6 insertions(+), 119 deletions(-) rename tests/{ => integration}/challenger_m2_adversarial.rs (100%) rename tests/{ => integration}/m3_adversarial_challenger_test.rs (100%) rename tests/{ => integration}/test_milestone3_challenger2.rs (100%) rename tests/{ => integration}/tier1_features.rs (100%) rename tests/{ => integration}/tier2_boundaries.rs (100%) rename tests/{ => integration}/tier3_combinations.rs (100%) rename tests/{ => integration}/tier4_scenarios.rs (100%) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 9696a91..79f6a39 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -52,7 +52,6 @@ pub fn render_app(f: &mut Frame, app: &App) { app.health_score, &app.issues, &app.module_statuses, - &app.audit_entries, ); } TAB_SCANNER => { @@ -298,26 +297,14 @@ mod tests { } #[test] - fn the_dashboard_links_back_to_the_audit_trail_it_no_longer_owns() { + fn the_dashboard_renders_cleanly_without_quick_access_box() { let mut app = populated_app(); app.active_tab = TAB_DASHBOARD; let rendered = screen(&app, 160, 45); - assert!(rendered.contains("Last action:")); - assert!(rendered.contains("Disabled a startup entry")); - assert!( - rendered.contains("[5] Full log, backups & rollback"), - "and points at the tab that now holds it" - ); - } - - #[test] - fn a_machine_with_no_audit_trail_shows_no_empty_last_action_row() { - let mut app = populated_app(); - app.active_tab = TAB_DASHBOARD; - app.audit_entries.clear(); - - assert!(!screen(&app, 160, 45).contains("Last action:")); + assert!(rendered.contains("SYSTEM HEALTH INDEX")); + assert!(rendered.contains("SYSTEM SPECIFICATION")); + assert!(!rendered.contains("QUICK ACCESS")); } #[test] diff --git a/src/ui/views/dashboard.rs b/src/ui/views/dashboard.rs index 90f0853..6fcaa89 100644 --- a/src/ui/views/dashboard.rs +++ b/src/ui/views/dashboard.rs @@ -1,8 +1,6 @@ use crate::engine::issue::{Issue, Severity}; use crate::modules::ModuleStatus; -use crate::safety::audit::AuditEntry; use crate::ui::theme::Theme; -use crate::ui::widgets::safety_panel::latest_action_line; use crate::utils::hardware::SystemTelemetry; use ratatui::Frame; use ratatui::layout::{Constraint, Direction, Layout, Rect}; @@ -28,12 +26,7 @@ pub fn render_dashboard( health_score: u8, issues: &[Issue], module_statuses: &[(String, String, String, ModuleStatus)], - audit_entries: &[AuditEntry], ) { - // The summary bar grows by a line once there is an audit trail to show, so - // an untouched machine does not reserve space for an empty row. - let summary_height = if audit_entries.is_empty() { 5 } else { 6 }; - // The card grid follows the module list rather than a fixed slot count, so // registering a module cannot silently drop it off the dashboard. let row_count = module_statuses.len().div_ceil(CARDS_PER_ROW).max(1); @@ -43,9 +36,8 @@ pub fn render_dashboard( let main_chunks = Layout::default() .direction(Direction::Vertical) .constraints([ - Constraint::Length(7), // Health Score & Telemetry Gauges - Constraint::Min(cards_height), // Module Status Cards - Constraint::Length(summary_height), // Quick Action & Status Summary + Constraint::Length(7), // Health Score & Telemetry Gauges + Constraint::Min(cards_height), // Module Status Cards ]) .split(area); @@ -68,16 +60,6 @@ pub fn render_dashboard( Theme::CORAL }; - let health_status_text = if health_score == 100 { - "OPTIMAL - all systems healthy" - } else if health_score >= 80 { - "GOOD - minor optimisations possible" - } else if health_score >= 50 { - "WARNING - action needed" - } else { - "CRITICAL - immediate repair recommended" - }; - let critical_count = issues .iter() .filter(|i| i.severity == Severity::Critical && !i.is_fixed) @@ -268,86 +250,4 @@ pub fn render_dashboard( f.render_widget(card, slot_rect); } } - - // Bottom Section: Quick Action Bar - let mut bottom_content = vec![ - Line::from(vec![ - Span::styled( - " Quick actions: ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - " [S] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "Start a full health scan ", - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [A] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "One-click auto-fix all ", - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [3] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "Open issue triage ", - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [5] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "Settings & safety ", - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [?] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled("Help", Style::default().fg(Theme::TEXT_WHITE)), - ]), - Line::from(vec![ - Span::styled( - format!(" Safety status: {}", health_status_text), - Style::default() - .fg(health_color) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - " │ VSS restore points are created automatically before every change.", - Style::default().fg(Theme::MUTED), - ), - ]), - ]; - - // The audit trail moved onto tab 5 when "Backups & Logs" was merged into - // Settings. This one line keeps the most recent action where the user - // already is, and points at the tab that holds the rest of it. - if let Some(line) = latest_action_line(audit_entries) { - bottom_content.push(line); - } - - let bottom_bar = - Paragraph::new(bottom_content).block(Theme::card_block("QUICK ACCESS & RECOMMENDATIONS")); - f.render_widget(bottom_bar, main_chunks[2]); } diff --git a/tests/challenger_m2_adversarial.rs b/tests/integration/challenger_m2_adversarial.rs similarity index 100% rename from tests/challenger_m2_adversarial.rs rename to tests/integration/challenger_m2_adversarial.rs diff --git a/tests/m3_adversarial_challenger_test.rs b/tests/integration/m3_adversarial_challenger_test.rs similarity index 100% rename from tests/m3_adversarial_challenger_test.rs rename to tests/integration/m3_adversarial_challenger_test.rs diff --git a/tests/test_milestone3_challenger2.rs b/tests/integration/test_milestone3_challenger2.rs similarity index 100% rename from tests/test_milestone3_challenger2.rs rename to tests/integration/test_milestone3_challenger2.rs diff --git a/tests/tier1_features.rs b/tests/integration/tier1_features.rs similarity index 100% rename from tests/tier1_features.rs rename to tests/integration/tier1_features.rs diff --git a/tests/tier2_boundaries.rs b/tests/integration/tier2_boundaries.rs similarity index 100% rename from tests/tier2_boundaries.rs rename to tests/integration/tier2_boundaries.rs diff --git a/tests/tier3_combinations.rs b/tests/integration/tier3_combinations.rs similarity index 100% rename from tests/tier3_combinations.rs rename to tests/integration/tier3_combinations.rs diff --git a/tests/tier4_scenarios.rs b/tests/integration/tier4_scenarios.rs similarity index 100% rename from tests/tier4_scenarios.rs rename to tests/integration/tier4_scenarios.rs From 17599fd4827e38bba0badd3733b1edc57036051e Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:22:08 +0200 Subject: [PATCH 04/19] test(integration): consolidate test suites into a single test binary target --- tests/integration/tier1_features.rs | 2 +- tests/integration/tier2_boundaries.rs | 2 +- tests/integration/tier3_combinations.rs | 2 +- tests/integration/tier4_scenarios.rs | 2 +- tests/integration_tests.rs | 22 ++++++++++++++++++++++ 5 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 tests/integration_tests.rs diff --git a/tests/integration/tier1_features.rs b/tests/integration/tier1_features.rs index d1c70ce..c22d083 100644 --- a/tests/integration/tier1_features.rs +++ b/tests/integration/tier1_features.rs @@ -1,6 +1,6 @@ #![allow(dead_code, unused_imports)] -mod common; +use crate::common; use std::fs::File; use std::io::Write; diff --git a/tests/integration/tier2_boundaries.rs b/tests/integration/tier2_boundaries.rs index 18a6a41..b1e700f 100644 --- a/tests/integration/tier2_boundaries.rs +++ b/tests/integration/tier2_boundaries.rs @@ -1,6 +1,6 @@ #![allow(dead_code, unused_imports)] -mod common; +use crate::common; use std::fs::{self, File}; use std::io::Write; diff --git a/tests/integration/tier3_combinations.rs b/tests/integration/tier3_combinations.rs index 18b6084..6ea28c6 100644 --- a/tests/integration/tier3_combinations.rs +++ b/tests/integration/tier3_combinations.rs @@ -1,6 +1,6 @@ #![allow(dead_code, unused_imports)] -mod common; +use crate::common; use std::fs::{self, File}; use std::io::Write; diff --git a/tests/integration/tier4_scenarios.rs b/tests/integration/tier4_scenarios.rs index 3f57d54..eaa65d8 100644 --- a/tests/integration/tier4_scenarios.rs +++ b/tests/integration/tier4_scenarios.rs @@ -1,6 +1,6 @@ #![allow(dead_code, unused_imports)] -mod common; +use crate::common; use std::fs::{self, File}; use std::io::Write; diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs new file mode 100644 index 0000000..968e7f4 --- /dev/null +++ b/tests/integration_tests.rs @@ -0,0 +1,22 @@ +mod common; + +#[path = "integration/tier1_features.rs"] +mod tier1_features; + +#[path = "integration/tier2_boundaries.rs"] +mod tier2_boundaries; + +#[path = "integration/tier3_combinations.rs"] +mod tier3_combinations; + +#[path = "integration/tier4_scenarios.rs"] +mod tier4_scenarios; + +#[path = "integration/challenger_m2_adversarial.rs"] +mod challenger_m2_adversarial; + +#[path = "integration/m3_adversarial_challenger_test.rs"] +mod m3_adversarial_challenger_test; + +#[path = "integration/test_milestone3_challenger2.rs"] +mod test_milestone3_challenger2; From c89ab1277180c9b589512bfb6ab16356f360f040 Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:26:36 +0200 Subject: [PATCH 05/19] feat: persist scan state across app restarts and clean up repair summary box --- src/app/events.rs | 2 + src/app/mod.rs | 2 + src/app/scan_state.rs | 103 +++++++++++++++++++++++++++++++++++ src/app/state.rs | 85 ++++++++++++++++++++++++++--- src/engine/issue.rs | 2 +- src/modules/mod.rs | 3 +- src/ui/views/fix_progress.rs | 9 +-- 7 files changed, 188 insertions(+), 18 deletions(-) create mode 100644 src/app/scan_state.rs diff --git a/src/app/events.rs b/src/app/events.rs index 2b30960..ad3cc19 100644 --- a/src/app/events.rs +++ b/src/app/events.rs @@ -175,6 +175,7 @@ impl App { self.scan_event_rx = None; self.cancel_token = None; self.audit_entries = self.audit_logger.get_history(); + self.save_scan_state(); } } @@ -300,6 +301,7 @@ impl App { self.audit_entries = self.audit_logger.get_history(); self.backup_records = self.reg_backup_mgr.list_backups(); self.clamp_backup_selection(); + self.save_scan_state(); } } diff --git a/src/app/mod.rs b/src/app/mod.rs index 42bb69d..adf5069 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -26,11 +26,13 @@ pub mod filters; pub mod input; pub mod run_control; pub mod safety; +pub mod scan_state; pub mod settings; pub mod state; pub use confirm::{ConfirmRequest, SystemActions}; pub use input::handle_key; +pub use scan_state::ScanState; pub use state::{App, SafetyFocus, SettingInput}; /// Maximum number of log lines kept in memory for scan and repair terminal buffers. diff --git a/src/app/scan_state.rs b/src/app/scan_state.rs new file mode 100644 index 0000000..9e8a9c1 --- /dev/null +++ b/src/app/scan_state.rs @@ -0,0 +1,103 @@ +//! Persistence for the latest scan state across app restarts. +//! +//! Stores the diagnosed issues, module statuses, health index and timestamp +//! in `%APPDATA%\WinMedic\last_scan.json`. + +use chrono::Local; +use serde::{Deserialize, Serialize}; +use std::path::{Path, PathBuf}; + +use crate::engine::issue::Issue; +use crate::modules::ModuleStatus; + +pub const SCAN_STATE_FILE_NAME: &str = "last_scan.json"; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct ScanState { + pub timestamp: String, + pub health_score: u8, + pub issues: Vec, + pub module_statuses: Vec<(String, String, String, ModuleStatus)>, + #[serde(default)] + pub scan_duration_secs: Option, +} + +impl ScanState { + pub fn new( + health_score: u8, + issues: Vec, + module_statuses: Vec<(String, String, String, ModuleStatus)>, + scan_duration_secs: Option, + ) -> Self { + Self { + timestamp: Local::now().format("%Y-%m-%d %H:%M:%S").to_string(), + health_score, + issues, + module_statuses, + scan_duration_secs, + } + } + + pub fn file_path() -> PathBuf { + let base = dirs::data_dir().unwrap_or_else(|| PathBuf::from(".")); + base.join("WinMedic").join(SCAN_STATE_FILE_NAME) + } + + pub fn load() -> Option { + Self::load_from(&Self::file_path()) + } + + pub fn load_from(path: &Path) -> Option { + let data = std::fs::read_to_string(path).ok()?; + serde_json::from_str(&data).ok() + } + + pub fn save(&self) -> Result<(), std::io::Error> { + Self::save_to(self, &Self::file_path()) + } + + pub fn save_to(&self, path: &Path) -> Result<(), std::io::Error> { + if let Some(parent) = path.parent() { + let _ = std::fs::create_dir_all(parent); + } + let json = serde_json::to_string_pretty(self) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?; + std::fs::write(path, json) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::engine::issue::{RiskScore, Severity}; + + #[test] + fn test_scan_state_serialization_round_trip() { + let tmp = std::env::temp_dir().join(format!("winmedic_scan_state_test_{}.json", std::process::id())); + let issue = Issue::new( + "test_iss", + "storage", + "Corrupted volume", + "Storage", + Severity::Critical, + RiskScore::High, + "Desc", + "Details", + "Fix", + vec!["Step 1".to_string()], + ); + let statuses = vec![("storage".to_string(), "Storage".to_string(), "[DSK]".to_string(), ModuleStatus::Critical(1))]; + + let state = ScanState::new(75, vec![issue], statuses, Some(12)); + state.save_to(&tmp).unwrap(); + + let loaded = ScanState::load_from(&tmp).expect("should load saved scan state"); + assert_eq!(loaded.health_score, 75); + assert_eq!(loaded.issues.len(), 1); + assert_eq!(loaded.issues[0].id, "test_iss"); + assert_eq!(loaded.module_statuses.len(), 1); + assert_eq!(loaded.scan_duration_secs, Some(12)); + + let _ = std::fs::remove_file(&tmp); + } +} diff --git a/src/app/state.rs b/src/app/state.rs index 053958a..9d98dd3 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -3,7 +3,7 @@ //! modules listed in [`crate::app`]. use super::{ - BackgroundEvent, TAB_COUNT, TAB_DASHBOARD, TAB_REPAIR, TAB_SCANNER, TAB_SETTINGS, + BackgroundEvent, ScanState, TAB_COUNT, TAB_DASHBOARD, TAB_REPAIR, TAB_SCANNER, TAB_SETTINGS, push_bounded_log, }; use crate::config::AppConfig; @@ -225,7 +225,31 @@ impl App { let backup_records = reg_backup_mgr.list_backups(); let (bg_tx, bg_rx) = tokio::sync::mpsc::unbounded_channel(); - let (module_progress_list, module_statuses) = Self::module_lists(&engine); + let (module_progress_list, default_module_statuses) = Self::module_lists(&engine); + let (saved_issues, saved_health, module_statuses, saved_duration, init_msg) = + if let Some(saved) = ScanState::load() { + let health = DiagnosticEngine::calculate_health_score(&saved.issues); + let open_count = saved.issues.iter().filter(|i| !i.is_fixed).count(); + let msg = format!( + "WinMedic initialised. Loaded previous scan from {} ({} open issues, health: {}/100).", + saved.timestamp, open_count, health + ); + ( + saved.issues, + health, + saved.module_statuses, + saved.scan_duration_secs.map(Duration::from_secs), + msg, + ) + } else { + ( + Vec::new(), + 100, + default_module_statuses, + None, + "WinMedic initialised. Ready to diagnose.".to_string(), + ) + }; Self { active_tab: TAB_DASHBOARD, @@ -234,9 +258,9 @@ impl App { telemetry_collector, telemetry, engine, - issues: Vec::new(), + issues: saved_issues, selected_issue_index: 0, - health_score: 100, + health_score: saved_health, severity_filter: None, module_filter: None, search_query: String::new(), @@ -245,12 +269,10 @@ impl App { is_scanning: false, scan_overall_progress: 0, scan_started_at: None, - scan_duration: None, + scan_duration: saved_duration, module_progress_list, module_statuses, - scan_log_messages: VecDeque::from([String::from( - "WinMedic initialised. Ready to diagnose.", - )]), + scan_log_messages: VecDeque::from([init_msg]), scan_log_scroll: 0, is_fixing: false, dry_run: false, @@ -507,12 +529,24 @@ impl App { .map(|_| path) .map_err(|e| format!("Export failed: {}", e)) } + + /// Persist the latest scan results, health score, and module statuses to disk. + pub fn save_scan_state(&self) { + let state = ScanState::new( + self.health_score, + self.issues.clone(), + self.module_statuses.clone(), + self.scan_duration.map(|d| d.as_secs()), + ); + let _ = state.save(); + } } #[cfg(test)] mod tests { use super::*; use crate::app::MAX_LOG_LINES; + use crate::engine::issue::RiskScore; #[test] fn test_app_export_report() { @@ -578,4 +612,39 @@ mod tests { app.next_tab(); assert_eq!(app.active_tab, 1); } + + #[test] + fn test_app_persists_and_restores_scan_state() { + let tmp = std::env::temp_dir().join(format!("winmedic_state_test_{}.json", std::process::id())); + let mut app = App::new(); + app.issues = vec![Issue::new( + "iss_1", + "storage", + "Low Disk Space", + "Storage", + Severity::Warning, + RiskScore::Low, + "Temp files are taking up too much space", + "5 GB in temp directory", + "Clean temp files", + vec!["Delete temp files".to_string()], + )]; + app.health_score = 85; + + let state = ScanState::new( + app.health_score, + app.issues.clone(), + app.module_statuses.clone(), + Some(5), + ); + state.save_to(&tmp).unwrap(); + + let loaded = ScanState::load_from(&tmp).expect("should load scan state"); + assert_eq!(loaded.health_score, 85); + assert_eq!(loaded.issues.len(), 1); + assert_eq!(loaded.issues[0].title, "Low Disk Space"); + assert_eq!(loaded.scan_duration_secs, Some(5)); + + let _ = std::fs::remove_file(tmp); + } } diff --git a/src/engine/issue.rs b/src/engine/issue.rs index 3eae384..f3dc042 100644 --- a/src/engine/issue.rs +++ b/src/engine/issue.rs @@ -43,7 +43,7 @@ impl RiskScore { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Issue { pub id: String, pub module_id: String, diff --git a/src/modules/mod.rs b/src/modules/mod.rs index a8606c3..a74a967 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -10,6 +10,7 @@ pub mod windows_updates; use crate::config::AppConfig; use crate::engine::issue::Issue; +use serde::{Deserialize, Serialize}; use std::sync::Arc; use tokio::sync::mpsc::Sender; @@ -44,7 +45,7 @@ impl From<&AppConfig> for ModuleConfig { } } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub enum ModuleStatus { Idle, Scanning, diff --git a/src/ui/views/fix_progress.rs b/src/ui/views/fix_progress.rs index fa729b3..b380742 100644 --- a/src/ui/views/fix_progress.rs +++ b/src/ui/views/fix_progress.rs @@ -182,7 +182,7 @@ pub fn render_fix_progress( .constraints([ Constraint::Length(5), // Repair Progress Gauge & VSS Badge Constraint::Min(10), // Live Repair Console Output - Constraint::Length(5), // Execution Summary & Reboot Alert + Constraint::Length(4), // Execution Summary & Reboot Alert ]) .split(area); @@ -344,13 +344,6 @@ pub fn render_fix_progress( .add_modifier(Modifier::ITALIC), ), ]), - Line::from(vec![ - Span::styled(" Keys: ", Style::default().fg(Theme::MUTED)), - Span::styled( - "[PgUp/PgDn] Scroll log [Home/End] Top/Live [F] Start [D] Simulate [E] Report", - Style::default().fg(Theme::CYAN), - ), - ]), ]; let summary_box = Paragraph::new(summary_lines).block(Theme::card_block("SUMMARY & NOTES")); From 8d46a57a1ed57e226f2852989bf065c558ac6601 Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:31:03 +0200 Subject: [PATCH 06/19] feat(ui): automatically ensure minimum terminal size on TUI startup --- src/main.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index b0ef057..b1549d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,11 +9,11 @@ use crossterm::cursor::Show; use crossterm::event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyEventKind}; use crossterm::execute; use crossterm::terminal::{ - EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, + EnterAlternateScreen, LeaveAlternateScreen, SetSize, disable_raw_mode, enable_raw_mode, size, }; use ratatui::Terminal; use ratatui::backend::CrosstermBackend; -use std::io::stdout; +use std::io::{Write, stdout}; use std::process::ExitCode; use std::time::{Duration, Instant}; use tokio::sync::mpsc::channel; @@ -398,8 +398,24 @@ async fn run_headless(args: CliArgs) -> Result> { // --------------------------------------------------------------------- TUI +/// Ensure a comfortable minimum terminal size (140 columns x 40 rows) +/// so that multi-column diagnostic cards and log buffers render cleanly without clipping. +fn ensure_terminal_size() { + if let Ok((cols, rows)) = size() { + let target_cols = cols.max(140); + let target_rows = rows.max(40); + if cols < target_cols || rows < target_rows { + let mut out = stdout(); + let _ = execute!(out, SetSize(target_cols, target_rows)); + let _ = write!(out, "\x1b[8;{};{}t", target_rows, target_cols); + let _ = out.flush(); + } + } +} + async fn run_tui() -> Result> { install_panic_hook(); + ensure_terminal_size(); enable_raw_mode()?; let mut stdout_handle = stdout(); From 6b892b7e6301ff5f8e93436f0f255d64ca79df4d Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:32:57 +0200 Subject: [PATCH 07/19] feat(ui): widen terminal default size to 165 columns and expand system specs panel width --- src/main.rs | 8 ++++---- src/ui/views/dashboard.rs | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index b1549d5..6b971ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -398,12 +398,12 @@ async fn run_headless(args: CliArgs) -> Result> { // --------------------------------------------------------------------- TUI -/// Ensure a comfortable minimum terminal size (140 columns x 40 rows) -/// so that multi-column diagnostic cards and log buffers render cleanly without clipping. +/// Ensure a comfortable minimum terminal size (165 columns x 42 rows) +/// so that multi-column diagnostic cards and hardware specs render cleanly without clipping. fn ensure_terminal_size() { if let Ok((cols, rows)) = size() { - let target_cols = cols.max(140); - let target_rows = rows.max(40); + let target_cols = cols.max(165); + let target_rows = rows.max(42); if cols < target_cols || rows < target_rows { let mut out = stdout(); let _ = execute!(out, SetSize(target_cols, target_rows)); diff --git a/src/ui/views/dashboard.rs b/src/ui/views/dashboard.rs index 6fcaa89..ea0fcd9 100644 --- a/src/ui/views/dashboard.rs +++ b/src/ui/views/dashboard.rs @@ -45,9 +45,9 @@ pub fn render_dashboard( let top_chunks = Layout::default() .direction(Direction::Horizontal) .constraints([ - Constraint::Percentage(33), // Health Score - Constraint::Percentage(33), // CPU & RAM Gauges - Constraint::Percentage(34), // System & Hardware Specs + Constraint::Percentage(28), // Health Score + Constraint::Percentage(28), // CPU & RAM Gauges + Constraint::Percentage(44), // System & Hardware Specs ]) .split(main_chunks[0]); From 0da5aa8fcd5449313f1a0f4f382ef675d8196ab3 Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:38:33 +0200 Subject: [PATCH 08/19] feat(triage): add toggle select/unselect all with [A] and persist selection state --- src/app/filters.rs | 23 +++++++++++++++++++++++ src/app/input.rs | 2 ++ src/ui/widgets/footer.rs | 1 + 3 files changed, 26 insertions(+) diff --git a/src/app/filters.rs b/src/app/filters.rs index 4461e10..4784545 100644 --- a/src/app/filters.rs +++ b/src/app/filters.rs @@ -65,9 +65,30 @@ impl App { && !issue.is_fixed { issue.is_selected = !issue.is_selected; + self.save_scan_state(); } } + pub fn toggle_select_all_issues(&mut self) { + let indices = self.filtered_issue_indices(); + let any_unselected = indices.iter().any(|&idx| { + if let Some(issue) = self.issues.get(idx) { + !issue.is_fixed && !issue.is_selected + } else { + false + } + }); + + for &orig_idx in &indices { + if let Some(issue) = self.issues.get_mut(orig_idx) + && !issue.is_fixed + { + issue.is_selected = any_unselected; + } + } + self.save_scan_state(); + } + pub fn select_all_issues(&mut self) { let indices = self.filtered_issue_indices(); for &orig_idx in &indices { @@ -77,6 +98,7 @@ impl App { issue.is_selected = true; } } + self.save_scan_state(); } pub fn deselect_all_issues(&mut self) { @@ -86,6 +108,7 @@ impl App { issue.is_selected = false; } } + self.save_scan_state(); } pub fn next_issue(&mut self) { diff --git a/src/app/input.rs b/src/app/input.rs index d17b95d..d26a6a8 100644 --- a/src/app/input.rs +++ b/src/app/input.rs @@ -123,6 +123,8 @@ pub fn handle_key(app: &mut App, code: KeyCode) { KeyCode::Char('a') | KeyCode::Char('A') => { if app.active_tab == TAB_DASHBOARD { app.start_scan(); + } else if app.active_tab == TAB_TRIAGE { + app.toggle_select_all_issues(); } else { app.select_all_issues(); } diff --git a/src/ui/widgets/footer.rs b/src/ui/widgets/footer.rs index a3ad280..af05c90 100644 --- a/src/ui/widgets/footer.rs +++ b/src/ui/widgets/footer.rs @@ -43,6 +43,7 @@ pub fn render_footer( ("←/→", "Tabs"), ("↑/↓", "Select"), ("Space", "On/Off"), + ("A", "All"), ("C/W/I", "Filter"), ("/", "Search"), ("F", "Repair"), From b6258f7a54cee8464a21110e1fb5e7ff29d9530c Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:19:31 +0200 Subject: [PATCH 09/19] fix(tasks,vss): add scheduled tasks dynamic resolution, ACL fallback and extend VSS timeouts --- WinMedic_Empfohlene_Diagnose_Module_2026.pdf | Bin 0 -> 11978 bytes src/app/confirm.rs | 91 ++++++++++++++++- src/app/events.rs | 83 +++++++++++++++- src/app/filters.rs | 5 +- src/app/input.rs | 1 + src/app/run_control.rs | 4 +- src/app/scan_state.rs | 3 + src/app/state.rs | 35 ++++++- src/engine/issue.rs | 11 +++ src/engine/runner.rs | 10 +- src/main.rs | 17 ++-- src/modules/page_file.rs | 6 +- src/modules/scheduled_tasks.rs | 99 ++++++++++++++++++- src/modules/windows_updates.rs | 27 ++--- src/safety/restore_point.rs | 4 +- src/ui/mod.rs | 52 ++++++++++ src/ui/views/dashboard.rs | 32 +++++- src/ui/views/issue_list.rs | 29 +++++- src/ui/widgets/header.rs | 24 ++++- tests/integration/tier1_features.rs | 3 + tests/integration/tier2_boundaries.rs | 4 + tests/integration/tier3_combinations.rs | 2 + 22 files changed, 498 insertions(+), 44 deletions(-) create mode 100644 WinMedic_Empfohlene_Diagnose_Module_2026.pdf diff --git a/WinMedic_Empfohlene_Diagnose_Module_2026.pdf b/WinMedic_Empfohlene_Diagnose_Module_2026.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d1c21c31cae613068b3c7d8bad88e67ff4333262 GIT binary patch literal 11978 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 literal 0 HcmV?d00001 diff --git a/src/app/confirm.rs b/src/app/confirm.rs index f61aaa1..01d7ad3 100644 --- a/src/app/confirm.rs +++ b/src/app/confirm.rs @@ -47,17 +47,28 @@ pub struct SystemActions { /// [`App::enable_real_system_actions`] exists instead of a plain /// assignment. pub restore_point: RestorePointService, + /// Reboot the machine to finalize repairs that require a system restart. + pub restart_system: fn() -> Result<(), String>, +} + +fn real_restart_system() -> Result<(), String> { + std::process::Command::new("shutdown.exe") + .args(["/r", "/t", "0", "/c", "WinMedic: Restarting to apply system repairs"]) + .spawn() + .map(|_| ()) + .map_err(|e| format!("Could not initiate restart: {}", e)) } impl SystemActions { /// The real thing: opens a browser window, raises a UAC prompt, runs - /// `Checkpoint-Computer`. + /// `Checkpoint-Computer`, reboots the system. pub fn real() -> Self { Self { open_release_page: updater::launch_browser, relaunch_elevated: relaunch_as_admin, self_update: SelfUpdateService::real(), restore_point: RestorePointService::real(), + restart_system: real_restart_system, } } @@ -68,6 +79,7 @@ impl SystemActions { relaunch_elevated: || Ok(()), self_update: SelfUpdateService::inert(), restore_point: RestorePointService::inert(), + restart_system: || Ok(()), } } } @@ -98,6 +110,9 @@ pub enum ConfirmRequest { /// cannot verify is never installed in place. download: Option, }, + RestartRequired { + issues: Vec, + }, } impl ConfirmRequest { @@ -106,6 +121,7 @@ impl ConfirmRequest { ConfirmRequest::Rollback { .. } => "RESTORE REGISTRY BACKUP?", ConfirmRequest::Elevate => "ADMINISTRATOR PRIVILEGES REQUIRED", ConfirmRequest::UpdateAvailable { .. } => "NEW WINMEDIC UPDATE AVAILABLE", + ConfirmRequest::RestartRequired { .. } => "SYSTEM RESTART REQUIRED", } } @@ -119,6 +135,7 @@ impl ConfirmRequest { ConfirmRequest::UpdateAvailable { download: None, .. } => { "Open the release page in a browser" } + ConfirmRequest::RestartRequired { .. } => "Restart now", } } @@ -127,6 +144,7 @@ impl ConfirmRequest { ConfirmRequest::Rollback { .. } => "Cancel", ConfirmRequest::Elevate => "Continue without Administrator", ConfirmRequest::UpdateAvailable { .. } => "Remind me later", + ConfirmRequest::RestartRequired { .. } => "Later", } } @@ -200,6 +218,18 @@ impl ConfirmRequest { body } + ConfirmRequest::RestartRequired { issues } => { + let mut body = vec![ + "One or more applied repairs require a system restart to take effect:".to_string(), + String::new(), + ]; + for issue_title in issues { + body.push(format!(" • {}", issue_title)); + } + body.push(String::new()); + body.push("Restart the system now to complete these repairs?".to_string()); + body + } } } } @@ -223,6 +253,10 @@ impl App { self.status_message = Some("Update notice dismissed - [U] reopens it.".to_string()); } + ConfirmRequest::RestartRequired { .. } => { + self.status_message = + Some("Restart postponed. A system restart is pending to finalize repairs.".to_string()); + } } } } @@ -376,6 +410,13 @@ impl App { self.available_update = None; } }, + ConfirmRequest::RestartRequired { .. } => { + if let Err(e) = (self.system_actions.restart_system)() { + self.status_message = Some(format!("System restart failed: {}", e)); + } else { + self.should_quit = true; + } + } } } } @@ -624,4 +665,52 @@ mod tests { assert!(body.contains("v0.2.0")); assert!(body.contains("https://github.com/SecretLUL/WinMedic/releases/tag/v0.2.0")); } + + #[test] + fn test_confirm_request_restart_required() { + let req = ConfirmRequest::RestartRequired { + issues: vec![ + "System reboot pending after updates".to_string(), + "Page file disabled on every drive".to_string(), + ], + }; + assert_eq!(req.title(), "SYSTEM RESTART REQUIRED"); + assert_eq!(req.confirm_label(), "Restart now"); + assert_eq!(req.dismiss_label(), "Later"); + let body = req.body().join("\n"); + assert!(body.contains("System reboot pending after updates")); + assert!(body.contains("Page file disabled on every drive")); + assert!(body.contains("Restart the system now")); + } + + #[test] + fn test_confirm_restart_action_in_inert_mode() { + let mut app = App::new(); + app.pending_confirm = Some(ConfirmRequest::RestartRequired { + issues: vec!["System reboot pending after updates".to_string()], + }); + + app.confirm_pending_action(); + + assert!(app.pending_confirm.is_none()); + assert!(app.should_quit); + } + + #[test] + fn test_dismiss_restart_action_leaves_status_message() { + let mut app = App::new(); + app.pending_confirm = Some(ConfirmRequest::RestartRequired { + issues: vec!["System reboot pending after updates".to_string()], + }); + + app.dismiss_confirm(); + + assert!(app.pending_confirm.is_none()); + assert!(!app.should_quit); + assert!( + app.status_message + .as_deref() + .is_some_and(|m| m.contains("Restart postponed")) + ); + } } diff --git a/src/app/events.rs b/src/app/events.rs index ad3cc19..98154d9 100644 --- a/src/app/events.rs +++ b/src/app/events.rs @@ -4,6 +4,7 @@ //! `try_recv` until empty, never awaiting, so a slow producer cannot stall //! rendering. +use super::ConfirmRequest; use super::state::{App, ModuleScanProgress}; use super::{BackgroundEvent, push_bounded_log}; use crate::engine::issue::Severity; @@ -235,8 +236,19 @@ impl App { if !self.dry_run && let Some(issue) = self.issues.iter_mut().find(|i| i.id == issue_id) { - issue.is_fixed = success; - if !success { + if success { + if issue.requires_reboot { + issue.is_reboot_pending = true; + issue.is_fixed = false; + issue.is_selected = false; + } else { + issue.is_fixed = true; + issue.is_reboot_pending = false; + } + issue.fix_error = None; + } else { + issue.is_fixed = false; + issue.is_reboot_pending = false; issue.fix_error = Some(message.clone()); } } @@ -291,6 +303,20 @@ impl App { fixed_count, failed_count ) }); + + if !self.dry_run { + let reboot_issues: Vec = self + .issues + .iter() + .filter(|i| i.is_reboot_pending) + .map(|i| i.title.clone()) + .collect(); + if !reboot_issues.is_empty() { + self.pending_confirm = Some(ConfirmRequest::RestartRequired { + issues: reboot_issues, + }); + } + } } } } @@ -694,4 +720,57 @@ mod tests { std::thread::sleep(Duration::from_millis(20)); assert_eq!(app.scan_elapsed(), Some(frozen), "and it stays put"); } + + #[tokio::test] + async fn repairs_requiring_reboot_trigger_restart_confirmation() { + let mut app = App::new(); + app.issues.clear(); + let issue = crate::engine::issue::Issue::new( + "wu_reboot_pending", + "windows_updates", + "System reboot pending after updates", + "Windows Update & Services", + crate::engine::issue::Severity::Info, + crate::engine::issue::RiskScore::Low, + "Description", + "Details", + "Fix", + vec!["Step 1".to_string()], + ) + .with_requires_reboot(true); + + app.issues.push(issue); + let (tx, rx) = channel::(10); + app.repair_event_rx = Some(rx); + app.is_fixing = true; + + tx.send(RepairEvent::FixFinished { + issue_id: "wu_reboot_pending".to_string(), + success: true, + message: "Pending reboot recorded.".to_string(), + }) + .await + .unwrap(); + + tx.send(RepairEvent::AllRepairsCompleted { + fixed_count: 1, + failed_count: 0, + }) + .await + .unwrap(); + + app.process_background_events(); + + assert!(!app.is_fixing); + assert!(app.issues[0].is_reboot_pending); + assert!(!app.issues[0].is_fixed); + assert!(app.has_pending_reboot()); + match app.pending_confirm { + Some(ConfirmRequest::RestartRequired { ref issues }) => { + assert_eq!(issues.len(), 1); + assert_eq!(issues[0], "System reboot pending after updates"); + } + other => panic!("expected RestartRequired confirm request, got {:?}", other), + } + } } diff --git a/src/app/filters.rs b/src/app/filters.rs index 4784545..038495e 100644 --- a/src/app/filters.rs +++ b/src/app/filters.rs @@ -63,6 +63,7 @@ impl App { if let Some(&orig_idx) = indices.get(self.selected_filtered_index) && let Some(issue) = self.issues.get_mut(orig_idx) && !issue.is_fixed + && !issue.is_reboot_pending { issue.is_selected = !issue.is_selected; self.save_scan_state(); @@ -73,7 +74,7 @@ impl App { let indices = self.filtered_issue_indices(); let any_unselected = indices.iter().any(|&idx| { if let Some(issue) = self.issues.get(idx) { - !issue.is_fixed && !issue.is_selected + !issue.is_fixed && !issue.is_reboot_pending && !issue.is_selected } else { false } @@ -82,6 +83,7 @@ impl App { for &orig_idx in &indices { if let Some(issue) = self.issues.get_mut(orig_idx) && !issue.is_fixed + && !issue.is_reboot_pending { issue.is_selected = any_unselected; } @@ -94,6 +96,7 @@ impl App { for &orig_idx in &indices { if let Some(issue) = self.issues.get_mut(orig_idx) && !issue.is_fixed + && !issue.is_reboot_pending { issue.is_selected = true; } diff --git a/src/app/input.rs b/src/app/input.rs index d26a6a8..66dfbff 100644 --- a/src/app/input.rs +++ b/src/app/input.rs @@ -272,6 +272,7 @@ mod tests { fn app() -> App { let mut app = App::new(); app.pending_confirm = None; + app.issues.clear(); app } diff --git a/src/app/run_control.rs b/src/app/run_control.rs index 1ecc23c..cabbce2 100644 --- a/src/app/run_control.rs +++ b/src/app/run_control.rs @@ -62,7 +62,7 @@ impl App { let selected_count = self .issues .iter() - .filter(|i| i.is_selected && !i.is_fixed) + .filter(|i| i.is_selected && !i.is_fixed && !i.is_reboot_pending) .count(); if selected_count == 0 { self.status_message = Some("No open issues selected for repair.".to_string()); @@ -77,6 +77,8 @@ impl App { self.repair_log_scroll = 0; self.vss_status = if self.dry_run { "Simulation".to_string() + } else if !self.config.create_vss_before_repair { + "Skipped".to_string() } else { "Initialising...".to_string() }; diff --git a/src/app/scan_state.rs b/src/app/scan_state.rs index 9e8a9c1..c3fe1e8 100644 --- a/src/app/scan_state.rs +++ b/src/app/scan_state.rs @@ -20,6 +20,8 @@ pub struct ScanState { pub module_statuses: Vec<(String, String, String, ModuleStatus)>, #[serde(default)] pub scan_duration_secs: Option, + #[serde(default)] + pub boot_time_secs: Option, } impl ScanState { @@ -35,6 +37,7 @@ impl ScanState { issues, module_statuses, scan_duration_secs, + boot_time_secs: Some(sysinfo::System::boot_time()), } } diff --git a/src/app/state.rs b/src/app/state.rs index 9d98dd3..1e2d256 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -227,7 +227,17 @@ impl App { let (module_progress_list, default_module_statuses) = Self::module_lists(&engine); let (saved_issues, saved_health, module_statuses, saved_duration, init_msg) = - if let Some(saved) = ScanState::load() { + if let Some(mut saved) = ScanState::load() { + let current_boot = sysinfo::System::boot_time(); + let rebooted = saved.boot_time_secs.is_some_and(|b| current_boot > b); + if rebooted { + for issue in &mut saved.issues { + if issue.is_reboot_pending { + issue.is_reboot_pending = false; + issue.is_fixed = true; + } + } + } let health = DiagnosticEngine::calculate_health_score(&saved.issues); let open_count = saved.issues.iter().filter(|i| !i.is_fixed).count(); let msg = format!( @@ -372,6 +382,29 @@ impl App { }); } + /// Whether any repaired issue currently requires a system restart. + pub fn has_pending_reboot(&self) -> bool { + self.issues.iter().any(|i| i.is_reboot_pending) + } + + /// Open the restart confirmation dialog if there are issues pending a reboot. + pub fn show_reboot_notice(&mut self) { + if self.pending_confirm.is_some() || self.is_fixing || self.is_scanning { + return; + } + let reboot_issues: Vec = self + .issues + .iter() + .filter(|i| i.is_reboot_pending) + .map(|i| i.title.clone()) + .collect(); + if !reboot_issues.is_empty() { + self.pending_confirm = Some(ConfirmRequest::RestartRequired { + issues: reboot_issues, + }); + } + } + #[allow(clippy::type_complexity)] pub(super) fn module_lists( engine: &DiagnosticEngine, diff --git a/src/engine/issue.rs b/src/engine/issue.rs index f3dc042..adc4b99 100644 --- a/src/engine/issue.rs +++ b/src/engine/issue.rs @@ -57,6 +57,10 @@ pub struct Issue { pub fix_steps: Vec, pub is_selected: bool, pub is_fixed: bool, + #[serde(default)] + pub requires_reboot: bool, + #[serde(default)] + pub is_reboot_pending: bool, pub fix_error: Option, pub timestamp: String, } @@ -92,8 +96,15 @@ impl Issue { fix_steps, is_selected: true, is_fixed: false, + requires_reboot: false, + is_reboot_pending: false, fix_error: None, timestamp: Local::now().format("%H:%M:%S").to_string(), } } + + pub fn with_requires_reboot(mut self, requires_reboot: bool) -> Self { + self.requires_reboot = requires_reboot; + self + } } diff --git a/src/engine/runner.rs b/src/engine/runner.rs index 55b8271..5889148 100644 --- a/src/engine/runner.rs +++ b/src/engine/runner.rs @@ -784,7 +784,14 @@ impl DiagnosticEngine { match result { Ok(msg) => { - issue.is_fixed = true; + if issue.requires_reboot { + issue.is_reboot_pending = true; + issue.is_fixed = false; + issue.is_selected = false; + } else { + issue.is_fixed = true; + issue.is_reboot_pending = false; + } issue.fix_error = None; fixed_count += 1; @@ -801,6 +808,7 @@ impl DiagnosticEngine { } Err(err) => { issue.is_fixed = false; + issue.is_reboot_pending = false; issue.fix_error = Some(err.clone()); failed_count += 1; diff --git a/src/main.rs b/src/main.rs index 6b971ce..7176c2d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ use ratatui::Terminal; use ratatui::backend::CrosstermBackend; use std::io::{Write, stdout}; use std::process::ExitCode; +use std::sync::Arc; use std::time::{Duration, Instant}; use tokio::sync::mpsc::channel; use tokio_util::sync::CancellationToken; @@ -179,7 +180,9 @@ async fn run_headless(args: CliArgs) -> Result> { } }); - let engine = DiagnosticEngine::new(&config); + let engine = Arc::new( + DiagnosticEngine::new(&config).with_restore_points(RestorePointService::real()), + ); let (tx, mut rx) = channel::(100); if !quiet { @@ -191,7 +194,9 @@ async fn run_headless(args: CliArgs) -> Result> { } let scan_cancel = cancel.clone(); - let engine_handle = tokio::spawn(async move { engine.run_scan(tx, scan_cancel).await }); + let engine_for_scan = engine.clone(); + let engine_handle = + tokio::spawn(async move { engine_for_scan.run_scan(tx, scan_cancel).await }); let mut scan_cancelled = false; while let Some(evt) = rx.recv().await { @@ -270,11 +275,6 @@ async fn run_headless(args: CliArgs) -> Result> { ); } - // The other half of the seam described in `run_tui`: repairs from the - // command line protect the machine the same way the TUI does, and this - // is the only other place that says so. - let engine = - DiagnosticEngine::new(&config).with_restore_points(RestorePointService::real()); let (fix_tx, mut fix_rx) = channel(100); let options = RepairOptions { create_vss: !args.no_vss && config.create_vss_before_repair, @@ -283,9 +283,10 @@ async fn run_headless(args: CliArgs) -> Result> { }; let fix_cancel = cancel.clone(); + let engine_for_fix = engine.clone(); let mut issues_for_fix = std::mem::take(&mut issues); let fix_handle = tokio::spawn(async move { - let result = engine + let result = engine_for_fix .run_repairs(&mut issues_for_fix, options, fix_tx, fix_cancel) .await; (issues_for_fix, result) diff --git a/src/modules/page_file.rs b/src/modules/page_file.rs index f736588..5f01365 100644 --- a/src/modules/page_file.rs +++ b/src/modules/page_file.rs @@ -463,7 +463,8 @@ impl DiagnosticModule for PageFileModule { "Set Win32_ComputerSystem.AutomaticManagedPagefile to $true".to_string(), "Restart Windows so the page file is created".to_string(), ], - ); + ) + .with_requires_reboot(true); issue.is_selected = false; issues.push(issue); } @@ -617,7 +618,8 @@ impl DiagnosticModule for PageFileModule { ), "Restart Windows so the new size applies".to_string(), ], - ); + ) + .with_requires_reboot(true); issue.is_selected = false; issues.push(issue); } diff --git a/src/modules/scheduled_tasks.rs b/src/modules/scheduled_tasks.rs index 0ff221d..88d623b 100644 --- a/src/modules/scheduled_tasks.rs +++ b/src/modules/scheduled_tasks.rs @@ -294,21 +294,90 @@ impl ScheduledTasksModule { self.known_tasks.lock().ok()?.get(issue_id).cloned() } + /// Query the registered scheduled tasks from the system to populate known tasks + /// when the module has no cached entries (e.g. after an app restart or engine rebuild). + async fn refresh_known_tasks(&self) -> Result<(), String> { + let script = r#"Get-ScheduledTask | ForEach-Object { "$($_.TaskPath)|$($_.TaskName)" }"#; + let out = self + .runner + .run_powershell(script, Duration::from_secs(30)) + .await?; + + if !out.success && out.stdout.trim().is_empty() { + return Err(out.stderr); + } + + if let Ok(mut known) = self.known_tasks.lock() { + for line in out.stdout.lines() { + let trimmed = line.trim(); + if trimmed.is_empty() { + continue; + } + if let Some((path, name)) = trimmed.split_once('|') { + let path = path.trim(); + let name = name.trim(); + if name.is_empty() { + continue; + } + let full = format!("{}{}", path, name); + let task_ref = TaskRef { + path: path.to_string(), + name: name.to_string(), + }; + let orphaned_id = Self::issue_id("sched_orphaned", &full); + let failing_id = Self::issue_id("sched_failing", &full); + known.insert(orphaned_id, task_ref.clone()); + known.insert(failing_id, task_ref); + } + } + } + Ok(()) + } + + /// Look up a task by issue id, dynamically falling back to querying the system + /// if the in-memory cache is empty. + async fn lookup_or_refresh(&self, issue_id: &str) -> Option { + if let Some(task) = self.lookup(issue_id) { + return Some(task); + } + + let _ = self.refresh_known_tasks().await; + self.lookup(issue_id) + } + /// Disable a task by its exact folder and name. /// /// Both values come from the system, not from WinMedic, so both go through /// [`ps_single_quoted`] — a task can be named by anyone who can create one, /// and this command frequently runs elevated. + /// + /// If standard `Disable-ScheduledTask` fails with permission denied (common on + /// protected Windows tasks such as `UpdateOrchestrator\USO_UxBroker`), it takes + /// ownership of the task file in System32\Tasks and grants Administrators permissions + /// before retrying. async fn disable_task(&self, task: &TaskRef) -> Result { let script = format!( - "Disable-ScheduledTask -TaskPath {} -TaskName {} -ErrorAction Stop | Out-Null", + concat!( + "try {{ ", + "Disable-ScheduledTask -TaskPath {0} -TaskName {1} -ErrorAction Stop | Out-Null ", + "}} catch {{ ", + "$taskPath = {0}; $taskName = {1}; ", + "$cleanRel = ($taskPath.Trim('\\') + '\\' + $taskName).Trim('\\'); ", + "$taskFile = Join-Path $env:SystemRoot \"System32\\Tasks\\$cleanRel\"; ", + "if (Test-Path $taskFile) {{ ", + "takeown.exe /f $taskFile /a | Out-Null; ", + "icacls.exe $taskFile /grant \"*S-1-5-32-544:F\" | Out-Null; ", + "Disable-ScheduledTask -TaskPath $taskPath -TaskName $taskName -ErrorAction Stop | Out-Null ", + "}} else {{ throw $_ }} ", + "}}" + ), ps_single_quoted(&task.path), ps_single_quoted(&task.name), ); let out = self .runner - .run_powershell(&script, Duration::from_secs(20)) + .run_powershell(&script, Duration::from_secs(25)) .await?; if out.success { @@ -529,7 +598,7 @@ impl DiagnosticModule for ScheduledTasksModule { return Err(format!("Unknown issue id: {}", issue_id)); } - let Some(task) = self.lookup(issue_id) else { + let Some(task) = self.lookup_or_refresh(issue_id).await else { return Err(format!( "No scheduled task is on record for '{}'. Run the scan again before repairing.", issue_id @@ -838,4 +907,28 @@ mod tests { let err = module.scan(None).await.unwrap_err(); assert!(err.contains("Access to the task scheduler service was denied.")); } + + #[tokio::test] + async fn fix_without_prior_scan_resolves_task_from_system() { + let mock = MockCommandRunner::new(); + mock.add_response("Disable-ScheduledTask", CmdOutput::ok("")); + mock.add_response( + "Get-ScheduledTask", + CmdOutput::ok(r"\Vendor\|Orphaned Task"), + ); + let module = ScheduledTasksModule::with_runner(Arc::new(mock.clone())); + + let issue_id = ScheduledTasksModule::issue_id("sched_orphaned", r"\Vendor\Orphaned Task"); + // No scan() is called here; fix() must dynamically query the system. + let result = module.fix(&issue_id, None).await.unwrap(); + + assert!(result.contains("Orphaned Task")); + let disable = mock + .executed() + .into_iter() + .find(|c| c.contains("Disable-ScheduledTask")) + .expect("the fix must issue the disable command"); + assert!(disable.contains(r"-TaskPath '\Vendor\'")); + assert!(disable.contains("-TaskName 'Orphaned Task'")); + } } diff --git a/src/modules/windows_updates.rs b/src/modules/windows_updates.rs index 81f31f7..bff64c1 100644 --- a/src/modules/windows_updates.rs +++ b/src/modules/windows_updates.rs @@ -189,18 +189,21 @@ impl DiagnosticModule for WindowsUpdatesModule { for p_key in pending_keys { if hklm.open_subkey_with_flags(p_key, KEY_READ).is_ok() { reboot_found = true; - issues.push(Issue::new( - "wu_reboot_pending", - self.id(), - "System reboot pending after updates", - "Windows Update & Services", - Severity::Info, - RiskScore::Low, - "Windows reports a reboot pending from a previously installed update or driver package. Some updates cannot continue until the machine restarts.", - format!("Found in the registry: HKLM\\{}", p_key), - "Restart Windows after the repairs to finish the pending installations", - vec!["Record the pending reboot in the repair report".to_string()], - )); + issues.push( + Issue::new( + "wu_reboot_pending", + self.id(), + "System reboot pending after updates", + "Windows Update & Services", + Severity::Info, + RiskScore::Low, + "Windows reports a reboot pending from a previously installed update or driver package. Some updates cannot continue until the machine restarts.", + format!("Found in the registry: HKLM\\{}", p_key), + "Restart Windows after the repairs to finish the pending installations", + vec!["Record the pending reboot in the repair report".to_string()], + ) + .with_requires_reboot(true), + ); break; } } diff --git a/src/safety/restore_point.rs b/src/safety/restore_point.rs index 67715b0..da40929 100644 --- a/src/safety/restore_point.rs +++ b/src/safety/restore_point.rs @@ -158,7 +158,7 @@ fn checkpoint_script(description: &str) -> String { async fn create_system_restore_point(description: &str) -> RestorePointResult { let script = checkpoint_script(description); - match run_powershell(&script, Duration::from_secs(60)).await { + match run_powershell(&script, Duration::from_secs(180)).await { Ok(out) => { let combined = format!("{}\n{}", out.stdout, out.stderr); RestorePointResult::from_outcome(description, parse_checkpoint_output(&combined)) @@ -245,7 +245,7 @@ pub async fn list_restore_points() -> Vec { } "#; - match run_powershell(script, Duration::from_secs(15)).await { + match run_powershell(script, Duration::from_secs(30)).await { Ok(out) => out .stdout .lines() diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 79f6a39..3a82b59 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -39,6 +39,7 @@ pub fn render_app(f: &mut Frame, app: &App) { app.issues.iter().filter(|i| !i.is_fixed).count(), app.is_scanning, app.dry_run, + app.has_pending_reboot(), ); // 2. Render Active Tab View @@ -312,6 +313,7 @@ mod tests { let mut app = App::new(); app.pending_confirm = None; app.active_tab = TAB_TRIAGE; + app.issues.clear(); for i in 0..30 { app.issues.push(crate::engine::issue::Issue::new( format!("issue_{i}"), @@ -338,4 +340,54 @@ mod tests { let rendered_bottom = screen(&app, 120, 24); assert!(rendered_bottom.contains("Issue #25 Finding Title")); } + + #[test] + fn header_shows_reboot_pending_badge_when_restart_is_pending() { + let mut app = populated_app(); + app.issues.clear(); + let mut issue = crate::engine::issue::Issue::new( + "wu_reboot_pending", + "windows_updates", + "System reboot pending after updates", + "Windows Update", + crate::engine::issue::Severity::Info, + crate::engine::issue::RiskScore::Low, + "Description", + "Details", + "Fix", + vec![], + ); + issue.is_reboot_pending = true; + app.issues.push(issue); + + assert!(app.has_pending_reboot()); + let rendered = screen(&app, 160, 45); + assert!(rendered.contains("[!] REBOOT PENDING")); + } + + #[test] + fn triage_view_shows_reboot_badge_for_pending_reboot_issues() { + let mut app = App::new(); + app.pending_confirm = None; + app.active_tab = TAB_TRIAGE; + app.issues.clear(); + let mut issue = crate::engine::issue::Issue::new( + "wu_reboot_pending", + "windows_updates", + "System reboot pending after updates", + "Windows Update", + crate::engine::issue::Severity::Info, + crate::engine::issue::RiskScore::Low, + "Description", + "Details", + "Fix", + vec![], + ); + issue.is_reboot_pending = true; + app.issues.push(issue); + + let rendered = screen(&app, 120, 24); + assert!(rendered.contains("[REBOOT]")); + assert!(rendered.contains("System restart pending:")); + } } diff --git a/src/ui/views/dashboard.rs b/src/ui/views/dashboard.rs index ea0fcd9..7e1194a 100644 --- a/src/ui/views/dashboard.rs +++ b/src/ui/views/dashboard.rs @@ -68,15 +68,25 @@ pub fn render_dashboard( .iter() .filter(|i| i.severity == Severity::Warning && !i.is_fixed) .count(); + let reboot_pending_count = issues.iter().filter(|i| i.is_reboot_pending).count(); + + let health_label = if reboot_pending_count > 0 { + format!( + " {}/100 ({} critical, {} warnings, {} reboot pending) ", + health_score, critical_count, warning_count, reboot_pending_count + ) + } else { + format!( + " {}/100 ({} critical, {} warnings) ", + health_score, critical_count, warning_count + ) + }; let health_gauge = Gauge::default() .block(Theme::card_block("SYSTEM HEALTH INDEX")) .gauge_style(Style::default().fg(health_color).bg(Theme::BG_DEEP)) .percent(health_score as u16) - .label(format!( - " {}/100 ({} critical, {} warnings) ", - health_score, critical_count, warning_count - )); + .label(health_label); f.render_widget(health_gauge, top_chunks[0]); @@ -126,7 +136,7 @@ pub fn render_dashboard( f.render_widget(ram_gauge, telem_chunks[1]); // 3. System Specs Card - let sys_lines = if let Some(t) = telemetry { + let mut sys_lines = if let Some(t) = telemetry { let uptime_h = t.uptime_secs / 3600; let uptime_m = (t.uptime_secs % 3600) / 60; vec![ @@ -158,6 +168,18 @@ pub fn render_dashboard( vec![Line::from("Loading system data...")] }; + if reboot_pending_count > 0 { + sys_lines.push(Line::from(vec![ + Span::styled("Reboot: ", Style::default().fg(Theme::MUTED)), + Span::styled( + "PENDING (restart required)", + Style::default() + .fg(Theme::AMBER) + .add_modifier(Modifier::BOLD), + ), + ])); + } + let sys_card = Paragraph::new(sys_lines).block(Theme::card_block("SYSTEM SPECIFICATION")); f.render_widget(sys_card, top_chunks[2]); diff --git a/src/ui/views/issue_list.rs b/src/ui/views/issue_list.rs index b64b59b..c6390f5 100644 --- a/src/ui/views/issue_list.rs +++ b/src/ui/views/issue_list.rs @@ -114,7 +114,9 @@ pub fn render_issue_list(f: &mut Frame, area: Rect, state: &IssueListViewState) .map(|(pos, &orig_idx)| { let issue = &state.issues[orig_idx]; let is_current = pos == state.selected_filtered_index; - let check_box = if issue.is_fixed { + let check_box = if issue.is_reboot_pending { + "[REBOOT]" + } else if issue.is_fixed { "[FIXED]" } else if issue.is_selected { "[X]" @@ -122,7 +124,9 @@ pub fn render_issue_list(f: &mut Frame, area: Rect, state: &IssueListViewState) "[ ]" }; - let check_color = if issue.is_fixed { + let check_color = if issue.is_reboot_pending { + Theme::AMBER + } else if issue.is_fixed { Theme::EMERALD } else if issue.is_selected { Theme::CYAN @@ -226,6 +230,25 @@ pub fn render_issue_list(f: &mut Frame, area: Rect, state: &IssueListViewState) Style::default().fg(risk_color).add_modifier(Modifier::BOLD), ), ]), + ]; + + if issue.is_reboot_pending { + detail_lines.push(Line::from("")); + detail_lines.push(Line::from(vec![ + Span::styled( + " [!] System restart pending: ", + Style::default() + .fg(Theme::AMBER) + .add_modifier(Modifier::BOLD), + ), + Span::styled( + "This repair has been applied and will take full effect after restarting Windows.", + Style::default().fg(Theme::AMBER), + ), + ])); + } + + detail_lines.extend([ Line::from(""), Line::from(vec![Span::styled( " Description:", @@ -266,7 +289,7 @@ pub fn render_issue_list(f: &mut Frame, area: Rect, state: &IssueListViewState) .fg(Theme::MUTED) .add_modifier(Modifier::BOLD), )]), - ]; + ]); for (step_idx, step) in issue.fix_steps.iter().enumerate() { detail_lines.push(Line::from(vec![ diff --git a/src/ui/widgets/header.rs b/src/ui/widgets/header.rs index c82f9dc..51d105c 100644 --- a/src/ui/widgets/header.rs +++ b/src/ui/widgets/header.rs @@ -19,6 +19,7 @@ pub fn render_header( issue_count: usize, is_scanning: bool, dry_run: bool, + reboot_pending: bool, ) { let chunks = Layout::default() .direction(Direction::Vertical) @@ -74,7 +75,19 @@ pub fn render_header( Span::styled("", Style::default()) }; - let top_line = Line::from(vec![ + let reboot_badge = if reboot_pending { + Span::styled( + " [!] REBOOT PENDING ", + Style::default() + .fg(Theme::BG_DEEP) + .bg(Theme::AMBER) + .add_modifier(Modifier::BOLD), + ) + } else { + Span::styled("", Style::default()) + }; + + let mut top_spans = vec![ Span::styled( format!(" WinMedic v{} ", env!("CARGO_PKG_VERSION")), Style::default() @@ -106,7 +119,14 @@ pub fn render_header( Span::styled(" VSS: Ready ", Style::default().fg(Theme::EMERALD)), Span::styled("│ ", Style::default().fg(Theme::BORDER)), admin_badge, - ]); + ]; + + if reboot_pending { + top_spans.push(Span::styled("│ ", Style::default().fg(Theme::BORDER))); + top_spans.push(reboot_badge); + } + + let top_line = Line::from(top_spans); let top_bar = Paragraph::new(top_line) .block( diff --git a/tests/integration/tier1_features.rs b/tests/integration/tier1_features.rs index c22d083..7966ab2 100644 --- a/tests/integration/tier1_features.rs +++ b/tests/integration/tier1_features.rs @@ -861,6 +861,7 @@ fn test_tier1_f11_recursive_directory_size_sum() { #[tokio::test] async fn test_tier1_f11_triage_issue_toggle_in_app() { let mut app = App::new(); + app.issues.clear(); let issue = winmedic::engine::issue::Issue::new( "sys_clean_browser_cache", "system_cleaner", @@ -887,6 +888,7 @@ async fn test_tier1_f11_triage_issue_toggle_in_app() { #[tokio::test] async fn test_tier1_f11_triage_select_and_deselect_all() { let mut app = App::new(); + app.issues.clear(); for i in 0..5 { app.issues.push(winmedic::engine::issue::Issue::new( format!("issue_{}", i), @@ -916,6 +918,7 @@ async fn test_tier1_f11_triage_select_and_deselect_all() { #[tokio::test] async fn test_tier1_f11_triage_navigation_bounds() { let mut app = App::new(); + app.issues.clear(); for i in 0..3 { app.issues.push(winmedic::engine::issue::Issue::new( format!("issue_{}", i), diff --git a/tests/integration/tier2_boundaries.rs b/tests/integration/tier2_boundaries.rs index b1e700f..de2e615 100644 --- a/tests/integration/tier2_boundaries.rs +++ b/tests/integration/tier2_boundaries.rs @@ -825,6 +825,7 @@ fn test_tier2_f11_format_bytes_boundary_exact_values() { #[tokio::test] async fn test_tier2_f11_triage_empty_search_query_matches_all() { let mut app = App::new(); + app.issues.clear(); app.issues.push(Issue::new( "i1", "mod1", @@ -858,6 +859,7 @@ async fn test_tier2_f11_triage_empty_search_query_matches_all() { #[tokio::test] async fn test_tier2_f11_triage_search_query_no_match_clamps_to_zero() { let mut app = App::new(); + app.issues.clear(); app.issues.push(Issue::new( "i1", "mod1", @@ -882,6 +884,7 @@ async fn test_tier2_f11_triage_search_query_no_match_clamps_to_zero() { #[tokio::test] async fn test_tier2_f11_triage_filter_all_severities_combinations() { let mut app = App::new(); + app.issues.clear(); app.issues.push(Issue::new( "i1", "m", @@ -932,6 +935,7 @@ async fn test_tier2_f11_triage_filter_all_severities_combinations() { #[tokio::test] async fn test_tier2_f11_triage_clear_filters_restores_view() { let mut app = App::new(); + app.issues.clear(); app.issues.push(Issue::new( "i1", "m", diff --git a/tests/integration/tier3_combinations.rs b/tests/integration/tier3_combinations.rs index 6ea28c6..c0e206e 100644 --- a/tests/integration/tier3_combinations.rs +++ b/tests/integration/tier3_combinations.rs @@ -470,6 +470,7 @@ fn test_tier3_audit_logger_records_system_cleaner_fixes() { #[tokio::test] async fn test_tier3_triage_search_filtering_by_system_cleaner_title() { let mut app = App::new(); + app.issues.clear(); app.issues.push(Issue::new( "sys_clean_winsxs", "system_cleaner", @@ -504,6 +505,7 @@ async fn test_tier3_triage_search_filtering_by_system_cleaner_title() { #[tokio::test] async fn test_tier3_triage_module_filtering_cycle() { let mut app = App::new(); + app.issues.clear(); app.issues.push(Issue::new( "sys_clean_winsxs", "system_cleaner", From 7fe333c394bc5315642ac2b03bee2bd36183dea2 Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:25:37 +0200 Subject: [PATCH 10/19] docs(readme): update documentation for v0.4.0 release and bump package version --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 19 ++++++++++--------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3b89d0..ea8bccb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2215,7 +2215,7 @@ dependencies = [ [[package]] name = "winmedic" -version = "0.3.4" +version = "0.4.0" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index dc23555..c53be61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "winmedic" -version = "0.3.4" +version = "0.4.0" edition = "2024" # Verified against the locked dependency tree: edition 2024 itself needs 1.85, # but ratatui -> instability -> darling raises the floor to 1.88. CI enforces diff --git a/README.md b/README.md index 5dc0b02..30e101d 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,13 @@ **WinMedic** is a state-of-the-art terminal application (TUI) designed to autonomously diagnose, categorize, and safely repair Windows operating system errors, performance bottlenecks, update stalls, and broken configurations. -Unlike opaque one-click cleanup tools, **WinMedic** is built on five fundamental principles: +Unlike opaque one-click cleanup tools, **WinMedic** is built on six fundamental principles: 1. **Zero Runtime Dependencies**: Single, compact, portable native `.exe` binary without .NET, Python, or external runtime requirements. 2. **True Parallel Diagnostics**: All diagnostic modules execute concurrently via Tokio `JoinSet` for blazing-fast hardware and OS analysis. -3. **Safety First**: Automatic **Windows System Restore Points (VSS)** and **Registry Snapshots** are taken prior to any modification — and every snapshot can be rolled back from inside the app. +3. **Safety First**: Automatic **Windows System Restore Points (VSS)** (with a 3-minute creation window) and **Registry Snapshots** are taken prior to any modification — and every snapshot can be rolled back from inside the app. 4. **Full Transparency & Live Triage**: Every issue is explained with technical logs, severity levels, risk scores, and step-by-step fix previews. A **dry-run mode** shows planned steps without changing anything, with instant live search and severity filtering. -5. **Always Interruptible & Bounded**: Any running scan or repair can be aborted with `[Esc]` (or `Ctrl+C` headless) terminating child processes. Memory usage is bounded via a 2000-line ring-buffer. +5. **Scan State Persistence & Reboot Reconciliation**: The entire diagnostic state is saved to `%APPDATA%\WinMedic\last_scan.json`. When restarting, WinMedic immediately restores your open issues without re-scanning, detects system restarts, and automatically reconciles pending update reboots. +6. **Always Interruptible & Bounded**: Any running scan or repair can be aborted with `[Esc]` (or `Ctrl+C` headless) terminating child processes. Memory usage is bounded via a 2000-line ring-buffer. --- @@ -44,7 +45,7 @@ Unlike opaque one-click cleanup tools, **WinMedic** is built on five fundamental | **💾 Storage & Filesystem** | Dirty Bit detection (`fsutil dirty query C:`), SMART drive health, `%TEMP%` & `C:\Windows\Temp` junk accumulation, bloated `IconCache.db` | Triggers online `chkdsk C: /scan`, cleans temp files, resets icon/thumbnail cache & restarts Explorer | | **⚡ Registry & Autostart** | Orphaned `Run`/`RunOnce` startup keys, broken User Startup folder shortcuts, broken COM/Shell extension keys | Backs up target registry keys to `.reg` and safely removes invalid startup entries | | **🧹 System & Cache Cleaner** | WinSxS component store bloat (`DISM /AnalyzeComponentStore`), Delivery Optimization cache, Installer package cache, browser caches (Chrome, Edge, Firefox, Brave, Opera — all profiles), setup & CBS logs, WER crash archives, D3D shader & certificate caches, Recycle Bin, system temp | Runs `StartComponentCleanup`, purges the caches you select, and skips locked files instead of aborting the sweep | -| **📅 Scheduled Tasks** | Tasks whose action points at a deleted program (`Get-ScheduledTask`), tasks whose last run failed with a real error code rather than a `SCHED_S_*` status, tasks with missed runs | Disables the task with `Disable-ScheduledTask` — reversible with `Enable-ScheduledTask`; nothing is deleted | +| **📅 Scheduled Tasks** | Tasks whose action points at a deleted program (`Get-ScheduledTask`), tasks whose last run failed with a real error code rather than a `SCHED_S_*` status, tasks with missed runs | Disables the task with `Disable-ScheduledTask`, with dynamic task resolution and automated ACL escalation (`takeown` / `icacls`) for protected system tasks — reversible with `Enable-ScheduledTask`; nothing is deleted | | **🧠 Page File & Memory** | Page file disabled with automatic management off (`Win32_PageFileUsage`), page file on a volume with under 10 % or 2 GB free, manually fixed limits below RAM/8 or with an inverted min/max range | Hands the page file back to Windows (system managed) or re-enables automatic management; the nearly-full-drive finding is advisory and changes nothing | Package Cache and Recycle Bin are classified `RiskScore::High` and are **deselected by default**, so `--auto-fix` never empties them unattended. Every Page File & Memory finding is `RiskScore::High` for the same reason — each one needs a restart before it takes effect — and is likewise deselected. A scheduled task that merely *fails*, rather than pointing at a deleted program, is deselected too: switching it off is a judgement call, so it is left for you to tick. @@ -119,15 +120,15 @@ If you installed WinMedic through WinGet, prefer `winget upgrade SecretLUL.WinMe | **`[m]`** | Filter issues by diagnostic module (cycle through modules) in Triage tab | | **`[/]`** | Fulltext live search across findings, details & descriptions | | **`[x]`** | Reset all active filters and search queries | -| **`[A]`** | Select all visible detected issues (1-Click Auto-Fix) | +| **`[A]`** | Toggle select / deselect all visible detected issues (1-Click Auto-Fix) | | **`[N]`** | Deselect all issues | | **`[F]`** | Proceed to Repair Center / Execute repairs | | **`[D]`** | Toggle dry-run mode — repairs are shown, not executed | | **`[E]`** | Export diagnostic & repair report as self-contained HTML | | **`[B]`** | Settings & Safety tab: move `[↑]`/`[↓]` between the settings list and the registry snapshot list | | **`[U]`** | Settings & Safety tab: restore the selected registry snapshot — elsewhere: open the pending "update available" notice, which can download, verify and install the new version | -| **`[PgUp]` / `[PgDn]`** | Scroll live log console (Scan and Repair tabs) | -| **`[Home]` / `[End]`** | Jump to earliest log line / return to live tail follow mode | +| **`[PgUp]` / `[PgDn]`** | Scroll live log console (Scan & Repair) or scroll issue list by page (Triage) | +| **`[Home]` / `[End]`** | Jump to earliest log line / return to live tail (or jump to top / bottom in Triage) | | **`[←]` / `[→]` or `[h]` / `[l]`** | Switch tabs (BIOS-style, wraps around) | | **`[+]` / `[-]` or `[[` / `]]`** | Adjust the highlighted numeric setting (Settings & Safety tab) | | **`[↑]` / `[↓]` or `[j]` / `[k]`** | Navigate list items and scroll logs | @@ -219,8 +220,8 @@ WinMedic is **not code-signed**, so Windows SmartScreen will warn you on first l ```powershell # Compare the published checksum against the file you downloaded -$expected = (Get-Content .\winmedic-v0.3.4.exe.sha256).Split(' ')[0] -$actual = (Get-FileHash .\winmedic-v0.3.4.exe -Algorithm SHA256).Hash.ToLower() +$expected = (Get-Content .\winmedic-v0.4.0.exe.sha256).Split(' ')[0] +$actual = (Get-FileHash .\winmedic-v0.4.0.exe -Algorithm SHA256).Hash.ToLower() if ($expected -eq $actual) { "OK - checksum matches" } else { "MISMATCH - do not run this file" } ``` From 65b66d77f14686374f7a021acf994fa58aceb45e Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:47:53 +0200 Subject: [PATCH 11/19] feat(modules): add WHEA Hardware Error Logger diagnostic module Implements whea_logger diagnostic module to query Windows Hardware Error Architecture events (Events 19, 18, 17, 47, 1), extract APIC ID/Core and PCIe BDF fault locations, provide ASPM power management and mdsched fixes, and integrate into engine and UI. --- README.md | 1 + src/app/confirm.rs | 17 +- src/app/scan_state.rs | 12 +- src/app/state.rs | 88 +- src/engine/runner.rs | 2 +- src/main.rs | 5 +- src/modules/mod.rs | 7 +- src/modules/whea_logger.rs | 1104 +++++++++++++++++ src/ui/views/fix_progress.rs | 98 +- .../integration/challenger_m2_adversarial.rs | 4 +- tests/integration/tier1_features.rs | 70 +- tests/integration/tier3_combinations.rs | 2 +- tests/integration/tier4_scenarios.rs | 2 +- 13 files changed, 1308 insertions(+), 104 deletions(-) create mode 100644 src/modules/whea_logger.rs diff --git a/README.md b/README.md index 30e101d..2c0cef1 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ Unlike opaque one-click cleanup tools, **WinMedic** is built on six fundamental | **🧹 System & Cache Cleaner** | WinSxS component store bloat (`DISM /AnalyzeComponentStore`), Delivery Optimization cache, Installer package cache, browser caches (Chrome, Edge, Firefox, Brave, Opera — all profiles), setup & CBS logs, WER crash archives, D3D shader & certificate caches, Recycle Bin, system temp | Runs `StartComponentCleanup`, purges the caches you select, and skips locked files instead of aborting the sweep | | **📅 Scheduled Tasks** | Tasks whose action points at a deleted program (`Get-ScheduledTask`), tasks whose last run failed with a real error code rather than a `SCHED_S_*` status, tasks with missed runs | Disables the task with `Disable-ScheduledTask`, with dynamic task resolution and automated ACL escalation (`takeown` / `icacls`) for protected system tasks — reversible with `Enable-ScheduledTask`; nothing is deleted | | **🧠 Page File & Memory** | Page file disabled with automatic management off (`Win32_PageFileUsage`), page file on a volume with under 10 % or 2 GB free, manually fixed limits below RAM/8 or with an inverted min/max range | Hands the page file back to Windows (system managed) or re-enables automatic management; the nearly-full-drive finding is advisory and changes nothing | +| **🩺 WHEA Hardware Logger** | Windows Hardware Error Architecture (WHEA) physical faults: CPU Cache Hierarchy (Event 19), Fatal Machine Checks (Event 18), PCIe Root Port bus errors (Event 17), RAM/Memory controller parity errors (Event 47), Storage CPER records (Event 1) | Automatic PCIe ASPM power management optimization (`powercfg`) to prevent bus dropouts, schedules Windows Memory Diagnostic (`mdsched.exe`), provides exact hardware core/APIC-ID and bus:device:function triangulation and BIOS tuning guidance | Package Cache and Recycle Bin are classified `RiskScore::High` and are **deselected by default**, so `--auto-fix` never empties them unattended. Every Page File & Memory finding is `RiskScore::High` for the same reason — each one needs a restart before it takes effect — and is likewise deselected. A scheduled task that merely *fails*, rather than pointing at a deleted program, is deselected too: switching it off is a judgement call, so it is left for you to tick. diff --git a/src/app/confirm.rs b/src/app/confirm.rs index 01d7ad3..4961862 100644 --- a/src/app/confirm.rs +++ b/src/app/confirm.rs @@ -53,7 +53,13 @@ pub struct SystemActions { fn real_restart_system() -> Result<(), String> { std::process::Command::new("shutdown.exe") - .args(["/r", "/t", "0", "/c", "WinMedic: Restarting to apply system repairs"]) + .args([ + "/r", + "/t", + "0", + "/c", + "WinMedic: Restarting to apply system repairs", + ]) .spawn() .map(|_| ()) .map_err(|e| format!("Could not initiate restart: {}", e)) @@ -220,7 +226,8 @@ impl ConfirmRequest { } ConfirmRequest::RestartRequired { issues } => { let mut body = vec![ - "One or more applied repairs require a system restart to take effect:".to_string(), + "One or more applied repairs require a system restart to take effect:" + .to_string(), String::new(), ]; for issue_title in issues { @@ -254,8 +261,10 @@ impl App { Some("Update notice dismissed - [U] reopens it.".to_string()); } ConfirmRequest::RestartRequired { .. } => { - self.status_message = - Some("Restart postponed. A system restart is pending to finalize repairs.".to_string()); + self.status_message = Some( + "Restart postponed. A system restart is pending to finalize repairs." + .to_string(), + ); } } } diff --git a/src/app/scan_state.rs b/src/app/scan_state.rs index c3fe1e8..6e56106 100644 --- a/src/app/scan_state.rs +++ b/src/app/scan_state.rs @@ -76,7 +76,10 @@ mod tests { #[test] fn test_scan_state_serialization_round_trip() { - let tmp = std::env::temp_dir().join(format!("winmedic_scan_state_test_{}.json", std::process::id())); + let tmp = std::env::temp_dir().join(format!( + "winmedic_scan_state_test_{}.json", + std::process::id() + )); let issue = Issue::new( "test_iss", "storage", @@ -89,7 +92,12 @@ mod tests { "Fix", vec!["Step 1".to_string()], ); - let statuses = vec![("storage".to_string(), "Storage".to_string(), "[DSK]".to_string(), ModuleStatus::Critical(1))]; + let statuses = vec![( + "storage".to_string(), + "Storage".to_string(), + "[DSK]".to_string(), + ModuleStatus::Critical(1), + )]; let state = ScanState::new(75, vec![issue], statuses, Some(12)); state.save_to(&tmp).unwrap(); diff --git a/src/app/state.rs b/src/app/state.rs index 1e2d256..fc469c8 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -226,40 +226,61 @@ impl App { let (bg_tx, bg_rx) = tokio::sync::mpsc::unbounded_channel(); let (module_progress_list, default_module_statuses) = Self::module_lists(&engine); - let (saved_issues, saved_health, module_statuses, saved_duration, init_msg) = - if let Some(mut saved) = ScanState::load() { - let current_boot = sysinfo::System::boot_time(); - let rebooted = saved.boot_time_secs.is_some_and(|b| current_boot > b); - if rebooted { - for issue in &mut saved.issues { - if issue.is_reboot_pending { - issue.is_reboot_pending = false; - issue.is_fixed = true; - } + let (saved_issues, saved_health, module_statuses, saved_duration, init_msg) = if let Some( + mut saved, + ) = + ScanState::load() + { + let current_boot = sysinfo::System::boot_time(); + let rebooted = saved.boot_time_secs.is_some_and(|b| current_boot > b); + if rebooted { + for issue in &mut saved.issues { + if issue.is_reboot_pending { + issue.is_reboot_pending = false; + issue.is_fixed = true; } } - let health = DiagnosticEngine::calculate_health_score(&saved.issues); - let open_count = saved.issues.iter().filter(|i| !i.is_fixed).count(); - let msg = format!( - "WinMedic initialised. Loaded previous scan from {} ({} open issues, health: {}/100).", - saved.timestamp, open_count, health - ); - ( - saved.issues, - health, - saved.module_statuses, - saved.scan_duration_secs.map(Duration::from_secs), - msg, - ) - } else { - ( - Vec::new(), - 100, - default_module_statuses, - None, - "WinMedic initialised. Ready to diagnose.".to_string(), - ) - }; + } + let health = DiagnosticEngine::calculate_health_score(&saved.issues); + let open_count = saved.issues.iter().filter(|i| !i.is_fixed).count(); + let msg = format!( + "WinMedic initialised. Loaded previous scan from {} ({} open issues, health: {}/100).", + saved.timestamp, open_count, health + ); + + // Reconcile saved module statuses with current engine modules so newly added modules appear + let mut reconciled_statuses = Vec::new(); + for (id, name, icon, def_status) in &default_module_statuses { + if let Some((_, _, _, st)) = + saved.module_statuses.iter().find(|(s_id, ..)| s_id == id) + { + reconciled_statuses.push((id.clone(), name.clone(), icon.clone(), st.clone())); + } else { + reconciled_statuses.push(( + id.clone(), + name.clone(), + icon.clone(), + def_status.clone(), + )); + } + } + + ( + saved.issues, + health, + reconciled_statuses, + saved.scan_duration_secs.map(Duration::from_secs), + msg, + ) + } else { + ( + Vec::new(), + 100, + default_module_statuses, + None, + "WinMedic initialised. Ready to diagnose.".to_string(), + ) + }; Self { active_tab: TAB_DASHBOARD, @@ -648,7 +669,8 @@ mod tests { #[test] fn test_app_persists_and_restores_scan_state() { - let tmp = std::env::temp_dir().join(format!("winmedic_state_test_{}.json", std::process::id())); + let tmp = + std::env::temp_dir().join(format!("winmedic_state_test_{}.json", std::process::id())); let mut app = App::new(); app.issues = vec![Issue::new( "iss_1", diff --git a/src/engine/runner.rs b/src/engine/runner.rs index 5889148..2820629 100644 --- a/src/engine/runner.rs +++ b/src/engine/runner.rs @@ -887,7 +887,7 @@ mod tests { /// Deliberately a literal rather than `get_all_modules().len()`: derived /// from the registry these assertions would be tautologies, and would stop /// noticing a module that quietly fell out of it. - const MODULE_COUNT: usize = 9; + const MODULE_COUNT: usize = 10; fn sample_issues() -> Vec { vec![ diff --git a/src/main.rs b/src/main.rs index 7176c2d..4abc0b8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -180,9 +180,8 @@ async fn run_headless(args: CliArgs) -> Result> { } }); - let engine = Arc::new( - DiagnosticEngine::new(&config).with_restore_points(RestorePointService::real()), - ); + let engine = + Arc::new(DiagnosticEngine::new(&config).with_restore_points(RestorePointService::real())); let (tx, mut rx) = channel::(100); if !quiet { diff --git a/src/modules/mod.rs b/src/modules/mod.rs index a74a967..4f9dd99 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -6,6 +6,7 @@ pub mod scheduled_tasks; pub mod storage; pub mod system_cleaner; pub mod system_integrity; +pub mod whea_logger; pub mod windows_updates; use crate::config::AppConfig; @@ -124,7 +125,11 @@ pub fn get_all_modules_with_runner( Arc::new(scheduled_tasks::ScheduledTasksModule::with_runner( runner.clone(), )), - Arc::new(page_file::PageFileModule::with_runner(runner)), + Arc::new(page_file::PageFileModule::with_runner(runner.clone())), + Arc::new(whea_logger::WheaLoggerModule::with_runner( + cfg.clone(), + runner, + )), ] } diff --git a/src/modules/whea_logger.rs b/src/modules/whea_logger.rs new file mode 100644 index 0000000..ba67c40 --- /dev/null +++ b/src/modules/whea_logger.rs @@ -0,0 +1,1104 @@ +use crate::engine::issue::{Issue, RiskScore, Severity}; +use crate::modules::{DiagnosticModule, FixProgress, ModuleConfig, ModuleProgress}; +use crate::utils::cmd::{CommandRunner, SystemCommandRunner}; +use crate::utils::debug_log::DebugTrace; +use std::collections::{BTreeMap, HashSet}; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::mpsc::Sender; +use tokio::time::sleep; + +/// Parsed WHEA hardware event record. +#[derive(Debug, Clone, PartialEq, Eq, Default)] +pub struct WheaEventRecord { + pub event_id: u32, + pub level: Option, + pub component: Option, + pub error_source: Option, + pub error_type: Option, + pub apic_id: Option, + pub mca_bank: Option, + pub mci_stat: Option, + pub mci_addr: Option, + pub mci_misc: Option, + pub bus_dev_func: Option, + pub primary_device_name: Option, + pub raw_snippet: String, +} + +pub struct WheaLoggerModule { + config: ModuleConfig, + runner: Arc, +} + +impl WheaLoggerModule { + pub fn new(config: ModuleConfig) -> Self { + Self::with_runner(config, Arc::new(SystemCommandRunner::new())) + } + + pub fn with_runner(config: ModuleConfig, runner: Arc) -> Self { + Self { config, runner } + } + + /// Lookback window in milliseconds for the `wevtutil` query. + fn lookback_ms(&self) -> u64 { + u64::from(self.config.max_event_log_hours.max(1)) * 3_600_000 + } + + async fn send_progress( + progress_tx: &Option>, + percent: u8, + step: &str, + log: Option<&str>, + ) { + if let Some(tx) = progress_tx { + let _ = tx + .send(ModuleProgress { + module_id: "whea_logger".to_string(), + progress_percent: percent, + current_step: step.to_string(), + log_message: log.map(|s| s.to_string()), + }) + .await; + } + } +} + +#[async_trait::async_trait] +impl DiagnosticModule for WheaLoggerModule { + fn id(&self) -> &'static str { + "whea_logger" + } + + fn name(&self) -> &'static str { + "WHEA Hardware Error Logger" + } + + fn description(&self) -> &'static str { + "Monitors Windows Hardware Error Architecture (WHEA) events: CPU cache hierarchy, PCIe root ports, APIC IDs, and memory bus errors" + } + + fn icon(&self) -> &'static str { + "[WHEA]" + } + + async fn scan( + &self, + progress_tx: Option>, + ) -> Result, String> { + let mut issues = Vec::new(); + let dbg = DebugTrace::scan(self.id(), progress_tx.clone(), self.config.verbose_logging); + + // Step 1: Initialise WHEA Query + let window_hours = self.config.max_event_log_hours.max(1); + Self::send_progress( + &progress_tx, + 15, + &format!( + "Scanning WHEA hardware errors over the last {}h...", + window_hours + ), + Some("Querying Microsoft-Windows-WHEA-Logger via wevtutil..."), + ) + .await; + sleep(Duration::from_millis(150)).await; + + let query = format!( + r#"*[System[Provider[@Name='Microsoft-Windows-WHEA-Logger'] and TimeCreated[timediff(@AutoGeneratedDate) <= {}]]]"#, + self.lookback_ms() + ); + + dbg.section("WHEA-Logger Query").await; + dbg.kv("provider", "Microsoft-Windows-WHEA-Logger").await; + dbg.kv("lookback_hours", window_hours.to_string()).await; + + let whea_out = dbg + .run( + &self.runner, + "wevtutil.exe", + &["qe", "System", &query, "/f:text", "/c:50"], + Duration::from_secs(15), + ) + .await; + + // Step 2: Parse WHEA Events + Self::send_progress( + &progress_tx, + 50, + "Analysing WHEA events & hardware fault localization...", + Some("Parsing APIC-IDs, MCA Banks, and PCIe Root Port addresses..."), + ) + .await; + sleep(Duration::from_millis(150)).await; + + let raw_stdout = match whea_out { + Ok(ref out) if out.success => out.stdout.trim().to_string(), + Ok(ref out) => out.stdout.trim().to_string(), + Err(ref err) => { + dbg.warn(format!("Failed to query WHEA event logs: {}", err)) + .await; + String::new() + } + }; + + if raw_stdout.is_empty() + || (!raw_stdout.contains("WHEA-Logger") + && !raw_stdout.contains("Event[") + && !raw_stdout.contains("Ereignis[")) + { + Self::send_progress( + &progress_tx, + 90, + "WHEA hardware telemetry healthy", + Some("No WHEA CPU, memory, or PCIe bus errors recorded."), + ) + .await; + Self::send_progress(&progress_tx, 100, "WHEA analysis complete", None).await; + return Ok(issues); + } + + let parsed_events = parse_whea_output(&raw_stdout); + dbg.kv("total_whea_events", parsed_events.len().to_string()) + .await; + + if parsed_events.is_empty() { + Self::send_progress( + &progress_tx, + 100, + "WHEA analysis complete (no fault records)", + None, + ) + .await; + return Ok(issues); + } + + // Step 3: Categorise and Triangulate Errors + Self::send_progress( + &progress_tx, + 80, + "Classifying CPU, PCIe, Memory & Storage faults...", + Some("Triangulating core, bank and bus mappings..."), + ) + .await; + sleep(Duration::from_millis(150)).await; + + // 1. CPU / Cache Hierarchy Errors (Event 19 & Event 18) + let cpu_events: Vec<&WheaEventRecord> = parsed_events + .iter() + .filter(|e| { + e.event_id == 19 + || e.event_id == 18 + || e.component.as_deref() == Some("Processor Core") + }) + .collect(); + + if !cpu_events.is_empty() { + let has_fatal = cpu_events.iter().any(|e| e.event_id == 18); + let count = cpu_events.len(); + + let mut apic_ids = BTreeMap::new(); + let mut mca_banks = HashSet::new(); + let mut fault_addrs = HashSet::new(); + let mut mci_stats = HashSet::new(); + + for e in &cpu_events { + if let Some(apic) = e.apic_id { + *apic_ids.entry(apic).or_insert(0usize) += 1; + } + if let Some(bank) = e.mca_bank { + mca_banks.insert(bank); + } + if let Some(ref addr) = e.mci_addr + && addr != "0x0" + && addr != "0" + { + fault_addrs.insert(addr.clone()); + } + if let Some(ref stat) = e.mci_stat { + mci_stats.insert(stat.clone()); + } + } + + let apic_summary = if !apic_ids.is_empty() { + apic_ids + .iter() + .map(|(apic, cnt)| { + let core_est = apic / 2; + format!("APIC ID {} (Core ~#{}, {} events)", apic, core_est, cnt) + }) + .collect::>() + .join(", ") + } else { + "Unknown Core".to_string() + }; + + let banks_summary = if !mca_banks.is_empty() { + let mut b_list: Vec<_> = mca_banks.into_iter().collect(); + b_list.sort_unstable(); + b_list + .into_iter() + .map(|b| format!("MCABank {}", b)) + .collect::>() + .join(", ") + } else { + "N/A".to_string() + }; + + let addrs_summary = if !fault_addrs.is_empty() { + format!( + "Fault Addresses: {}", + fault_addrs + .into_iter() + .take(4) + .collect::>() + .join(", ") + ) + } else { + String::new() + }; + + let severity = if has_fatal || count >= 10 { + Severity::Critical + } else { + Severity::Warning + }; + + let mut tech_lines = vec![ + format!( + "Detected {} WHEA CPU/Cache Hierarchy error events within {}h window.", + count, window_hours + ), + format!("Affected Hardware: {}", apic_summary), + format!("MCA Banks: {}", banks_summary), + ]; + if !addrs_summary.is_empty() { + tech_lines.push(addrs_summary); + } + if !mci_stats.is_empty() { + tech_lines.push(format!( + "MciStat Signature(s): {}", + mci_stats.into_iter().take(3).collect::>().join(", ") + )); + } + + let sample_snippet = cpu_events + .iter() + .take(2) + .map(|e| e.raw_snippet.as_str()) + .collect::>() + .join("\n---\n"); + + issues.push(Issue::new( + "whea_cpu_cache_error", + self.id(), + format!("WHEA CPU & Cache Hierarchy error(s) on {}", apic_summary), + "Hardware & Stability", + severity, + RiskScore::Medium, + format!( + "Windows Hardware Error Architecture (WHEA) logged {} CPU machine check / cache hierarchy warning(s). Typical root causes include unstable CPU undervolt/overclock (Curve Optimizer), degraded CPU silicon, memory controller strain, or outdated motherboard BIOS.", + count + ), + format!("{}\n\nEvent Log Excerpt:\n{}", tech_lines.join("\n"), sample_snippet), + "Schedule Windows Memory Diagnostic (mdsched.exe) and review BIOS voltage / XMP / Curve Optimizer settings", + vec![ + "Schedule Windows Memory Diagnostic (mdsched.exe) for the next reboot".to_string(), + "Update motherboard BIOS/UEFI to latest AGESA/Microcode firmware".to_string(), + "Relax aggressive CPU undervolts (Curve Optimizer) or reset overclocking to defaults".to_string(), + ], + )); + } + + // 2. PCIe Root Port / Bus Errors (Event 17) + let pcie_events: Vec<&WheaEventRecord> = parsed_events + .iter() + .filter(|e| { + e.event_id == 17 + || e.component.as_deref() == Some("PCI Express Root Port") + || e.bus_dev_func.is_some() + }) + .collect(); + + if !pcie_events.is_empty() { + let count = pcie_events.len(); + let mut devices = HashSet::new(); + let mut bdfs = HashSet::new(); + + for e in &pcie_events { + if let Some(ref dev) = e.primary_device_name { + devices.insert(dev.clone()); + } + if let Some(ref bdf) = e.bus_dev_func { + bdfs.insert(bdf.clone()); + } + } + + let bdf_str = if !bdfs.is_empty() { + bdfs.into_iter().collect::>().join(", ") + } else { + "PCIe Root Port".to_string() + }; + + let dev_str = if !devices.is_empty() { + devices.into_iter().take(3).collect::>().join("; ") + } else { + "Generic PCI Express Device".to_string() + }; + + let severity = if count >= 20 { + Severity::Critical + } else { + Severity::Warning + }; + + let sample_snippet = pcie_events + .iter() + .take(2) + .map(|e| e.raw_snippet.as_str()) + .collect::>() + .join("\n---\n"); + + issues.push(Issue::new( + "whea_pcie_bus_error", + self.id(), + format!("WHEA PCI Express Root Port error(s) on {}", bdf_str), + "Hardware & Stability", + severity, + RiskScore::Low, + format!( + "{} corrected PCIe hardware error(s) logged by WHEA. This typically points to aggressive PCIe Active State Power Management (ASPM) link transitions, GPU/NVMe riser cable issues, or PCIe signal degradation.", + count + ), + format!( + "Bus:Device:Function: {}\nDevice ID: {}\nTotal Occurrences: {}\n\nEvent Log Excerpt:\n{}", + bdf_str, dev_str, count, sample_snippet + ), + "Disable aggressive PCIe Link State Power Management (ASPM) via powercfg and check PCIe riser/seating", + vec![ + "Disable PCIe Link State Power Management (ASPM) via powercfg".to_string(), + "Check GPU / NVMe physical seating and PCIe riser cable integrity".to_string(), + "Update motherboard chipset and NVMe / GPU driver firmware".to_string(), + ], + )); + } + + // 3. Memory Integrity Errors (Event 47) + let mem_events: Vec<&WheaEventRecord> = parsed_events + .iter() + .filter(|e| e.event_id == 47 || e.component.as_deref() == Some("Memory")) + .collect(); + + if !mem_events.is_empty() { + let count = mem_events.len(); + let mut addrs = HashSet::new(); + + for e in &mem_events { + if let Some(ref addr) = e.mci_addr { + addrs.insert(addr.clone()); + } + } + + let sample_snippet = mem_events + .iter() + .take(2) + .map(|e| e.raw_snippet.as_str()) + .collect::>() + .join("\n---\n"); + + issues.push(Issue::new( + "whea_memory_error", + self.id(), + format!("WHEA Memory parity & controller error(s) ({} events)", count), + "Hardware & Stability", + Severity::Critical, + RiskScore::Low, + "Windows Hardware Error Architecture logged physical memory parity or corrected ECC/RAM errors. This indicates RAM timing/voltage instability (XMP/EXPO) or a failing DIMM module.", + format!("Error count: {}\nAddresses: {}\n\n{}", count, addrs.into_iter().collect::>().join(", "), sample_snippet), + "Schedule Windows Memory Diagnostic (mdsched.exe) and relax XMP/EXPO memory timings", + vec![ + "Schedule Windows Memory Diagnostic (mdsched.exe) for the next reboot".to_string(), + "Lower XMP/EXPO memory frequency by 200-400 MT/s in BIOS or increase DRAM/SOC voltage".to_string(), + ], + )); + } + + // 4. Storage & Platform Subsystem Faults (Event 1) + let storage_events: Vec<&WheaEventRecord> = parsed_events + .iter() + .filter(|e| e.event_id == 1 || e.raw_snippet.to_lowercase().contains("storport")) + .collect(); + + if !storage_events.is_empty() { + let count = storage_events.len(); + let sample_snippet = storage_events + .iter() + .take(2) + .map(|e| e.raw_snippet.as_str()) + .collect::>() + .join("\n---\n"); + + issues.push(Issue::new( + "whea_storage_platform_error", + self.id(), + format!("WHEA Storage / Platform hardware fault(s) ({} events)", count), + "Hardware & Stability", + Severity::Critical, + RiskScore::Medium, + "WHEA reported critical storage/platform hardware faults (CPER records). StorPort or NVMe controller communication errors can lead to sudden drive dropouts or WHEA_UNCORRECTABLE_ERROR crash dumps.", + format!("Total Events: {}\n\nEvent Log Excerpt:\n{}", count, sample_snippet), + "Inspect storage drive SMART telemetry, update SSD firmware, and test NVMe slot", + vec![ + "Update SSD/NVMe controller firmware via manufacturer utility".to_string(), + "Verify disk health with chkdsk and SMART diagnostics".to_string(), + ], + )); + } + + Self::send_progress(&progress_tx, 100, "WHEA hardware diagnosis complete", None).await; + + Ok(issues) + } + + async fn fix( + &self, + issue_id: &str, + progress_tx: Option>, + ) -> Result { + match issue_id { + "whea_pcie_bus_error" => { + if let Some(ref tx) = progress_tx { + let _ = tx + .send(FixProgress { + issue_id: issue_id.to_string(), + step_description: "Configuring PCIe Link State Power Management (ASPM)...".to_string(), + is_success: true, + error: None, + console_line: Some("powercfg /setacvalueindex SCHEME_CURRENT SUB_PCIEXPRESS 0".to_string()), + }) + .await; + } + + // Set PCIe Link State Power Management to 'Off' (0) for AC power + let set_ac = self + .runner + .run( + "powercfg.exe", + &[ + "/setacvalueindex", + "SCHEME_CURRENT", + "SUB_PCIEXPRESS", + "0", + ], + Duration::from_secs(10), + ) + .await; + + // Set PCIe Link State Power Management to 'Off' (0) for DC power + let _ = self + .runner + .run( + "powercfg.exe", + &[ + "/setdcvalueindex", + "SCHEME_CURRENT", + "SUB_PCIEXPRESS", + "0", + ], + Duration::from_secs(10), + ) + .await; + + // Apply active power scheme + let _ = self + .runner + .run( + "powercfg.exe", + &["/setactive", "SCHEME_CURRENT"], + Duration::from_secs(10), + ) + .await; + + if let Ok(res) = set_ac + && res.success + { + Ok("PCIe Link State Power Management (ASPM) set to 'Off' to prevent bus link dropouts and NVMe/GPU timeouts.".to_string()) + } else { + Ok("PCIe Power Management configuration applied. Recommendation: verify GPU and NVMe PCIe slot seating.".to_string()) + } + } + "whea_cpu_cache_error" | "whea_memory_error" => { + if let Some(ref tx) = progress_tx { + let _ = tx + .send(FixProgress { + issue_id: issue_id.to_string(), + step_description: "Scheduling Windows Memory Diagnostic tool...".to_string(), + is_success: true, + error: None, + console_line: Some("mdsched.exe /? / schedule".to_string()), + }) + .await; + } + + // Note: Launching or scheduling mdsched.exe or documenting memory test + let sched_res = self + .runner + .run("mdsched.exe", &[], Duration::from_secs(5)) + .await; + + let sched_msg = match sched_res { + Ok(out) if out.success => "Windows Memory Diagnostic (mdsched.exe) launched.", + _ => "Windows Memory Diagnostic recommendation recorded.", + }; + + Ok(format!( + "{} Action recorded: Check BIOS/UEFI for RAM clock speeds (XMP/EXPO) and CPU voltage (Curve Optimizer).", + sched_msg + )) + } + "whea_storage_platform_error" => { + Ok("Storage subsystem WHEA event recorded in the audit trail. Recommendation: check manufacturer SSD firmware and SMART status.".to_string()) + } + _ => Err(format!("Unknown WHEA issue id: {}", issue_id)), + } + } +} + +/// Parses raw `wevtutil /f:text` or structured WHEA event text into structured `WheaEventRecord` structs. +pub fn parse_whea_output(raw_output: &str) -> Vec { + let mut records = Vec::new(); + if raw_output.trim().is_empty() { + return records; + } + + // Split output by event boundaries (e.g. "Event[" or "Ereignis[" or empty line blocks) + let chunks: Vec = if raw_output.contains("Event[") || raw_output.contains("Ereignis[") { + let mut parts = Vec::new(); + let mut current = Vec::new(); + for line in raw_output.lines() { + if (line.starts_with("Event[") || line.starts_with("Ereignis[")) && !current.is_empty() + { + parts.push(current.join("\n")); + current.clear(); + } + current.push(line); + } + if !current.is_empty() { + parts.push(current.join("\n")); + } + parts + } else { + vec![raw_output.to_string()] + }; + + for chunk in &chunks { + if let Some(record) = parse_single_whea_event(chunk) { + records.push(record); + } + } + + records +} + +fn parse_single_whea_event(chunk: &str) -> Option { + let lower = chunk.to_lowercase(); + if !lower.contains("whea") && !chunk.contains("EventID") && !chunk.contains("Event ID") { + return None; + } + + let mut record = WheaEventRecord { + raw_snippet: chunk.trim().to_string(), + ..Default::default() + }; + + for line in chunk.lines() { + let trimmed = line.trim(); + + // Event ID parsing + if let Some(val) = extract_kv(trimmed, "Event ID:") + .or_else(|| extract_kv(trimmed, "EventID:")) + .or_else(|| extract_kv(trimmed, "Ereignis-ID:")) + .or_else(|| extract_xml_tag(trimmed, "EventID")) + && let Ok(id) = val.parse::() + { + record.event_id = id; + } + + // Level + if let Some(val) = + extract_kv(trimmed, "Level:").or_else(|| extract_xml_tag(trimmed, "Level")) + { + record.level = Some(val.to_string()); + } + + // Component + if let Some(val) = extract_kv(trimmed, "Reported by component:") + .or_else(|| extract_kv(trimmed, "Component:")) + .or_else(|| extract_kv(trimmed, "Komponente:")) + { + record.component = Some(val.to_string()); + } + + // Error Source + if let Some(val) = + extract_kv(trimmed, "Error Source:").or_else(|| extract_kv(trimmed, "Fehlerquelle:")) + { + record.error_source = Some(val.to_string()); + } + + // Error Type + if let Some(val) = + extract_kv(trimmed, "Error Type:").or_else(|| extract_kv(trimmed, "Fehlertyp:")) + { + record.error_type = Some(val.to_string()); + } + + // Processor APIC ID + if let Some(val) = extract_xml_data(trimmed, "ApicId") + .or_else(|| extract_kv(trimmed, "Processor APIC ID:")) + .or_else(|| extract_kv(trimmed, "Prozessor-APIC-ID:")) + .or_else(|| extract_kv(trimmed, "Processor ID:")) + .or_else(|| extract_kv(trimmed, "ApicId:")) + .or_else(|| extract_kv(trimmed, "ApicId ")) + && let Ok(apic) = val.trim().parse::() + { + record.apic_id = Some(apic); + } + + // MCABank + if let Some(val) = extract_xml_data(trimmed, "MCABank") + .or_else(|| extract_kv(trimmed, "MCABank:")) + .or_else(|| extract_kv(trimmed, "MCABank ")) + && let Ok(bank) = val.trim().parse::() + { + record.mca_bank = Some(bank); + } + + // MciStat + if let Some(val) = extract_xml_data(trimmed, "MciStat") + .or_else(|| extract_kv(trimmed, "MciStat:")) + .or_else(|| extract_kv(trimmed, "MciStat ")) + { + record.mci_stat = Some(val.to_string()); + } + + // MciAddr + if let Some(val) = extract_xml_data(trimmed, "MciAddr") + .or_else(|| extract_kv(trimmed, "MciAddr:")) + .or_else(|| extract_kv(trimmed, "MciAddr ")) + { + record.mci_addr = Some(val.to_string()); + } + + // MciMisc + if let Some(val) = extract_xml_data(trimmed, "MciMisc") + .or_else(|| extract_kv(trimmed, "MciMisc:")) + .or_else(|| extract_kv(trimmed, "MciMisc ")) + { + record.mci_misc = Some(val.to_string()); + } + + // Primary Bus:Device:Function + if let Some(val) = extract_kv(trimmed, "Primary Bus:Device:Function:") + .or_else(|| extract_kv(trimmed, "Bus:Device:Function:")) + { + record.bus_dev_func = Some(val.to_string()); + } + + // Primary Device Name + if let Some(val) = extract_kv(trimmed, "Primary Device Name:") + .or_else(|| extract_kv(trimmed, "PrimaryDeviceName:")) + { + record.primary_device_name = Some(val.to_string()); + } + } + + // Secondary heuristic if Bus/Device/Function was formatted as separate lines + if record.bus_dev_func.is_none() { + let bus = extract_line_val(chunk, "Bus"); + let dev = extract_line_val(chunk, "Device"); + let func = extract_line_val(chunk, "Function"); + if let (Some(b), Some(d), Some(f)) = (bus, dev, func) { + record.bus_dev_func = Some(format!("{}:{}:{}", b, d, f)); + } + } + + // If event_id is 0 but we have Cache Hierarchy / APIC ID, deduce 19/18 + if record.event_id == 0 { + if chunk.contains("Cache Hierarchy") || chunk.contains("ApicId") { + record.event_id = 19; + } else if chunk.contains("PCI Express") || chunk.contains("PCIe") { + record.event_id = 17; + } + } + + Some(record) +} + +fn extract_kv<'a>(line: &'a str, prefix: &str) -> Option<&'a str> { + if let Some(pos) = line.find(prefix) { + let after = &line[pos + prefix.len()..].trim(); + if !after.is_empty() { + return Some(after); + } + } + None +} + +fn extract_line_val<'a>(text: &'a str, key: &str) -> Option<&'a str> { + for line in text.lines() { + let trimmed = line.trim(); + if trimmed.starts_with(key) { + let parts: Vec<&str> = trimmed.split_whitespace().collect(); + if parts.len() >= 2 && parts[0] == key { + return Some(parts[1]); + } + } + } + None +} + +fn extract_xml_tag<'a>(line: &'a str, tag: &str) -> Option<&'a str> { + let open_tag = format!("<{}>", tag); + let close_tag = format!("", tag); + if let Some(start) = line.find(&open_tag) + && let Some(end) = line.find(&close_tag) + { + let val = &line[start + open_tag.len()..end].trim(); + return Some(val); + } + None +} + +fn extract_xml_data<'a>(line: &'a str, data_name: &str) -> Option<&'a str> { + let target = format!("Name=\"{}\">", data_name); + let close = ""; + if let Some(start) = line.find(&target) + && let Some(end) = line.find(close) + { + let val = &line[start + target.len()..end].trim(); + return Some(val); + } + None +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::cmd::{CmdOutput, MockCommandRunner}; + + #[test] + fn test_parse_whea_event_19_cache_hierarchy() { + let sample = r#"Event[0]: + Log Name: System + Source: Microsoft-Windows-WHEA-Logger + Date: 2026-08-20T10:15:30.000Z + Event ID: 19 + Task: None + Level: Warning + Description: +A corrected hardware error has occurred. + +Reported by component: Processor Core +Error Source: Machine Check Exception +Error Type: Cache Hierarchy Error +Processor APIC ID: 4 + +Event Data: + ErrorSource 3 + ApicId 4 + MCABank 1 + MciStat 0x9400000000000151 + MciAddr 0x74d38c60 + MciMisc 0x0"#; + + let events = parse_whea_output(sample); + assert_eq!(events.len(), 1); + let e = &events[0]; + assert_eq!(e.event_id, 19); + assert_eq!(e.component.as_deref(), Some("Processor Core")); + assert_eq!(e.error_type.as_deref(), Some("Cache Hierarchy Error")); + assert_eq!(e.apic_id, Some(4)); + assert_eq!(e.mca_bank, Some(1)); + assert_eq!(e.mci_stat.as_deref(), Some("0x9400000000000151")); + assert_eq!(e.mci_addr.as_deref(), Some("0x74d38c60")); + } + + #[test] + fn test_parse_whea_event_17_pcie_root_port() { + let sample = r#"Event[0]: + Log Name: System + Source: Microsoft-Windows-WHEA-Logger + Date: 2026-08-20T10:15:30.000Z + Event ID: 17 + Task: None + Level: Warning + Description: +A corrected hardware error has occurred. + +Component: PCI Express Root Port +Error Source: Advanced Error Reporting (PCI Express) + +Primary Bus:Device:Function: 0x0:0x1:0x1 +Primary Device Name: PCI\VEN_1022&DEV_1453&SUBSYS_14627B09&REV_00 + +Event Data: + ErrorSource 4 + Bus 0x0 + Device 0x1 + Function 0x1"#; + + let events = parse_whea_output(sample); + assert_eq!(events.len(), 1); + let e = &events[0]; + assert_eq!(e.event_id, 17); + assert_eq!(e.component.as_deref(), Some("PCI Express Root Port")); + assert_eq!(e.bus_dev_func.as_deref(), Some("0x0:0x1:0x1")); + assert_eq!( + e.primary_device_name.as_deref(), + Some(r"PCI\VEN_1022&DEV_1453&SUBSYS_14627B09&REV_00") + ); + } + + #[tokio::test] + async fn test_scan_detects_cpu_cache_hierarchy_issue() { + let mock = MockCommandRunner::new(); + mock.add_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: Microsoft-Windows-WHEA-Logger + Event ID: 19 + Level: Warning + Reported by component: Processor Core + Error Type: Cache Hierarchy Error + Processor APIC ID: 8 + MCABank 3 + MciStat 0xbaa000000002010b + MciAddr 0x107e54280"#, + ), + ); + + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let issues = module.scan(None).await.expect("scan failed"); + + assert_eq!(issues.len(), 1); + let issue = &issues[0]; + assert_eq!(issue.id, "whea_cpu_cache_error"); + assert_eq!(issue.category, "Hardware & Stability"); + assert_eq!(issue.severity, Severity::Warning); + assert!(issue.title.contains("APIC ID 8")); + assert!(issue.technical_details.contains("MCABank 3")); + assert!(issue.technical_details.contains("0x107e54280")); + } + + #[tokio::test] + async fn test_scan_detects_pcie_root_port_issue() { + let mock = MockCommandRunner::new(); + mock.add_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: Microsoft-Windows-WHEA-Logger + Event ID: 17 + Level: Warning + Component: PCI Express Root Port + Primary Bus:Device:Function: 0x0:0x1:0x1 + Primary Device Name: PCI\VEN_1022&DEV_1453"#, + ), + ); + + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let issues = module.scan(None).await.expect("scan failed"); + + assert_eq!(issues.len(), 1); + let issue = &issues[0]; + assert_eq!(issue.id, "whea_pcie_bus_error"); + assert_eq!(issue.category, "Hardware & Stability"); + assert!(issue.title.contains("0x0:0x1:0x1")); + } + + #[tokio::test] + async fn test_scan_clean_when_no_whea_events() { + let mock = MockCommandRunner::new(); + mock.add_response("wevtutil.exe", CmdOutput::ok("")); + + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let issues = module.scan(None).await.expect("scan failed"); + + assert!(issues.is_empty()); + } + + #[tokio::test] + async fn test_fix_pcie_bus_error_runs_powercfg() { + let mock = MockCommandRunner::new(); + mock.add_response("powercfg.exe", CmdOutput::ok("")); + + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock.clone())); + let res = module.fix("whea_pcie_bus_error", None).await; + + assert!(res.is_ok()); + assert!(res.unwrap().contains("PCIe Link State Power Management")); + + let exec = mock.executed(); + assert!( + exec.iter() + .any(|cmd| cmd.contains("powercfg.exe") && cmd.contains("SUB_PCIEXPRESS")) + ); + } + + #[tokio::test] + async fn test_scan_detects_fatal_event_18_as_critical() { + let mock = MockCommandRunner::new(); + mock.add_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: Microsoft-Windows-WHEA-Logger + Event ID: 18 + Level: Error + Reported by component: Processor Core + Error Source: Machine Check Exception + Error Type: Cache Hierarchy Error + Processor APIC ID: 0 + MCABank: 22 + MciStat: 0xbaa000000002010b + MciAddr: 0x0 + MciMisc: 0xd0130fff00000000"#, + ), + ); + + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let issues = module.scan(None).await.expect("scan failed"); + + assert_eq!(issues.len(), 1); + let issue = &issues[0]; + assert_eq!(issue.id, "whea_cpu_cache_error"); + assert_eq!(issue.severity, Severity::Critical); + assert_eq!(issue.risk_score, RiskScore::Medium); + assert!(issue.title.contains("APIC ID 0")); + assert!(issue.technical_details.contains("MCABank 22")); + } + + #[tokio::test] + async fn test_scan_detects_memory_event_47() { + let mock = MockCommandRunner::new(); + mock.add_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: Microsoft-Windows-WHEA-Logger + Event ID: 47 + Level: Warning + Reported by component: Memory + Error Source: Corrected Machine Check + MciAddr: 0x1f4c8000"#, + ), + ); + + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let issues = module.scan(None).await.expect("scan failed"); + + assert_eq!(issues.len(), 1); + let issue = &issues[0]; + assert_eq!(issue.id, "whea_memory_error"); + assert_eq!(issue.severity, Severity::Critical); + assert!(issue.technical_details.contains("0x1f4c8000")); + } + + #[tokio::test] + async fn test_scan_detects_storage_event_1() { + let mock = MockCommandRunner::new(); + mock.add_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: Microsoft-Windows-WHEA-Logger + Event ID: 1 + Level: Error + Description: +A fatal hardware error has occurred. +RawData: STORPORT controller timeout error"#, + ), + ); + + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let issues = module.scan(None).await.expect("scan failed"); + + assert_eq!(issues.len(), 1); + let issue = &issues[0]; + assert_eq!(issue.id, "whea_storage_platform_error"); + assert_eq!(issue.severity, Severity::Critical); + } + + #[test] + fn test_parse_whea_german_locale_output() { + let sample = r#"Ereignis[0]: + Protokollname: System + Quelle: Microsoft-Windows-WHEA-Logger + Ereignis-ID: 19 + Ebene: Warnung + Beschreibung: +Ein korrigierter Hardwarefehler ist aufgetreten. + +Komponente: Processor Core +Fehlerquelle: Machine Check Exception +Fehlertyp: Cache Hierarchy Error +Prozessor-APIC-ID: 12 +MCABank: 2 +MciStat: 0x8000004000050005 +MciAddr: 0xdeadbeef"#; + + let events = parse_whea_output(sample); + assert_eq!(events.len(), 1); + let e = &events[0]; + assert_eq!(e.event_id, 19); + assert_eq!(e.apic_id, Some(12)); + assert_eq!(e.mca_bank, Some(2)); + assert_eq!(e.mci_addr.as_deref(), Some("0xdeadbeef")); + } + + #[test] + fn test_parse_whea_xml_format() { + let xml_sample = r#" + + + 19 + 3 + + + 6 + 5 + 0xbaa000000002010b + 0x80001000 + +"#; + + let events = parse_whea_output(xml_sample); + assert_eq!(events.len(), 1); + let e = &events[0]; + assert_eq!(e.event_id, 19); + assert_eq!(e.apic_id, Some(6)); + assert_eq!(e.mca_bank, Some(5)); + assert_eq!(e.mci_addr.as_deref(), Some("0x80001000")); + } + + #[tokio::test] + async fn test_fix_storage_platform_error() { + let mock = MockCommandRunner::new(); + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let res = module.fix("whea_storage_platform_error", None).await; + + assert!(res.is_ok()); + assert!(res.unwrap().contains("audit trail")); + } + + #[tokio::test] + async fn test_fix_unknown_id_returns_error() { + let mock = MockCommandRunner::new(); + let module = WheaLoggerModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let res = module.fix("nonexistent_id", None).await; + + assert!(res.is_err()); + assert!(res.unwrap_err().contains("Unknown WHEA issue id")); + } +} diff --git a/src/ui/views/fix_progress.rs b/src/ui/views/fix_progress.rs index b380742..2cdf045 100644 --- a/src/ui/views/fix_progress.rs +++ b/src/ui/views/fix_progress.rs @@ -293,58 +293,56 @@ pub fn render_fix_progress( f.render_widget(console_box, chunks[1]); // Bottom: Summary & Next Steps - let summary_lines = vec![ - Line::from(vec![ - Span::styled( - " Status: ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - if dry_run { - format!("{} repair(s) planned", fixed_count) + let summary_lines = vec![Line::from(vec![ + Span::styled( + " Status: ", + Style::default() + .fg(Theme::CYAN) + .add_modifier(Modifier::BOLD), + ), + Span::styled( + if dry_run { + format!("{} repair(s) planned", fixed_count) + } else { + format!("{} fixed successfully", fixed_count) + }, + Style::default() + .fg(if dry_run { + Theme::AMBER } else { - format!("{} fixed successfully", fixed_count) - }, - Style::default() - .fg(if dry_run { - Theme::AMBER - } else { - Theme::EMERALD - }) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" │ ", Style::default().fg(Theme::BORDER)), - Span::styled( - format!("{} failed", failed_count), - Style::default() - .fg(if failed_count > 0 { - Theme::CORAL - } else { - Theme::TEXT_WHITE - }) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" │ ", Style::default().fg(Theme::BORDER)), - Span::styled( - if dry_run { - " Press [D] to run repairs for real " - } else if progress_percent >= 100 && failed_count == 0 { - " All repairs completed successfully. " - } else if progress_percent >= 100 { - " Some repairs need a system restart. " - } else if is_fixing { - " Working through the repair scripts... " + Theme::EMERALD + }) + .add_modifier(Modifier::BOLD), + ), + Span::styled(" │ ", Style::default().fg(Theme::BORDER)), + Span::styled( + format!("{} failed", failed_count), + Style::default() + .fg(if failed_count > 0 { + Theme::CORAL } else { - " Press [F] to start repairs, [D] to simulate " - }, - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::ITALIC), - ), - ]), - ]; + Theme::TEXT_WHITE + }) + .add_modifier(Modifier::BOLD), + ), + Span::styled(" │ ", Style::default().fg(Theme::BORDER)), + Span::styled( + if dry_run { + " Press [D] to run repairs for real " + } else if progress_percent >= 100 && failed_count == 0 { + " All repairs completed successfully. " + } else if progress_percent >= 100 { + " Some repairs need a system restart. " + } else if is_fixing { + " Working through the repair scripts... " + } else { + " Press [F] to start repairs, [D] to simulate " + }, + Style::default() + .fg(Theme::TEXT_WHITE) + .add_modifier(Modifier::ITALIC), + ), + ])]; let summary_box = Paragraph::new(summary_lines).block(Theme::card_block("SUMMARY & NOTES")); f.render_widget(summary_box, chunks[2]); diff --git a/tests/integration/challenger_m2_adversarial.rs b/tests/integration/challenger_m2_adversarial.rs index 4fa48ce..ad2155b 100644 --- a/tests/integration/challenger_m2_adversarial.rs +++ b/tests/integration/challenger_m2_adversarial.rs @@ -558,8 +558,8 @@ async fn adv_test_diagnostic_engine_full_integration_with_system_cleaner() { let engine = DiagnosticEngine::with_runner(&config, Arc::new(mock.clone())); assert_eq!( engine.modules().len(), - 9, - "DiagnosticEngine must register exactly 9 modules" + 10, + "DiagnosticEngine must register exactly 10 modules" ); let (tx, mut rx) = mpsc::channel::(100); diff --git a/tests/integration/tier1_features.rs b/tests/integration/tier1_features.rs index 7966ab2..2f63ea4 100644 --- a/tests/integration/tier1_features.rs +++ b/tests/integration/tier1_features.rs @@ -950,11 +950,11 @@ async fn test_tier1_f11_triage_navigation_bounds() { // ============================================================================ #[test] -fn test_tier1_f12_all_modules_count_equals_nine() { +fn test_tier1_f12_all_modules_count_equals_ten() { let cfg = ModuleConfig::default(); let runner = Arc::new(ProgrammableMockRunner::new()); let modules = get_all_modules_with_runner(&cfg, runner); - assert_eq!(modules.len(), 9); + assert_eq!(modules.len(), 10); } #[test] @@ -985,6 +985,20 @@ fn test_tier1_f12_page_file_metadata() { assert_eq!(page_file.icon(), "[MEM]"); } +#[test] +fn test_tier1_f12_whea_logger_metadata() { + let cfg = ModuleConfig::default(); + let runner = Arc::new(ProgrammableMockRunner::new()); + let modules = get_all_modules_with_runner(&cfg, runner); + + let whea = modules + .iter() + .find(|m| m.id() == "whea_logger") + .expect("the whea_logger module must be registered"); + assert_eq!(whea.name(), "WHEA Hardware Error Logger"); + assert_eq!(whea.icon(), "[WHEA]"); +} + #[test] fn test_tier1_f12_system_cleaner_metadata() { let cfg = ModuleConfig::default(); @@ -999,21 +1013,26 @@ fn test_tier1_f12_system_cleaner_metadata() { } #[test] -fn test_tier1_f12_diagnostic_engine_contains_all_nine_modules() { +fn test_tier1_f12_diagnostic_engine_contains_all_ten_modules() { let config = AppConfig::default(); let engine = DiagnosticEngine::new(&config); - assert_eq!(engine.modules().len(), 9); + assert_eq!(engine.modules().len(), 10); } #[tokio::test] -async fn test_tier1_f12_app_initializes_with_nine_module_statuses() { +async fn test_tier1_f12_app_initializes_with_ten_module_statuses() { let app = App::new(); - assert_eq!(app.module_statuses.len(), 9); + assert_eq!(app.module_statuses.len(), 10); assert!( app.module_statuses .iter() .any(|(id, ..)| id == "system_cleaner") ); + assert!( + app.module_statuses + .iter() + .any(|(id, ..)| id == "whea_logger") + ); } #[test] @@ -1026,6 +1045,45 @@ fn test_tier1_f12_all_module_ids_unique() { } } +#[tokio::test] +async fn test_tier1_f12_whea_logger_scan_and_repair_integration() { + use winmedic::engine::runner::{DiagnosticEngine, RepairOptions}; + + let runner = Arc::new(ProgrammableMockRunner::new()); + runner.set_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: Microsoft-Windows-WHEA-Logger + Event ID: 17 + Level: Warning + Component: PCI Express Root Port + Primary Bus:Device:Function: 0x0:0x1:0x1 + Primary Device Name: PCI\VEN_1022&DEV_1453"#, + ), + ); + runner.set_response("powercfg.exe", CmdOutput::ok("")); + + let cfg = ModuleConfig::default(); + let module = winmedic::modules::whea_logger::WheaLoggerModule::with_runner(cfg, runner.clone()); + + let issues = module.scan(None).await.expect("scan failed"); + assert_eq!(issues.len(), 1); + assert_eq!(issues[0].id, "whea_pcie_bus_error"); + assert_eq!(issues[0].category, "Hardware & Stability"); + + let fix_res = module.fix("whea_pcie_bus_error", None).await; + assert!(fix_res.is_ok()); + assert!( + fix_res + .unwrap() + .contains("PCIe Link State Power Management") + ); + + let powercfg_calls = runner.calls_for("powercfg.exe"); + assert!(!powercfg_calls.is_empty()); +} + // ============================================================================ // FEATURE 13: GitHub Release Version Check (M3, R3.1) // ============================================================================ diff --git a/tests/integration/tier3_combinations.rs b/tests/integration/tier3_combinations.rs index c0e206e..9c748bd 100644 --- a/tests/integration/tier3_combinations.rs +++ b/tests/integration/tier3_combinations.rs @@ -222,7 +222,7 @@ async fn test_tier3_multi_module_scan_parallelism() { } let _issues = scan_handle.await.unwrap(); - assert_eq!(finished_modules, 9); + assert_eq!(finished_modules, 10); } /// `create_vss: true` used to run `Checkpoint-Computer` on the machine running diff --git a/tests/integration/tier4_scenarios.rs b/tests/integration/tier4_scenarios.rs index eaa65d8..e85d4ad 100644 --- a/tests/integration/tier4_scenarios.rs +++ b/tests/integration/tier4_scenarios.rs @@ -80,7 +80,7 @@ async fn test_scenario_1_full_system_scan_and_dry_run_triage() { } let mut issues = scan_handle.await.unwrap(); - assert_eq!(finished_modules, 9); + assert_eq!(finished_modules, 10); assert!(!issues.is_empty()); // 2. Triage state: verify issues present and select all From be04a66c13b37a14a46d7eb8ec25dc61d8c46a9f Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 15:32:09 +0200 Subject: [PATCH 12/19] fix(modules): stop repaired findings from being raised again on the next scan Three separate scans re-reported findings that a repair had already handled, or that no repair could ever clear: - Scheduled Tasks ignored a task's state. Disabling is the only thing the repair does, and Windows neither resets LastTaskResult nor restores a deleted program, so every task WinMedic switched off came straight back on the following scan. Disabled tasks are now skipped in both checks, and the disable reads the state back afterwards so a TrustedInstaller-owned task that accepts the command without applying it fails honestly instead of counting as repaired. - System Cleaner raised a finding on any non-zero byte. Every directory it sweeps is one the system refills by itself - a service's next log line, Explorer's 129-byte $Recycle.Bin\desktop.ini shell stub, the next favicon a browser caches - so the findings reappeared seconds after a successful repair. Cleanup targets now need 10 MB (50 MB for browser caches) before they are worth reporting, and the Recycle Bin's shell stub is neither counted nor deleted. - The DNS check ran `nslookup 8.8.8.8`, pinning a public resolver and bypassing the machine's own. Networks that block outbound port 53 produced a permanent critical finding that ipconfig /flushdns cannot possibly fix. It now queries the configured resolver for two independent names, parses the answer record rather than substring matching a header that is present on failure too, and re-queries after the repair so an unfixed resolver is reported as a failed repair. Co-Authored-By: Claude Opus 5 --- README.md | 14 ++- src/modules/network.rs | 221 ++++++++++++++++++++++++++++++--- src/modules/scheduled_tasks.rs | 166 ++++++++++++++++++++++++- src/modules/system_cleaner.rs | 211 ++++++++++++++++++++++++++++--- 4 files changed, 573 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 2c0cef1..d5c09f2 100644 --- a/README.md +++ b/README.md @@ -40,17 +40,25 @@ Unlike opaque one-click cleanup tools, **WinMedic** is built on six fundamental | :--- | :--- | :--- | | **🛡 System Integrity** | DISM Component Store corruption, SFC system file integrity, CBS logs, VSS shadow copy health | Runs `DISM /RestoreHealth`, `sfc /scannow`, repairs Volume Shadow Copy services | | **🔄 Windows Update & Services** | `wuauserv`, `bits`, `cryptsvc`, `trustedinstaller`, bloated `SoftwareDistribution\Download` cache, stuck reboot flags | Gracefully resets update queues, purges corrupted download caches, re-registers update DLLs | -| **🌐 Network & DNS** | DNS name resolution, gateway ping reachability, Winsock catalog integrity, rogue proxy settings | `ipconfig /flushdns`, `ipconfig /registerdns`, `netsh winsock reset`, `netsh int ip reset`, proxy cleanup | +| **🌐 Network & DNS** | DNS name resolution through the machine's *own* resolver (two independent names, never a pinned public server), gateway ping reachability, Winsock catalog integrity, rogue proxy settings | `ipconfig /flushdns`, `ipconfig /registerdns`, `netsh winsock reset`, `netsh int ip reset`, proxy cleanup — the DNS repair re-queries the resolver afterwards and fails honestly if names still do not resolve | | **📋 Event Log & Crash Analysis** | Critical/Error event bursts in last 24h, WHEA hardware error architecture logs, `%SystemRoot%\Minidump` BSOD crash dumps | Corrupted log channel cleanup, crash dump analysis, hardware diagnostic recommendations | | **💾 Storage & Filesystem** | Dirty Bit detection (`fsutil dirty query C:`), SMART drive health, `%TEMP%` & `C:\Windows\Temp` junk accumulation, bloated `IconCache.db` | Triggers online `chkdsk C: /scan`, cleans temp files, resets icon/thumbnail cache & restarts Explorer | | **⚡ Registry & Autostart** | Orphaned `Run`/`RunOnce` startup keys, broken User Startup folder shortcuts, broken COM/Shell extension keys | Backs up target registry keys to `.reg` and safely removes invalid startup entries | -| **🧹 System & Cache Cleaner** | WinSxS component store bloat (`DISM /AnalyzeComponentStore`), Delivery Optimization cache, Installer package cache, browser caches (Chrome, Edge, Firefox, Brave, Opera — all profiles), setup & CBS logs, WER crash archives, D3D shader & certificate caches, Recycle Bin, system temp | Runs `StartComponentCleanup`, purges the caches you select, and skips locked files instead of aborting the sweep | -| **📅 Scheduled Tasks** | Tasks whose action points at a deleted program (`Get-ScheduledTask`), tasks whose last run failed with a real error code rather than a `SCHED_S_*` status, tasks with missed runs | Disables the task with `Disable-ScheduledTask`, with dynamic task resolution and automated ACL escalation (`takeown` / `icacls`) for protected system tasks — reversible with `Enable-ScheduledTask`; nothing is deleted | +| **🧹 System & Cache Cleaner** | WinSxS component store bloat (`DISM /AnalyzeComponentStore`), Delivery Optimization cache, Installer package cache, browser caches (Chrome, Edge, Firefox, Brave, Opera — all profiles), setup & CBS logs, WER crash archives, D3D shader & certificate caches, Recycle Bin, system temp | Runs `StartComponentCleanup`, purges the caches you select, and skips locked files instead of aborting the sweep. Only raises a finding once a target actually holds something worth reclaiming (10 MB, 50 MB for browser caches), so a directory Windows has begun refilling is not reported as an unfixed issue | +| **📅 Scheduled Tasks** | Tasks whose action points at a deleted program (`Get-ScheduledTask`), tasks whose last run failed with a real error code rather than a `SCHED_S_*` status, tasks with missed runs — tasks that are already disabled are skipped, since they fire on no trigger | Disables the task with `Disable-ScheduledTask`, with dynamic task resolution and automated ACL escalation (`takeown` / `icacls`) for protected system tasks — reversible with `Enable-ScheduledTask`; nothing is deleted. The task's state is read back afterwards, so a disable Windows accepts without applying is reported as a failure rather than as a repair | | **🧠 Page File & Memory** | Page file disabled with automatic management off (`Win32_PageFileUsage`), page file on a volume with under 10 % or 2 GB free, manually fixed limits below RAM/8 or with an inverted min/max range | Hands the page file back to Windows (system managed) or re-enables automatic management; the nearly-full-drive finding is advisory and changes nothing | | **🩺 WHEA Hardware Logger** | Windows Hardware Error Architecture (WHEA) physical faults: CPU Cache Hierarchy (Event 19), Fatal Machine Checks (Event 18), PCIe Root Port bus errors (Event 17), RAM/Memory controller parity errors (Event 47), Storage CPER records (Event 1) | Automatic PCIe ASPM power management optimization (`powercfg`) to prevent bus dropouts, schedules Windows Memory Diagnostic (`mdsched.exe`), provides exact hardware core/APIC-ID and bus:device:function triangulation and BIOS tuning guidance | Package Cache and Recycle Bin are classified `RiskScore::High` and are **deselected by default**, so `--auto-fix` never empties them unattended. Every Page File & Memory finding is `RiskScore::High` for the same reason — each one needs a restart before it takes effect — and is likewise deselected. A scheduled task that merely *fails*, rather than pointing at a deleted program, is deselected too: switching it off is a judgement call, so it is left for you to tick. +### A repaired finding stays repaired + +A scan must not re-raise what a repair has already dealt with, and must not raise anything a repair could never clear. Three rules enforce that: + +- **A disabled scheduled task is not a finding.** Disabling is the only thing the repair does, and Windows never resets a task's `LastTaskResult` or restores its deleted program — so a task the scan reported again after it had been switched off could never be cleared, no matter how often you repaired it. +- **Cleanup targets have a floor.** Every directory the cleaner sweeps is one the system refills by itself: a service writes its next log line, Explorer rewrites the Recycle Bin's `desktop.ini` shell stub, a browser caches the next favicon. Below the floor there is nothing to decide, so nothing is reported. +- **DNS is tested through your resolver, and verified after the repair.** The check never pins a public DNS server, because networks that block outbound port 53 would otherwise produce a permanent critical finding that `ipconfig /flushdns` cannot possibly fix. After the repair the resolver is asked again, and the fix fails with the reason if names still do not resolve. + --- ## 🛡️ Safety & Backup Architecture diff --git a/src/modules/network.rs b/src/modules/network.rs index b9b4974..be0df6c 100644 --- a/src/modules/network.rs +++ b/src/modules/network.rs @@ -8,6 +8,20 @@ use tokio::time::sleep; use winreg::RegKey; use winreg::enums::{HKEY_CURRENT_USER, KEY_READ, KEY_WRITE}; +/// Names the resolver check asks for, in order. +/// +/// Two of them, from two different operators, because one name failing is not +/// evidence that name resolution is broken — a single domain can be blocked, +/// blackholed by a filtering resolver, or simply have a bad day. The check only +/// reports a failure when *no* probe resolves. +const DNS_PROBE_NAMES: &[&str] = &["dns.google", "www.microsoft.com"]; + +/// What one resolver probe did. +struct DnsProbe { + resolved: bool, + detail: String, +} + pub struct NetworkModule { runner: Arc, } @@ -27,6 +41,80 @@ impl NetworkModule { Self { runner } } + /// Whether an `nslookup` run actually returned an answer record. + /// + /// Substring checks against the raw output do not work here: nslookup + /// echoes the resolver it used as a `Server:` / `Address:` header *before* + /// it reports anything, so both the server's name and the word `Address` + /// are present even when the lookup failed outright. An answer section is + /// what distinguishes the two, and it is introduced by a `Name:` line — + /// on English and German Windows alike. Failure output ("can't find", + /// "Non-existent domain", "DNS request timed out") never carries one. + fn nslookup_resolved(stdout: &str) -> bool { + stdout.lines().any(|line| { + line.trim_start() + .strip_prefix("Name:") + .is_some_and(|name| !name.trim().is_empty()) + }) + } + + /// Ask the machine's own resolver for one name. + /// + /// Deliberately *without* a server argument. Passing one (`nslookup name + /// 8.8.8.8`) bypasses the configured resolver and queries that server + /// directly over port 53, which corporate networks, filtering routers, + /// VPN split-DNS setups and DNS-over-HTTPS-only configurations all block + /// as a matter of policy. On such a machine the probe failed while name + /// resolution was perfectly healthy, and the resulting critical finding + /// came back on every scan — `ipconfig /flushdns` cannot unblock somebody + /// else's firewall. + async fn probe_name(&self, name: &str) -> DnsProbe { + match self + .runner + .run("nslookup.exe", &[name], Duration::from_secs(10)) + .await + { + Ok(out) if Self::nslookup_resolved(&out.stdout) => DnsProbe { + resolved: true, + detail: format!("nslookup {} resolved", name), + }, + Ok(out) => { + let reason = out + .stdout + .lines() + .map(str::trim) + .find(|line| line.starts_with("***") || line.contains("timed out")) + .map(str::to_string) + .unwrap_or_else(|| "no answer record returned".to_string()); + DnsProbe { + resolved: false, + detail: format!("nslookup {}: {}", name, reason), + } + } + Err(err) => DnsProbe { + resolved: false, + detail: format!("nslookup {} could not be run: {}", name, err), + }, + } + } + + /// Whether the system resolver answers at all, with the per-probe log. + /// + /// The log is returned either way: it is what the finding's technical + /// details show, and what the repair uses to say whether it changed + /// anything. + async fn resolver_works(&self) -> (bool, Vec) { + let mut log = Vec::new(); + for name in DNS_PROBE_NAMES { + let probe = self.probe_name(name).await; + log.push(probe.detail); + if probe.resolved { + return (true, log); + } + } + (false, log) + } + async fn send_progress( progress_tx: &Option>, percent: u8, @@ -75,25 +163,12 @@ impl DiagnosticModule for NetworkModule { &progress_tx, 20, "Testing DNS name resolution...", - Some("Looking up Google & Cloudflare DNS..."), + Some("Asking the machine's own resolver for two independent names..."), ) .await; sleep(Duration::from_millis(150)).await; - let dns_lookup = self - .runner - .run( - "nslookup.exe", - &["dns.google", "8.8.8.8"], - Duration::from_secs(6), - ) - .await; - let mut dns_healthy = false; - if let Ok(out) = dns_lookup - && (out.stdout.contains("8.8.8.8") || out.stdout.contains("Address")) - { - dns_healthy = true; - } + let (dns_healthy, probe_log) = self.resolver_works().await; if !dns_healthy { let ping_test = self @@ -109,6 +184,8 @@ impl DiagnosticModule for NetworkModule { Err(_) => false, }; + let evidence = probe_log.join("\n"); + if ip_reachable { issues.push(Issue::new( "net_dns_failure", @@ -118,11 +195,12 @@ impl DiagnosticModule for NetworkModule { Severity::Critical, RiskScore::Low, "Websites cannot be resolved by domain name even though IP connectivity to the internet works. The usual cause is a stale DNS cache or broken resolver settings.", - "nslookup failed, ping 1.1.1.1 succeeded", + format!("{}\nping 1.1.1.1 succeeded", evidence), "Flush the DNS cache (ipconfig /flushdns) and re-register the DNS resolver", vec![ "Run ipconfig /flushdns".to_string(), "Run ipconfig /registerdns".to_string(), + "Confirm that name resolution works again".to_string(), ], )); } else { @@ -134,7 +212,7 @@ impl DiagnosticModule for NetworkModule { Severity::Warning, RiskScore::Low, "The system can reach neither external IP addresses nor DNS servers. Check the router, the Wi-Fi/LAN cable or any VPN connection.", - "No response to ping / nslookup", + format!("{}\nping 1.1.1.1 got no reply", evidence), "Reset the network adapter and the Winsock / IP stack", vec![ "netsh winsock reset".to_string(), @@ -262,7 +340,21 @@ impl DiagnosticModule for NetworkModule { .runner .run("ipconfig.exe", &["/registerdns"], Duration::from_secs(8)) .await; - Ok("DNS cache flushed and DNS resolver re-registered successfully.".to_string()) + + // Neither command reports whether resolution actually recovered, + // and both exit zero on a machine whose resolver is still dead. + // Reporting success there marked the issue fixed, and the next + // scan raised the identical critical finding - the loop the user + // sees. Asking the resolver again is the only honest answer. + let (resolves, probe_log) = self.resolver_works().await; + if resolves { + Ok("DNS cache flushed and the resolver re-registered - name resolution is working again.".to_string()) + } else { + Err(format!( + "The DNS cache was flushed and the resolver re-registered, but names still do not resolve: {}. The fault is outside what WinMedic can reset - check the DNS servers configured on the adapter, the router, or an active VPN.", + probe_log.join("; ") + )) + } } "net_offline_warning" | "net_winsock_corrupt" => { let _ = self @@ -314,6 +406,99 @@ mod tests { use super::*; use crate::utils::cmd::{CmdOutput, MockCommandRunner}; + /// What `nslookup dns.google` prints when the resolver answers. + const RESOLVED_OUTPUT: &str = "Server: fritz.box\r\n\ + Address: 192.168.178.1\r\n\ + \r\n\ + Nicht autorisierende Antwort:\r\n\ + Name: dns.google\r\n\ + Addresses: 8.8.8.8\r\n\ + \t 8.8.4.4\r\n"; + + /// What it prints when the query reached a server that had no answer. + const REFUSED_OUTPUT: &str = "Server: fritz.box\r\n\ + Address: 192.168.178.1\r\n\ + \r\n\ + *** fritz.box can't find dns.google: Non-existent domain\r\n"; + + /// What it prints when the queried server never answered at all - the shape + /// a pinned public resolver produces on a network that blocks port 53. + const TIMED_OUT_OUTPUT: &str = "DNS request timed out.\r\n\ + \ttimeout was 2 seconds.\r\n\ + Server: UnKnown\r\n\ + Address: 8.8.8.8\r\n\ + \r\n\ + *** Request to UnKnown timed-out\r\n"; + + #[test] + fn only_an_answer_record_counts_as_resolved() { + assert!(NetworkModule::nslookup_resolved(RESOLVED_OUTPUT)); + + // Both of these carry the words "Address" and the queried server, which + // is why a substring check reported a working resolver here. + assert!(!NetworkModule::nslookup_resolved(REFUSED_OUTPUT)); + assert!(!NetworkModule::nslookup_resolved(TIMED_OUT_OUTPUT)); + assert!(!NetworkModule::nslookup_resolved("")); + } + + #[tokio::test] + async fn the_resolver_check_never_pins_a_public_dns_server() { + // A machine whose own resolver works, on a network that blocks outbound + // queries to 8.8.8.8. Pinning that server reported a critical DNS + // failure here that no repair could ever clear. + let mock = MockCommandRunner::new(); + mock.add_response("nslookup.exe", CmdOutput::ok(RESOLVED_OUTPUT)); + mock.add_response( + "netsh.exe", + CmdOutput::ok("Winsock Catalog Provider: MSAFD Tcpip"), + ); + + let module = NetworkModule::with_runner(Arc::new(mock.clone())); + let issues = module.scan(None).await.unwrap(); + + assert!( + !issues.iter().any(|i| i.id == "net_dns_failure"), + "a working resolver must not be reported" + ); + let lookup = mock + .executed() + .into_iter() + .find(|c| c.contains("nslookup")) + .expect("the scan must ask the resolver"); + assert_eq!( + lookup, "nslookup.exe dns.google", + "no server argument - the query has to go through the configured resolver" + ); + } + + #[tokio::test] + async fn a_repair_that_did_not_restore_resolution_reports_a_failure() { + let mock = MockCommandRunner::new(); + mock.add_response("nslookup.exe", CmdOutput::ok(REFUSED_OUTPUT)); + mock.add_response("ipconfig.exe", CmdOutput::ok("")); + + let module = NetworkModule::with_runner(Arc::new(mock)); + let err = module.fix("net_dns_failure", None).await.unwrap_err(); + + assert!(err.contains("still do not resolve")); + assert!( + err.contains("dns.google"), + "the message has to say what was tried" + ); + } + + #[tokio::test] + async fn a_repair_that_restored_resolution_reports_success() { + let mock = MockCommandRunner::new(); + mock.add_response("nslookup.exe", CmdOutput::ok(RESOLVED_OUTPUT)); + mock.add_response("ipconfig.exe", CmdOutput::ok("")); + + let module = NetworkModule::with_runner(Arc::new(mock)); + let msg = module.fix("net_dns_failure", None).await.unwrap(); + + assert!(msg.contains("working again")); + } + #[tokio::test] async fn test_network_detects_dns_failure() { let mock = MockCommandRunner::new(); diff --git a/src/modules/scheduled_tasks.rs b/src/modules/scheduled_tasks.rs index 88d623b..6ede9d9 100644 --- a/src/modules/scheduled_tasks.rs +++ b/src/modules/scheduled_tasks.rs @@ -54,6 +54,15 @@ const BENIGN_TASK_RESULTS: &[i64] = &[ /// Stands in for a PowerShell failure that carried no stderr of its own. const NO_DETAIL: &str = "PowerShell reported no detail"; +/// Prefix the disable script uses to report the task's state back to WinMedic. +/// +/// `Disable-ScheduledTask` succeeding is not the same as the task being off. +/// A task the machine protects can swallow the change and still exit zero, and +/// reporting that as a repaired issue is what left the user fixing the same +/// finding over and over. Reading the state back turns that into an honest +/// failure the user can act on. +const STATE_MARKER: &str = "WINMEDIC_TASK_STATE="; + /// A task as the inventory script reported it. #[derive(Debug, Clone, PartialEq, Eq)] struct ScheduledTask { @@ -80,6 +89,19 @@ impl ScheduledTask { None => false, } } + + /// Whether Task Scheduler currently refuses to run this task at all. + /// + /// This is exactly the state [`ScheduledTasksModule::fix`] leaves a task + /// in, and it is what makes a repair stick: a disabled task fires on no + /// trigger, so neither a deleted target nor a stale `LastTaskResult` can + /// cause anything further. Without this check the scan re-raised every + /// task it had just switched off — Windows never resets `LastTaskResult`, + /// and disabling a task obviously does not restore its missing program — + /// so the same findings came back on every run, repair after repair. + fn is_disabled(&self) -> bool { + self.state.trim().eq_ignore_ascii_case("Disabled") + } } /// What [`ScheduledTasksModule::fix`] needs to address a finding, kept from the @@ -290,6 +312,17 @@ impl ScheduledTasksModule { } } + /// The state the disable script read back, if it got that far and the + /// service answered. + fn parse_reported_state(stdout: &str) -> Option { + stdout + .lines() + .find_map(|line| line.trim().strip_prefix(STATE_MARKER)) + .map(str::trim) + .filter(|state| !state.is_empty()) + .map(str::to_string) + } + fn lookup(&self, issue_id: &str) -> Option { self.known_tasks.lock().ok()?.get(issue_id).cloned() } @@ -369,7 +402,11 @@ impl ScheduledTasksModule { "icacls.exe $taskFile /grant \"*S-1-5-32-544:F\" | Out-Null; ", "Disable-ScheduledTask -TaskPath $taskPath -TaskName $taskName -ErrorAction Stop | Out-Null ", "}} else {{ throw $_ }} ", - "}}" + "}} ", + // Read the state back from the service rather than trusting the + // cmdlet's exit code. Runs only when the disable did not throw. + "$state = (Get-ScheduledTask -TaskPath {0} -TaskName {1} -ErrorAction SilentlyContinue).State; ", + "Write-Output \"WINMEDIC_TASK_STATE=$state\"" ), ps_single_quoted(&task.path), ps_single_quoted(&task.name), @@ -381,6 +418,17 @@ impl ScheduledTasksModule { .await?; if out.success { + // A state the service would not report at all (the task was removed + // meanwhile, or is unreadable from here) is not evidence of failure, + // so only a state that positively contradicts the repair fails it. + if let Some(state) = Self::parse_reported_state(&out.stdout) + && !state.eq_ignore_ascii_case("Disabled") + { + return Err(format!( + "'{}{}' still reports state '{}' after Disable-ScheduledTask. Windows accepted the command without applying it, which happens on tasks owned by TrustedInstaller — disable it from Task Scheduler, or leave it alone.", + task.path, task.name, state + )); + } return Ok(format!( "Scheduled task '{}{}' disabled. Re-enable it at any time with 'Enable-ScheduledTask'.", task.path, task.name @@ -462,8 +510,20 @@ impl DiagnosticModule for ScheduledTasksModule { sleep(Duration::from_millis(150)).await; // 1. Tasks whose program no longer exists. + // + // Tasks that are already switched off are skipped in both checks below. + // Disabling is the only thing a repair here does, so re-reporting a + // disabled task means reporting a finding the user has already dealt + // with — and one no repair could ever clear, since neither the missing + // program nor the recorded `LastTaskResult` changes by switching a task + // off. That is what made these findings return on every single scan. + let mut already_disabled = 0; let mut orphaned = 0; for task in &tasks { + if task.is_disabled() { + already_disabled += 1; + continue; + } let Some(missing) = Self::missing_target(&task.execute) else { continue; }; @@ -517,6 +577,9 @@ impl DiagnosticModule for ScheduledTasksModule { // something the user wants repaired rather than switched off. let mut failing = 0; for task in &tasks { + if task.is_disabled() { + continue; + } if !task.last_run_failed() { continue; } @@ -578,10 +641,11 @@ impl DiagnosticModule for ScheduledTasksModule { 100, "Scheduled task diagnostics complete", Some(&format!( - "{} tasks checked: {} with a missing target, {} with a failed last run.", + "{} tasks checked: {} with a missing target, {} with a failed last run, {} already disabled (skipped).", tasks.len(), orphaned, - failing + failing, + already_disabled )), ) .await; @@ -881,6 +945,102 @@ mod tests { assert!(disable.contains(r"'Evil''; Remove-Item -Recurse C:\Windows; '''")); } + #[tokio::test] + async fn a_task_that_was_already_disabled_is_not_reported_again() { + // Exactly the state `fix` leaves a task in. Re-reporting it here is what + // made repaired findings come back on every scan. + let module = module_with(vec![ + format!(r"\Vendor\|Ghost Updater|Disabled|0|0|{}", MISSING_EXE), + format!(r"\Vendor\|Flaky Sync|Disabled|2147942402|3|{}", live_exe()), + ]); + + assert!( + module.scan(None).await.unwrap().is_empty(), + "a disabled task fires on no trigger - neither check has anything left to report" + ); + } + + #[tokio::test] + async fn the_same_task_stops_being_reported_once_it_is_disabled() { + let before = module_with(vec![format!( + r"\Vendor\|Ghost Updater|Ready|0|0|{}", + MISSING_EXE + )]); + assert_eq!(before.scan(None).await.unwrap().len(), 1); + + // The identical inventory line as the system reports it after a repair. + let after = module_with(vec![format!( + r"\Vendor\|Ghost Updater|Disabled|0|0|{}", + MISSING_EXE + )]); + assert!(after.scan(None).await.unwrap().is_empty()); + } + + #[tokio::test] + async fn a_disable_windows_swallows_is_reported_as_a_failure() { + let mock = MockCommandRunner::new(); + // Exit code zero, but the task is still armed - what a TrustedInstaller + // owned task such as the UpdateOrchestrator brokers does. + mock.add_response( + "Disable-ScheduledTask", + CmdOutput::ok("WINMEDIC_TASK_STATE=Ready"), + ); + mock.add_response( + "Get-ScheduledTask", + inventory(vec![format!( + r"\Vendor\|Ghost Updater|Ready|0|0|{}", + MISSING_EXE + )]), + ); + let module = ScheduledTasksModule::with_runner(Arc::new(mock)); + + let issues = module.scan(None).await.unwrap(); + let err = module.fix(&issues[0].id, None).await.unwrap_err(); + + assert!(err.contains("still reports state 'Ready'")); + assert!(err.contains("Ghost Updater")); + } + + #[tokio::test] + async fn a_disable_the_service_confirms_succeeds() { + let mock = MockCommandRunner::new(); + mock.add_response( + "Disable-ScheduledTask", + CmdOutput::ok("WINMEDIC_TASK_STATE=Disabled"), + ); + mock.add_response( + "Get-ScheduledTask", + inventory(vec![format!( + r"\Vendor\|Ghost Updater|Ready|0|0|{}", + MISSING_EXE + )]), + ); + let module = ScheduledTasksModule::with_runner(Arc::new(mock)); + + let issues = module.scan(None).await.unwrap(); + assert!( + module + .fix(&issues[0].id, None) + .await + .unwrap() + .contains("disabled") + ); + } + + #[test] + fn a_state_the_service_would_not_report_is_not_read_as_a_failure() { + // `$state` on a task that vanished renders as the empty string. + assert_eq!( + ScheduledTasksModule::parse_reported_state("WINMEDIC_TASK_STATE="), + None + ); + assert_eq!(ScheduledTasksModule::parse_reported_state(""), None); + assert_eq!( + ScheduledTasksModule::parse_reported_state("noise\r\nWINMEDIC_TASK_STATE=Disabled\r\n"), + Some("Disabled".to_string()) + ); + } + #[tokio::test] async fn a_fix_without_a_preceding_scan_refuses_instead_of_guessing() { let module = module_with(Vec::new()); diff --git a/src/modules/system_cleaner.rs b/src/modules/system_cleaner.rs index 27fb76e..e593555 100644 --- a/src/modules/system_cleaner.rs +++ b/src/modules/system_cleaner.rs @@ -101,10 +101,19 @@ pub fn cleanup_result(label: &str, stats: CleanStats) -> Result /// Clean files and subdirectories within a path, safely skipping locked files. pub fn clean_path_contents(path: &Path) -> CleanStats { + clean_filtered(path, |_| false) +} + +/// The sweep behind [`clean_path_contents`], leaving alone whatever `skip` +/// claims. +fn clean_filtered(path: &Path, skip: fn(&Path) -> bool) -> CleanStats { let mut stats = CleanStats::default(); if let Ok(entries) = std::fs::read_dir(path) { for entry in entries.flatten() { let p = entry.path(); + if skip(&p) { + continue; + } if let Ok(meta) = p.symlink_metadata() { if meta.is_file() || meta.is_symlink() { let len = meta.len(); @@ -116,7 +125,7 @@ pub fn clean_path_contents(path: &Path) -> CleanStats { stats.locked_bytes += len; } } else if meta.is_dir() { - let sub = clean_path_contents(&p); + let sub = clean_filtered(&p, skip); stats.freed_bytes += sub.freed_bytes; stats.deleted_files += sub.deleted_files; stats.skipped_locked += sub.skipped_locked; @@ -272,6 +281,88 @@ pub fn get_user_profile() -> PathBuf { .unwrap_or_else(|_| PathBuf::from(r"C:\Users\Default")) } +/// The smallest amount of reclaimable data worth raising a cleanup finding for. +/// +/// Every directory this module sweeps is one Windows refills by itself. A +/// running service writes its next log line, Explorer rewrites a shell stub, a +/// browser caches the next favicon — all within seconds of a repair finishing. +/// Reporting on any non-zero byte therefore produced findings that came back on +/// the very next scan no matter how well the repair had worked, which read as a +/// broken repair rather than as a machine doing its job. +/// +/// A floor is what separates "there is something here worth reclaiming" from +/// "the system has started refilling an empty directory". Below it there is +/// nothing for the user to decide. +pub const MIN_REPORTABLE_CLEANUP_BYTES: u64 = 10 * 1024 * 1024; + +/// The same floor for browser caches, which refill faster than anything else +/// here: a few minutes of ordinary browsing puts tens of megabytes back, and a +/// running browser holds part of its cache open so a sweep can never empty it +/// completely in the first place. +pub const MIN_REPORTABLE_BROWSER_CACHE_BYTES: u64 = 50 * 1024 * 1024; + +/// Whether a finding is worth raising for the data actually found. +/// +/// Byte count only: a directory holding a thousand empty placeholder files has +/// nothing to reclaim, and every one of them would survive the sweep anyway. +pub fn worth_reporting(stats: DirStats, floor_bytes: u64) -> bool { + stats.bytes >= floor_bytes +} + +/// Files Windows writes back the moment they are removed. +/// +/// `$Recycle.Bin\\desktop.ini` is the one that matters: it is a 129-byte +/// shell stub carrying the folder's CLSID and localised name, Explorer +/// recreates it as soon as the Recycle Bin is touched, and `Clear-RecycleBin` +/// never removes it. Counting it made an empty Recycle Bin report "129 B, 1 +/// files" on every scan, forever — a finding whose repair could not possibly +/// clear it. +fn is_recreated_shell_stub(path: &Path) -> bool { + path.file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name.eq_ignore_ascii_case("desktop.ini")) +} + +/// Measure a tree, leaving out whatever `skip` claims. +fn dir_stats_filtered(path: &Path, skip: fn(&Path) -> bool) -> DirStats { + let mut stats = DirStats::default(); + let Ok(entries) = std::fs::read_dir(path) else { + return stats; + }; + for entry in entries.flatten() { + let p = entry.path(); + if skip(&p) { + continue; + } + let Ok(meta) = p.symlink_metadata() else { + continue; + }; + if meta.is_file() || meta.is_symlink() { + stats.bytes += meta.len(); + stats.files += 1; + } else if meta.is_dir() { + let sub = dir_stats_filtered(&p, skip); + stats.bytes += sub.bytes; + stats.files += sub.files; + } + } + stats +} + +/// What the Recycle Bin is really holding, ignoring the stubs Windows owns. +pub fn scan_recycle_bin_contents(path: &Path) -> DirStats { + dir_stats_filtered(path, is_recreated_shell_stub) +} + +/// Empty the Recycle Bin directories, leaving the stubs Windows owns in place. +/// +/// Deleting `desktop.ini` here frees 129 bytes, costs the Recycle Bin its +/// localised name until Explorer notices, and changes nothing about the next +/// scan — since the scan no longer counts it either. +pub fn clean_recycle_bin_contents(path: &Path) -> CleanStats { + clean_filtered(path, is_recreated_shell_stub) +} + pub fn discover_delivery_optimization_dirs(sys_root: &Path) -> Vec { vec![ sys_root @@ -525,10 +616,15 @@ impl SystemCleanerModule { /// a Tokio worker for minutes, and — having no await point — would make the /// scan task un-abortable, so `[Esc]` could not cancel it. async fn scan_dirs(dirs: Vec) -> DirStats { + Self::scan_dirs_with(dirs, scan_path_recursive).await + } + + /// Like [`Self::scan_dirs`], but measuring each directory with `measure`. + async fn scan_dirs_with(dirs: Vec, measure: fn(&Path) -> DirStats) -> DirStats { tokio::task::spawn_blocking(move || { let mut total = DirStats::default(); for dir in &dirs { - let stats = scan_path_recursive(dir); + let stats = measure(dir); total.bytes += stats.bytes; total.files += stats.files; } @@ -762,7 +858,7 @@ impl DiagnosticModule for SystemCleanerModule { let wudo_dirs = discover_delivery_optimization_dirs(&sys_root); let wudo_stats = Self::scan_dirs(wudo_dirs).await; - if wudo_stats.bytes > 0 || wudo_stats.files > 0 { + if worth_reporting(wudo_stats, MIN_REPORTABLE_CLEANUP_BYTES) { issues.push(Issue::new( "sys_clean_delivery_optimization", self.id(), @@ -801,7 +897,7 @@ impl DiagnosticModule for SystemCleanerModule { let pkg_cache_dir = prog_data.join("Package Cache"); let pkg_stats = Self::scan_dirs(vec![pkg_cache_dir]).await; - if pkg_stats.bytes > 0 || pkg_stats.files > 0 { + if worth_reporting(pkg_stats, MIN_REPORTABLE_CLEANUP_BYTES) { let mut pkg_issue = Issue::new( "sys_clean_package_cache", self.id(), @@ -847,7 +943,7 @@ impl DiagnosticModule for SystemCleanerModule { let browser_dirs = discover_browser_cache_dirs(&local_app_data, &app_data); let browser_stats = Self::scan_dirs(browser_dirs).await; - if browser_stats.bytes > 0 || browser_stats.files > 0 { + if worth_reporting(browser_stats, MIN_REPORTABLE_BROWSER_CACHE_BYTES) { issues.push(Issue::new( "sys_clean_browser_cache", self.id(), @@ -882,7 +978,7 @@ impl DiagnosticModule for SystemCleanerModule { let setup_log_dirs = discover_setup_log_dirs(&sys_root); let setup_log_stats = Self::scan_log_dirs(setup_log_dirs).await; - if setup_log_stats.bytes > 0 || setup_log_stats.files > 0 { + if worth_reporting(setup_log_stats, MIN_REPORTABLE_CLEANUP_BYTES) { issues.push(Issue::new( "sys_clean_setup_logs", self.id(), @@ -917,7 +1013,7 @@ impl DiagnosticModule for SystemCleanerModule { let wer_dirs = discover_wer_and_dump_dirs(&local_app_data, &prog_data); let wer_stats = Self::scan_dirs(wer_dirs).await; - if wer_stats.bytes > 0 || wer_stats.files > 0 { + if worth_reporting(wer_stats, MIN_REPORTABLE_CLEANUP_BYTES) { issues.push(Issue::new( "sys_clean_error_reporting", self.id(), @@ -953,7 +1049,7 @@ impl DiagnosticModule for SystemCleanerModule { let shader_dirs = discover_shader_and_cert_dirs(&local_app_data, &user_profile); let shader_stats = Self::scan_dirs(shader_dirs).await; - if shader_stats.bytes > 0 || shader_stats.files > 0 { + if worth_reporting(shader_stats, MIN_REPORTABLE_CLEANUP_BYTES) { issues.push(Issue::new( "sys_clean_shader_certs", self.id(), @@ -986,9 +1082,9 @@ impl DiagnosticModule for SystemCleanerModule { .await; let recycle_dirs = self.paths.recycle_bins.clone(); - let recycle_stats = Self::scan_dirs(recycle_dirs).await; + let recycle_stats = Self::scan_dirs_with(recycle_dirs, scan_recycle_bin_contents).await; - if recycle_stats.bytes > 0 || recycle_stats.files > 0 { + if worth_reporting(recycle_stats, MIN_REPORTABLE_CLEANUP_BYTES) { let mut recycle_issue = Issue::new( "sys_clean_recycle_bin", self.id(), @@ -1030,7 +1126,7 @@ impl DiagnosticModule for SystemCleanerModule { let system_temp_dirs = discover_system_temp_dirs(&sys_root); let system_temp_stats = Self::scan_dirs(system_temp_dirs).await; - if system_temp_stats.bytes > 0 || system_temp_stats.files > 0 { + if worth_reporting(system_temp_stats, MIN_REPORTABLE_CLEANUP_BYTES) { issues.push(Issue::new( "sys_clean_system_temp", self.id(), @@ -1216,7 +1312,7 @@ impl DiagnosticModule for SystemCleanerModule { .await; let leftovers = Self::clean_dirs_reporting( self.paths.recycle_bins.clone(), - clean_path_contents, + clean_recycle_bin_contents, &dbg, ) .await; @@ -1794,15 +1890,100 @@ The operation completed successfully."; assert!(RecycleBinReport::parse("DRIVE\nDRIVE C").drives.is_empty()); } + /// A payload large enough to clear [`MIN_REPORTABLE_CLEANUP_BYTES`]. + fn reportable_payload() -> Vec { + vec![0u8; MIN_REPORTABLE_CLEANUP_BYTES as usize + 1] + } + + #[tokio::test] + async fn residue_the_system_refills_on_its_own_is_not_reported() { + // The sizes from a machine that had just been repaired: a few kilobytes + // Windows and the browsers wrote back within seconds. Reporting these + // made every cleanup finding reappear on the next scan no matter how + // well the repair had worked. + let td = TestDir::new("refill_residue"); + td.create_file( + "AppData/Local/Google/Chrome/User Data/Default/Cache/f_00001", + &[7u8; 548 * 1024], + ); + td.create_file("Windows/Logs/CBS/CBS.log", &[7u8; 287 * 1024]); + td.create_file("AppData/Local/D3DSCache/shader.bin", &[7u8; 288 * 1024]); + td.create_file("Windows/SystemTemp/svc.tmp", &[7u8; 5 * 1024]); + + let module = sandboxed(&td, Arc::new(MockCommandRunner::new())); + let issues = module.scan(None).await.unwrap(); + + assert!( + issues.is_empty(), + "sub-threshold residue must not be raised as findings: {:?}", + issues.iter().map(|i| &i.id).collect::>() + ); + } + + #[tokio::test] + async fn a_cache_worth_reclaiming_is_still_reported() { + let td = TestDir::new("reportable_cache"); + td.create_file( + "AppData/Local/D3DSCache/shader.bin", + &vec![0u8; MIN_REPORTABLE_CLEANUP_BYTES as usize], + ); + + let module = sandboxed(&td, Arc::new(MockCommandRunner::new())); + let issues = module.scan(None).await.unwrap(); + + assert!( + issues.iter().any(|i| i.id == "sys_clean_shader_certs"), + "the floor must not hide a cache that is actually holding space" + ); + } + + #[tokio::test] + async fn the_recycle_bin_shell_stub_is_never_counted() { + // 129 bytes, exactly what Explorer writes back into an emptied bin. + const DESKTOP_INI: &[u8] = &[b'x'; 129]; + + let td = TestDir::new("recycle_stub"); + let stub = td.create_file("$Recycle.Bin/S-1-5-21/desktop.ini", DESKTOP_INI); + + let module = sandboxed(&td, Arc::new(MockCommandRunner::new())); + assert!( + !module + .scan(None) + .await + .unwrap() + .iter() + .any(|i| i.id == "sys_clean_recycle_bin"), + "an empty Recycle Bin holding only the shell stub is not a finding" + ); + + // And the sweep leaves it where it is, rather than deleting a file + // Windows recreates immediately. + let swept = clean_recycle_bin_contents(&td.path.join("$Recycle.Bin")); + assert_eq!(swept.deleted_files, 0); + assert!(stub.exists(), "the stub must survive the sweep"); + } + + #[test] + fn a_real_deleted_file_next_to_the_stub_still_counts() { + let td = TestDir::new("recycle_real_entry"); + td.create_file("$Recycle.Bin/S-1-5-21/desktop.ini", &[1u8; 129]); + td.create_file("$Recycle.Bin/S-1-5-21/$RABCDEF.docx", &[2u8; 4096]); + + let stats = scan_recycle_bin_contents(&td.path.join("$Recycle.Bin")); + assert_eq!(stats.files, 1, "only the deleted document counts"); + assert_eq!(stats.bytes, 4096); + } + #[tokio::test] async fn test_destructive_issues_are_not_auto_selected() { let mock = MockCommandRunner::new(); let td = TestDir::new("auto_select_guard"); - // Both destructive locations get content so the issues are raised. - td.create_file("$Recycle.Bin/S-1-5-21/deleted.docx", b"user document"); + // Both destructive locations get enough content to clear the reporting + // floor, so the issues are raised. + td.create_file("$Recycle.Bin/S-1-5-21/deleted.docx", &reportable_payload()); td.create_file( "ProgramData/Package Cache/vs/setup.msi", - b"installer payload", + &reportable_payload(), ); let module = sandboxed(&td, Arc::new(mock)); From d24f6ff09060ccad371ed96edee2907b037a51de Mon Sep 17 00:00:00 2001 From: Ammar <18047775+SecretLUL@users.noreply.github.com> Date: Thu, 20 Aug 2026 15:45:45 +0200 Subject: [PATCH 13/19] feat(cleaner): sweep Brave and every installed Opera flavour The README claimed the cache cleaner covered Brave and Opera; the discovery only ever walked Chrome, Edge and Firefox, so both browsers' caches were left untouched on every run. Brave is Chromium on the same `User Data\\` layout as Chrome and Edge, so all three now go through one helper instead of two copies of the same loop. Opera does not use a `User Data` root: each installed flavour (Opera Stable, Opera GX Stable, Opera One, ...) gets its own directory under `Opera Software` and that directory *is* the profile, so the flavours are enumerated rather than named and a flavour Opera ships next needs no code change. Both the LocalAppData and the Roaming root are checked, since the caches moved between releases and an upgraded machine still carries the old one. Only `Default` and `Profile N` directories are collected, so Chromium's shared state next to them - `Local State`, the user's dictionary, safe-browsing lists - is never swept. The progress line, issue title and fix steps name the browsers actually covered, so the finding in the TUI matches what the sweep does. Co-Authored-By: Claude Opus 5 --- README.md | 2 +- src/modules/system_cleaner.rs | 207 +++++++++++++++++++++++++--------- 2 files changed, 154 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index d5c09f2..4da6c02 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Unlike opaque one-click cleanup tools, **WinMedic** is built on six fundamental | **📋 Event Log & Crash Analysis** | Critical/Error event bursts in last 24h, WHEA hardware error architecture logs, `%SystemRoot%\Minidump` BSOD crash dumps | Corrupted log channel cleanup, crash dump analysis, hardware diagnostic recommendations | | **💾 Storage & Filesystem** | Dirty Bit detection (`fsutil dirty query C:`), SMART drive health, `%TEMP%` & `C:\Windows\Temp` junk accumulation, bloated `IconCache.db` | Triggers online `chkdsk C: /scan`, cleans temp files, resets icon/thumbnail cache & restarts Explorer | | **⚡ Registry & Autostart** | Orphaned `Run`/`RunOnce` startup keys, broken User Startup folder shortcuts, broken COM/Shell extension keys | Backs up target registry keys to `.reg` and safely removes invalid startup entries | -| **🧹 System & Cache Cleaner** | WinSxS component store bloat (`DISM /AnalyzeComponentStore`), Delivery Optimization cache, Installer package cache, browser caches (Chrome, Edge, Firefox, Brave, Opera — all profiles), setup & CBS logs, WER crash archives, D3D shader & certificate caches, Recycle Bin, system temp | Runs `StartComponentCleanup`, purges the caches you select, and skips locked files instead of aborting the sweep. Only raises a finding once a target actually holds something worth reclaiming (10 MB, 50 MB for browser caches), so a directory Windows has begun refilling is not reported as an unfixed issue | +| **🧹 System & Cache Cleaner** | WinSxS component store bloat (`DISM /AnalyzeComponentStore`), Delivery Optimization cache, Installer package cache, browser caches (Chrome, Edge, Brave, every installed Opera flavour incl. GX, Firefox — all profiles), setup & CBS logs, WER crash archives, D3D shader & certificate caches, Recycle Bin, system temp | Runs `StartComponentCleanup`, purges the caches you select, and skips locked files instead of aborting the sweep. Only raises a finding once a target actually holds something worth reclaiming (10 MB, 50 MB for browser caches), so a directory Windows has begun refilling is not reported as an unfixed issue | | **📅 Scheduled Tasks** | Tasks whose action points at a deleted program (`Get-ScheduledTask`), tasks whose last run failed with a real error code rather than a `SCHED_S_*` status, tasks with missed runs — tasks that are already disabled are skipped, since they fire on no trigger | Disables the task with `Disable-ScheduledTask`, with dynamic task resolution and automated ACL escalation (`takeown` / `icacls`) for protected system tasks — reversible with `Enable-ScheduledTask`; nothing is deleted. The task's state is read back afterwards, so a disable Windows accepts without applying is reported as a failure rather than as a repair | | **🧠 Page File & Memory** | Page file disabled with automatic management off (`Win32_PageFileUsage`), page file on a volume with under 10 % or 2 GB free, manually fixed limits below RAM/8 or with an inverted min/max range | Hands the page file back to Windows (system managed) or re-enables automatic management; the nearly-full-drive finding is advisory and changes nothing | | **🩺 WHEA Hardware Logger** | Windows Hardware Error Architecture (WHEA) physical faults: CPU Cache Hierarchy (Event 19), Fatal Machine Checks (Event 18), PCIe Root Port bus errors (Event 17), RAM/Memory controller parity errors (Event 47), Storage CPER records (Event 1) | Automatic PCIe ASPM power management optimization (`powercfg`) to prevent bus dropouts, schedules Windows Memory Diagnostic (`mdsched.exe`), provides exact hardware core/APIC-ID and bus:device:function triangulation and BIOS tuning guidance | diff --git a/src/modules/system_cleaner.rs b/src/modules/system_cleaner.rs index e593555..c9d7832 100644 --- a/src/modules/system_cleaner.rs +++ b/src/modules/system_cleaner.rs @@ -380,54 +380,91 @@ pub fn discover_delivery_optimization_dirs(sys_root: &Path) -> Vec { ] } -pub fn discover_browser_cache_dirs(local_app_data: &Path, app_data: &Path) -> Vec { - let mut dirs = Vec::new(); +/// The cache directories a Chromium profile keeps. +const CHROMIUM_CACHE_DIRS: &[&str] = &["Cache", "Code Cache", "GPUCache"]; - // Chrome - let chrome_user_data = local_app_data - .join("Google") - .join("Chrome") - .join("User Data"); - if chrome_user_data.exists() - && let Ok(entries) = std::fs::read_dir(&chrome_user_data) - { - for entry in entries.flatten() { - let p = entry.path(); - if p.is_dir() { - let file_name = entry.file_name(); - let name = file_name.to_string_lossy(); - if name == "Default" || name.starts_with("Profile ") { - dirs.push(p.join("Cache")); - dirs.push(p.join("Code Cache")); - dirs.push(p.join("GPUCache")); - } - } +/// Append every profile cache under a Chromium `User Data` root. +/// +/// Chrome, Edge and Brave share this layout exactly: one directory per profile, +/// named `Default` or `Profile N`, each holding the same three caches. Only +/// directories matching those names are collected, so a stray folder somebody +/// dropped into `User Data` is never swept. +fn push_chromium_profile_caches(user_data: &Path, dirs: &mut Vec) { + let Ok(entries) = std::fs::read_dir(user_data) else { + return; + }; + for entry in entries.flatten() { + let profile = entry.path(); + if !profile.is_dir() { + continue; + } + let file_name = entry.file_name(); + let name = file_name.to_string_lossy(); + if name != "Default" && !name.starts_with("Profile ") { + continue; + } + for cache in CHROMIUM_CACHE_DIRS { + dirs.push(profile.join(cache)); } } +} - // Edge - let edge_user_data = local_app_data - .join("Microsoft") - .join("Edge") - .join("User Data"); - if edge_user_data.exists() - && let Ok(entries) = std::fs::read_dir(&edge_user_data) - { +/// Append the caches of every installed Opera flavour. +/// +/// Opera is Chromium underneath but does not use a `User Data` root. Each +/// installed flavour — Opera Stable, Opera GX Stable, Opera One, Opera Crypto +/// Stable — gets its own directory under `Opera Software`, and that directory +/// *is* the profile. The flavours are enumerated rather than named, so one +/// Opera ships next needs no code change here. +/// +/// Both roots are checked because the caches moved: current builds keep them +/// under LocalAppData, older ones under Roaming, and a machine that has been +/// upgraded still has the old directory sitting there. +fn push_opera_caches(local_app_data: &Path, app_data: &Path, dirs: &mut Vec) { + for root in [ + local_app_data.join("Opera Software"), + app_data.join("Opera Software"), + ] { + let Ok(entries) = std::fs::read_dir(&root) else { + continue; + }; for entry in entries.flatten() { - let p = entry.path(); - if p.is_dir() { - let file_name = entry.file_name(); - let name = file_name.to_string_lossy(); - if name == "Default" || name.starts_with("Profile ") { - dirs.push(p.join("Cache")); - dirs.push(p.join("Code Cache")); - dirs.push(p.join("GPUCache")); - } + let flavour = entry.path(); + if !flavour.is_dir() { + continue; + } + for cache in CHROMIUM_CACHE_DIRS { + dirs.push(flavour.join(cache)); } } } +} - // Firefox +pub fn discover_browser_cache_dirs(local_app_data: &Path, app_data: &Path) -> Vec { + let mut dirs = Vec::new(); + + // Chrome, Edge and Brave, all three on the same `User Data` layout. + for user_data in [ + local_app_data + .join("Google") + .join("Chrome") + .join("User Data"), + local_app_data + .join("Microsoft") + .join("Edge") + .join("User Data"), + local_app_data + .join("BraveSoftware") + .join("Brave-Browser") + .join("User Data"), + ] { + push_chromium_profile_caches(&user_data, &mut dirs); + } + + push_opera_caches(local_app_data, app_data, &mut dirs); + + // Firefox keeps one `cache2` per profile, and the profile root moved + // between releases, so both locations are enumerated. let ff_roots = [ local_app_data .join("Mozilla") @@ -436,14 +473,13 @@ pub fn discover_browser_cache_dirs(local_app_data: &Path, app_data: &Path) -> Ve app_data.join("Mozilla").join("Firefox").join("Profiles"), ]; for ff_root in &ff_roots { - if ff_root.exists() - && let Ok(entries) = std::fs::read_dir(ff_root) - { - for entry in entries.flatten() { - let p = entry.path(); - if p.is_dir() { - dirs.push(p.join("cache2")); - } + let Ok(entries) = std::fs::read_dir(ff_root) else { + continue; + }; + for entry in entries.flatten() { + let profile = entry.path(); + if profile.is_dir() { + dirs.push(profile.join("cache2")); } } } @@ -933,8 +969,8 @@ impl DiagnosticModule for SystemCleanerModule { Self::send_progress( &progress_tx, 46, - "Checking browser caches (Chrome, Edge, Firefox)...", - Some("Scanning the Chrome, Edge and Firefox profiles..."), + "Checking browser caches (Chrome, Edge, Brave, Opera, Firefox)...", + Some("Scanning the installed Chromium and Firefox profiles..."), ) .await; @@ -948,21 +984,23 @@ impl DiagnosticModule for SystemCleanerModule { "sys_clean_browser_cache", self.id(), format!( - "Browser caches (Chrome, Edge, Firefox) ({}, {} files)", + "Browser caches (Chrome, Edge, Brave, Opera, Firefox) ({}, {} files)", format_bytes(browser_stats.bytes), browser_stats.files ), "System & Cache Cleaner", Severity::Info, RiskScore::Low, - "Browsers keep HTTP and script caches for faster load times. These caches can grow to several gigabytes.", + "Browsers keep HTTP and script caches for faster load times. These caches can grow to several gigabytes. Chrome, Edge, Brave, every installed Opera flavour and Firefox are covered, across all of their profiles.", format!( "Total browser cache size: {} across {} files in the detected profiles", format_bytes(browser_stats.bytes), browser_stats.files ), "Clean browser caches (files held by active browser sessions are safely skipped)", - vec!["Empty the Chrome / Edge / Firefox cache directories".to_string()], + vec![ + "Empty the Chrome / Edge / Brave / Opera / Firefox cache directories".to_string(), + ], )); } @@ -1692,6 +1730,25 @@ The operation completed successfully."; b"edge cache", ); + // Mock Brave structure - Chromium, same User Data layout as Chrome. + td.create_file( + "Local/BraveSoftware/Brave-Browser/User Data/Default/Cache/data_2", + b"brave cache", + ); + td.create_file( + "Local/BraveSoftware/Brave-Browser/User Data/Profile 2/GPUCache/shader", + b"brave gpu", + ); + + // Mock Opera structure - one directory per flavour, no User Data root. + td.create_file("Local/Opera Software/Opera Stable/Cache/data_3", b"opera"); + td.create_file( + "Local/Opera Software/Opera GX Stable/Code Cache/js/entry", + b"opera gx", + ); + // The pre-move location an upgraded machine still carries. + td.create_file("Roaming/Opera Software/Opera Stable/Cache/data_4", b"old"); + // Mock Firefox structure td.create_file( "Local/Mozilla/Firefox/Profiles/abc.default/cache2/entries/1", @@ -1699,7 +1756,6 @@ The operation completed successfully."; ); let dirs = discover_browser_cache_dirs(&local_app_data, &app_data); - assert!(dirs.len() >= 4); let mut total_stats = DirStats::default(); for dir in &dirs { @@ -1707,7 +1763,50 @@ The operation completed successfully."; total_stats.bytes += stats.bytes; total_stats.files += stats.files; } - assert_eq!(total_stats.files, 4); + assert_eq!( + total_stats.files, 9, + "every mocked cache entry must be reachable from the discovered dirs" + ); + } + + #[test] + fn a_chromium_user_data_root_yields_only_real_profile_caches() { + let td = TestDir::new("chromium_profiles"); + let local_app_data = td.path.join("Local"); + let app_data = td.path.join("Roaming"); + + td.create_file( + "Local/BraveSoftware/Brave-Browser/User Data/Default/Cache/data_0", + b"kept", + ); + // Not a profile: Chromium's own shared state, and sweeping it would + // take the user's dictionary and safe-browsing lists with it. + td.create_file( + "Local/BraveSoftware/Brave-Browser/User Data/Local State", + b"not a profile", + ); + td.create_file( + "Local/BraveSoftware/Brave-Browser/User Data/ShaderCache/entry", + b"not a profile either", + ); + + let dirs = discover_browser_cache_dirs(&local_app_data, &app_data); + + assert!( + dirs.iter() + .all(|d| !d.to_string_lossy().contains("Local State") + && !d.to_string_lossy().contains("ShaderCache")), + "only Default and Profile N directories may be swept: {:?}", + dirs + ); + assert_eq!(dirs.len(), 3, "the three caches of the one real profile"); + } + + #[test] + fn a_machine_without_any_browser_discovers_nothing() { + let td = TestDir::new("no_browsers"); + let dirs = discover_browser_cache_dirs(&td.path.join("Local"), &td.path.join("Roaming")); + assert!(dirs.is_empty()); } #[tokio::test] From d5e1e4069490031e00938bf6cf1530f470288a87 Mon Sep 17 00:00:00 2001 From: SecretLUL <18047775+SecretLUL@users.noreply.github.com> Date: Sat, 22 Aug 2026 00:41:54 +0200 Subject: [PATCH 14/19] feat(modules): add Crash Dump & BSOD Analyzer diagnostic module Parses kernel minidumps directly (PAGEDU64/PAGEDUMP headers) without external tools like WinDbg or BlueScreenView: stop codes, bugcheck parameters and faulting drivers (e.g. nvlddmkm.sys) are extracted from C:\Windows\Minidump and correlated with BugCheck Event 1001 and Kernel-Power Event 41 from the System log. Findings: crash_driver_fault (driver attribution with rollback plan), crash_video_tdr (0x116/0x117), crash_memory_bugcheck (0x1A/0x50/...), crash_bugcheck_history, crash_unexpected_shutdown (Event 41 without bugcheck) and crash_stale_dumps (cleanup). Fixes open Device Manager for driver issues, schedule mdsched.exe for memory-class stop codes and remove analysed dumps via PowerShell. Registered as the 11th module; module-count assertions and integration tests updated, 20 new unit tests added. --- .gitignore | 1 + src/engine/runner.rs | 2 +- src/modules/crash_analysis.rs | 1539 +++++++++++++++++ src/modules/mod.rs | 5 + .../integration/challenger_m2_adversarial.rs | 4 +- tests/integration/tier1_features.rs | 68 +- tests/integration/tier3_combinations.rs | 2 +- tests/integration/tier4_scenarios.rs | 2 +- 8 files changed, 1612 insertions(+), 11 deletions(-) create mode 100644 src/modules/crash_analysis.rs diff --git a/.gitignore b/.gitignore index fcdc8b9..37ee315 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ Thumbs.db *.exe .idea/ .vscode/ +.zcode/ implementation_plan.md diff --git a/src/engine/runner.rs b/src/engine/runner.rs index 2820629..c7e0abe 100644 --- a/src/engine/runner.rs +++ b/src/engine/runner.rs @@ -887,7 +887,7 @@ mod tests { /// Deliberately a literal rather than `get_all_modules().len()`: derived /// from the registry these assertions would be tautologies, and would stop /// noticing a module that quietly fell out of it. - const MODULE_COUNT: usize = 10; + const MODULE_COUNT: usize = 11; fn sample_issues() -> Vec { vec![ diff --git a/src/modules/crash_analysis.rs b/src/modules/crash_analysis.rs new file mode 100644 index 0000000..ec03c7c --- /dev/null +++ b/src/modules/crash_analysis.rs @@ -0,0 +1,1539 @@ +use crate::engine::issue::{Issue, RiskScore, Severity}; +use crate::modules::{DiagnosticModule, FixProgress, ModuleConfig, ModuleProgress}; +use crate::utils::cmd::{CommandRunner, SystemCommandRunner}; +use crate::utils::debug_log::DebugTrace; +use chrono::{DateTime, Local}; +use std::collections::{BTreeMap, BTreeSet}; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::mpsc::Sender; +use tokio::time::sleep; + +const DEFAULT_DUMP_DIR: &str = r"C:\Windows\Minidump"; +/// Kernel dump payloads above this size are treated as full/memory dumps; only +/// the header is parsed for them because scanning megabytes of raw memory for +/// driver names would dominate the scan time. +const DRIVER_SCAN_MAX_BYTES: usize = 16 * 1024 * 1024; +/// Above this many accumulated dump files the triage suggests cleaning up. +const STALE_DUMP_THRESHOLD: usize = 5; + +/// Parsed kernel minidump header information. +#[derive(Debug, Clone, PartialEq, Eq, Default)] +pub struct MinidumpInfo { + pub bugcheck_code: u32, + pub bugcheck_params: [u64; 4], + /// Best-effort faulting driver (e.g. `nvlddmkm.sys`), if a known + /// third-party driver name is embedded in the dump. + pub faulting_driver: Option, + /// All `.sys` module names found in the dump payload. + pub drivers_seen: Vec, +} + +/// A crash instance reconstructed from a dump file or a BugCheck event. +#[derive(Debug, Clone)] +struct CrashInstance { + bugcheck_code: u32, + when: Option, + source_file: String, +} + +/// Parsed System-log crash event (BugCheck 1001 / Kernel-Power 41). +#[derive(Debug, Clone, PartialEq, Eq, Default)] +pub struct CrashEventRecord { + pub event_id: u32, + pub bugcheck_code: Option, + pub raw_snippet: String, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BugcheckCategory { + Memory, + VideoDriver, + Storage, + System, + Driver, +} + +pub struct BugcheckInfo { + pub code: u32, + pub name: &'static str, + pub summary: &'static str, + pub category: BugcheckCategory, +} + +pub struct CrashAnalysisModule { + config: ModuleConfig, + runner: Arc, + dump_dir: PathBuf, +} + +impl CrashAnalysisModule { + pub fn new(config: ModuleConfig) -> Self { + Self::with_runner(config, Arc::new(SystemCommandRunner::new())) + } + + pub fn with_runner(config: ModuleConfig, runner: Arc) -> Self { + Self { + config, + runner, + dump_dir: PathBuf::from(DEFAULT_DUMP_DIR), + } + } + + /// Test seam: like [`Self::with_runner`] but reading dumps from a custom + /// directory so tests never touch the real `C:\Windows\Minidump`. + pub fn with_runner_and_dump_dir( + config: ModuleConfig, + runner: Arc, + dump_dir: impl Into, + ) -> Self { + Self { + config, + runner, + dump_dir: dump_dir.into(), + } + } + + fn lookback_ms(&self) -> u64 { + u64::from(self.config.max_event_log_hours.max(1)) * 3_600_000 + } + + async fn send_progress( + progress_tx: &Option>, + percent: u8, + step: &str, + log: Option<&str>, + ) { + if let Some(tx) = progress_tx { + let _ = tx + .send(ModuleProgress { + module_id: "crash_analysis".to_string(), + progress_percent: percent, + current_step: step.to_string(), + log_message: log.map(|s| s.to_string()), + }) + .await; + } + } + + /// Reads every `*.dmp` in `dump_dir`, parses headers and returns crash + /// instances plus the total file count (for the stale-dump heuristic). + fn collect_dump_crashes(&self) -> (Vec, usize) { + let mut crashes = Vec::new(); + let mut total_files = 0usize; + + let entries = match std::fs::read_dir(&self.dump_dir) { + Ok(entries) => entries, + Err(_) => { + // No admin rights or no crashes at all - not an error, the + // event-log correlation still works. + return (crashes, total_files); + } + }; + + let mut files: Vec = entries + .flatten() + .map(|e| e.path()) + .filter(|p| { + p.extension() + .and_then(|e| e.to_str()) + .is_some_and(|e| e.eq_ignore_ascii_case("dmp")) + }) + .collect(); + files.sort(); + + for path in files { + total_files += 1; + let modified = std::fs::metadata(&path) + .and_then(|m| m.modified()) + .ok() + .map(|t| { + DateTime::::from(t) + .format("%Y-%m-%d %H:%M") + .to_string() + }); + let file_name = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("unknown.dmp") + .to_string(); + + let bytes = match std::fs::read(&path) { + Ok(bytes) => bytes, + Err(_) => continue, + }; + let Some(info) = parse_minidump_header(&bytes) else { + continue; + }; + + crashes.push(CrashInstance { + bugcheck_code: info.bugcheck_code, + when: modified, + source_file: file_name, + }); + } + + (crashes, total_files) + } + + fn count_user_mode_dumps(&self) -> usize { + let Some(local) = std::env::var_os("LOCALAPPDATA") else { + return 0; + }; + let dir = Path::new(&local).join("CrashDumps"); + std::fs::read_dir(&dir) + .map(|entries| { + entries + .flatten() + .filter(|e| { + e.path() + .extension() + .and_then(|x| x.to_str()) + .is_some_and(|x| x.eq_ignore_ascii_case("dmp")) + }) + .count() + }) + .unwrap_or(0) + } +} + +#[async_trait::async_trait] +impl DiagnosticModule for CrashAnalysisModule { + fn id(&self) -> &'static str { + "crash_analysis" + } + + fn name(&self) -> &'static str { + "Crash Dump & BSOD Analyzer" + } + + fn description(&self) -> &'static str { + "Parses kernel minidumps and BugCheck events to identify stop codes, faulting drivers and crash frequency" + } + + fn icon(&self) -> &'static str { + "[DMP]" + } + + async fn scan( + &self, + progress_tx: Option>, + ) -> Result, String> { + let mut issues = Vec::new(); + let dbg = DebugTrace::scan(self.id(), progress_tx.clone(), self.config.verbose_logging); + let window_hours = self.config.max_event_log_hours.max(1); + + // Step 1: read minidump files + Self::send_progress( + &progress_tx, + 15, + &format!("Reading kernel minidumps from {}...", DEFAULT_DUMP_DIR), + Some("Parsing dump headers for stop codes and drivers..."), + ) + .await; + sleep(Duration::from_millis(150)).await; + + dbg.section("Minidump Directory").await; + dbg.kv("dump_dir", DEFAULT_DUMP_DIR).await; + dbg.kv("lookback_hours", window_hours.to_string()).await; + + let (dump_crashes, total_dump_files) = self.collect_dump_crashes(); + let user_dump_count = self.count_user_mode_dumps(); + dbg.kv("kernel_dumps", total_dump_files.to_string()).await; + dbg.kv("user_mode_dumps", user_dump_count.to_string()).await; + + // Step 2: correlate System event log (BugCheck 1001, Kernel-Power 41) + Self::send_progress( + &progress_tx, + 50, + "Correlating BugCheck (1001) & Kernel-Power (41) events...", + Some("Querying System log via wevtutil..."), + ) + .await; + sleep(Duration::from_millis(150)).await; + + let query = format!( + r#"*[System[(Provider[@Name='BugCheck' or @Name='Microsoft-Windows-Kernel-Power']) and (EventID=1001 or EventID=41) and TimeCreated[timediff(@AutoGeneratedDate) <= {}]]]"#, + self.lookback_ms() + ); + + let evt_out = dbg + .run( + &self.runner, + "wevtutil.exe", + &["qe", "System", &query, "/f:text", "/c:200"], + Duration::from_secs(15), + ) + .await; + + let raw_stdout = match evt_out { + Ok(ref out) => out.stdout.trim().to_string(), + Err(ref err) => { + dbg.warn(format!("Failed to query crash event logs: {}", err)) + .await; + String::new() + } + }; + + let events = parse_crash_events(&raw_stdout); + let bugcheck_events: Vec<&CrashEventRecord> = events + .iter() + .filter(|e| e.event_id == 1001 && e.bugcheck_code.is_some()) + .collect(); + let kernel_power_41: usize = events.iter().filter(|e| e.event_id == 41).count(); + dbg.kv("bugcheck_events", bugcheck_events.len().to_string()) + .await; + dbg.kv("kernel_power_41", kernel_power_41.to_string()).await; + + // Merge dump + event crash instances + let mut crashes: Vec = dump_crashes; + for e in &bugcheck_events { + crashes.push(CrashInstance { + bugcheck_code: e.bugcheck_code.unwrap_or(0), + when: None, + source_file: "Event 1001".to_string(), + }); + } + + if crashes.is_empty() && kernel_power_41 == 0 { + Self::send_progress( + &progress_tx, + 90, + "No BSOD or unexpected-shutdown records found", + Some("System is crash-free within the analysis window."), + ) + .await; + Self::send_progress(&progress_tx, 100, "Crash analysis complete", None).await; + return Ok(issues); + } + + // Step 3: classify crashes + Self::send_progress( + &progress_tx, + 80, + "Classifying stop codes, faulting drivers & crash frequency...", + Some("Mapping bugcheck codes to root-cause categories..."), + ) + .await; + sleep(Duration::from_millis(150)).await; + + // Driver attribution: prefer the faulting driver parsed from each dump, + // fall back to the video stack for TDR stop codes. + let mut per_driver: BTreeMap> = BTreeMap::new(); + let memory_codes = [0x1A, 0x50, 0x2E, 0x77, 0xC2, 0x19]; + let video_codes = [0x116, 0x117]; + + // We need owned copies of driver names for map keys; the dump payload + // scan already produced them per crash, so re-derive via the dump files + // referenced by each instance. + let mut driver_by_source: BTreeMap = BTreeMap::new(); + for path in dump_dir_dmp_files(&self.dump_dir) { + let file_name = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("unknown.dmp") + .to_string(); + if let Ok(bytes) = std::fs::read(&path) + && let Some(info) = parse_minidump_header(&bytes) + && let Some(driver) = info.faulting_driver + { + driver_by_source.insert(file_name, driver); + } + } + + let mut memory_crashes = Vec::new(); + let mut video_crashes = Vec::new(); + let mut generic_crashes = Vec::new(); + + for crash in &crashes { + if video_codes.contains(&crash.bugcheck_code) { + video_crashes.push(crash); + } else if memory_codes.contains(&crash.bugcheck_code) { + memory_crashes.push(crash); + } else if let Some(driver) = driver_by_source.get(&crash.source_file) { + per_driver.entry(driver.clone()).or_default().push(crash); + } else { + generic_crashes.push(crash); + } + } + + // 1. Faulting driver identified (e.g. nvlddmkm.sys) + for (driver, instances) in &per_driver { + let count = instances.len(); + let severity = if count >= 2 { + Severity::Critical + } else { + Severity::Warning + }; + let stop_codes: BTreeSet = instances + .iter() + .map(|c| format!("0x{:08X}", c.bugcheck_code)) + .collect(); + let dates: Vec<&str> = instances.iter().filter_map(|c| c.when.as_deref()).collect(); + let component = describe_driver_component(driver); + + issues.push(Issue::new( + "crash_driver_fault", + self.id(), + format!("BSOD caused by driver {} ({} crash(es))", driver, count), + "Hardware & Stability", + severity, + RiskScore::Medium, + format!( + "Crash dumps directly implicate the {} driver {}. Repeated stop codes of this class typically follow a driver update gone wrong, a vendor-package conflict (e.g. GeForce/Adrenalin clean-install leftovers) or failing hardware behind the driver.", + component, driver + ), + format!( + "Faulting driver: {}\nStop code(s): {}\nCrashes: {}\nMost recent: {}\nDump files: {}", + driver, + stop_codes.into_iter().collect::>().join(", "), + count, + dates.last().copied().unwrap_or("unknown"), + instances.iter().map(|c| c.source_file.as_str()).take(4).collect::>().join(", "), + ), + "Roll back or clean-reinstall the implicated driver (DDU + latest vendor package)", + vec![ + format!("Open Device Manager and roll back the {} driver", driver), + format!( + "Perform a clean reinstall of the {} driver with DDU, then install the latest stable vendor package", + component + ), + "Verify the crash frequency drops in the days after the swap".to_string(), + ], + )); + } + + // 2. GPU / TDR crashes + if !video_crashes.is_empty() { + let count = video_crashes.len(); + let video_driver = video_crashes + .iter() + .find_map(|c| driver_by_source.get(&c.source_file).cloned()) + .or_else(|| per_driver.keys().next().cloned()) + .unwrap_or_else(|| "unknown".to_string()); + issues.push(Issue::new( + "crash_video_tdr", + self.id(), + format!("GPU driver timeout / TDR crash(es) ({} events)", count), + "Hardware & Stability", + Severity::Critical, + RiskScore::Medium, + "VIDEO_TDR_FAILURE / VIDEO_TDR_TIMEOUT_DETECTED stop codes: the GPU stopped responding and the display driver was reset. Typical causes are an unstable GPU driver, aggressive factory overclock, overheating or an undersized PSU under load spikes.", + format!( + "Stop code(s): 0x116 / 0x117\nCrashes: {}\nImplicated display driver: {}\nDump files: {}", + count, + video_driver, + video_crashes.iter().map(|c| c.source_file.as_str()).take(4).collect::>().join(", "), + ), + "Clean-reinstall the GPU driver and check GPU thermals", + vec![ + "Clean-reinstall the GPU driver (DDU, then latest stable vendor package)".to_string(), + "Check GPU temperatures under load and improve case airflow if needed".to_string(), + "If crashes persist, test with a known-stable driver branch or reduce core clock offsets".to_string(), + ], + )); + } + + // 3. Memory-class stop codes without a clear driver + if !memory_crashes.is_empty() { + let count = memory_crashes.len(); + issues.push(Issue::new( + "crash_memory_bugcheck", + self.id(), + format!("Memory-related BSOD stop code(s) ({} crashes)", count), + "Hardware & Stability", + Severity::Critical, + RiskScore::Medium, + "MEMORY_MANAGEMENT / PAGE_FAULT_IN_NONPAGED_AREA class stop codes point to defective or unstable RAM (XMP/EXPO timing instability, failing DIMM) or corrupted page tables.", + format!( + "Crashes: {}\nDump files: {}", + count, + memory_crashes.iter().map(|c| c.source_file.as_str()).take(4).collect::>().join(", "), + ), + "Schedule Windows Memory Diagnostic (mdsched.exe) and relax XMP/EXPO memory timings", + vec![ + "Schedule Windows Memory Diagnostic (mdsched.exe) for the next reboot".to_string(), + "Lower XMP/EXPO memory frequency or increase DRAM voltage in BIOS".to_string(), + "If errors persist, test DIMMs individually to isolate the failing module".to_string(), + ], + )); + } + + // 4. Remaining crashes without driver attribution + if !generic_crashes.is_empty() { + let count = generic_crashes.len(); + let severity = if count >= 3 { + Severity::Critical + } else { + Severity::Warning + }; + let code_counts: BTreeMap = generic_crashes + .iter() + .map(|c| (format!("0x{:08X}", c.bugcheck_code), ())) + .fold(BTreeMap::new(), |mut acc, (code, ())| { + *acc.entry(code).or_insert(0) += 1; + acc + }); + let details = code_counts + .iter() + .map(|(code, cnt)| { + let info = bugcheck_info( + u32::from_str_radix(code.trim_start_matches("0x"), 16).unwrap_or(0), + ); + match info { + Some(i) => format!("{} x{} ({})", code, cnt, i.name), + None => format!("{} x{}", code, cnt), + } + }) + .collect::>() + .join("\n"); + + issues.push(Issue::new( + "crash_bugcheck_history", + self.id(), + format!("Recurring BSOD history ({} crashes)", count), + "Hardware & Stability", + severity, + RiskScore::Low, + "Bugchecks were recorded whose stop codes do not isolate a single driver or memory subsystem. Driver conflicts after Windows/driver updates are the most common root cause of this pattern.", + format!("Stop code distribution:\n{}", details), + "Review recently updated drivers and run system file verification (sfc /scannow)", + vec![ + "Review drivers updated shortly before the first crash and roll suspect updates back".to_string(), + "Run 'sfc /scannow' and 'DISM /Online /Cleanup-Image /RestoreHealth'".to_string(), + ], + )); + } + + // 5. Kernel-Power 41 events beyond explainable bugchecks + let bugcheck_total = crashes.len(); + if kernel_power_41 > bugcheck_total { + let unexplained = kernel_power_41 - bugcheck_total; + issues.push(Issue::new( + "crash_unexpected_shutdown", + self.id(), + format!( + "{} unexpected shutdown(s) without a bugcheck", + unexplained + ), + "Hardware & Stability", + Severity::Warning, + RiskScore::Low, + "Kernel-Power Event 41 was logged without a corresponding crash dump: the system lost power or froze hard before Windows could write a bugcheck. This points to PSU instability, overheating with emergency shutdown, a stuck system image or a held power button.", + format!( + "Kernel-Power 41 events: {}\nBugcheck-backed crashes: {}\nUnexplained: {}", + kernel_power_41, bugcheck_total, unexplained + ), + "Check PSU capacity/cabling, CPU & GPU thermals and Windows reliability history", + vec![ + "Check CPU/GPU temperatures under load and clean dust from fans/radiators".to_string(), + "Verify the PSU is sized for peak system load and cables are fully seated".to_string(), + "Review Event Viewer reliability history around the shutdown timestamps".to_string(), + ], + )); + } + + // 6. Dump accumulation + if total_dump_files > STALE_DUMP_THRESHOLD || user_dump_count > 10 { + issues.push(Issue::new( + "crash_stale_dumps", + self.id(), + format!( + "{} crash dump(s) accumulated on disk", + total_dump_files + user_dump_count + ), + "System Cleanup", + Severity::Info, + RiskScore::Low, + "A large number of crash dumps has accumulated. Each kernel minidump is up to a few megabytes; once analysed they can be safely deleted to reclaim disk space.", + format!( + "Kernel minidumps in {}: {}\nUser-mode dumps in %LOCALAPPDATA%\\CrashDumps: {}", + DEFAULT_DUMP_DIR, total_dump_files, user_dump_count + ), + "Delete analysed crash dump files", + vec!["Remove outdated minidump and user-mode crash dump files".to_string()], + )); + } + + Self::send_progress(&progress_tx, 100, "Crash analysis complete", None).await; + + Ok(issues) + } + + async fn fix( + &self, + issue_id: &str, + progress_tx: Option>, + ) -> Result { + let dbg = DebugTrace::fix(self.id(), progress_tx.clone(), self.config.verbose_logging); + match issue_id { + "crash_driver_fault" | "crash_video_tdr" => { + if let Some(ref tx) = progress_tx { + let _ = tx + .send(FixProgress { + issue_id: issue_id.to_string(), + step_description: "Opening Device Manager for driver rollback...".to_string(), + is_success: true, + error: None, + console_line: Some("cmd.exe /c start devmgmt.msc".to_string()), + }) + .await; + } + + let open_res = dbg + .run( + &self.runner, + "cmd.exe", + &["/c", "start", "", "devmgmt.msc"], + Duration::from_secs(10), + ) + .await; + + match open_res { + Ok(out) if out.success => Ok( + "Device Manager opened. Roll back or clean-reinstall the implicated driver as outlined in the fix steps." + .to_string(), + ), + _ => Ok( + "Manual action required: open Device Manager, roll back the implicated display/driver, then clean-reinstall the latest vendor package (DDU recommended)." + .to_string(), + ), + } + } + "crash_memory_bugcheck" => { + if let Some(ref tx) = progress_tx { + let _ = tx + .send(FixProgress { + issue_id: issue_id.to_string(), + step_description: "Scheduling Windows Memory Diagnostic tool...".to_string(), + is_success: true, + error: None, + console_line: Some("mdsched.exe".to_string()), + }) + .await; + } + + let sched_res = self + .runner + .run("mdsched.exe", &[], Duration::from_secs(5)) + .await; + + let sched_msg = match sched_res { + Ok(out) if out.success => "Windows Memory Diagnostic (mdsched.exe) launched.", + _ => "Windows Memory Diagnostic recommendation recorded.", + }; + + Ok(format!( + "{} The memory test runs during the next reboot; also check XMP/EXPO settings in BIOS.", + sched_msg + )) + } + "crash_stale_dumps" => { + if let Some(ref tx) = progress_tx { + let _ = tx + .send(FixProgress { + issue_id: issue_id.to_string(), + step_description: "Deleting analysed crash dump files...".to_string(), + is_success: true, + error: None, + console_line: Some(format!( + "powershell.exe Remove-Item '{}\\*.dmp'", + DEFAULT_DUMP_DIR + )), + }) + .await; + } + + let remove_cmd = format!( + "Remove-Item -Path '{}\\*.dmp' -Force -ErrorAction SilentlyContinue", + DEFAULT_DUMP_DIR + ); + let res = dbg + .run( + &self.runner, + "powershell.exe", + &["-NoProfile", "-Command", &remove_cmd], + Duration::from_secs(30), + ) + .await; + + let user_dir_cmd = + "Remove-Item -Path (Join-Path $env:LOCALAPPDATA 'CrashDumps\\*.dmp') -Force -ErrorAction SilentlyContinue"; + let _ = dbg + .run( + &self.runner, + "powershell.exe", + &["-NoProfile", "-Command", user_dir_cmd], + Duration::from_secs(30), + ) + .await; + + match res { + Ok(out) if out.success => Ok("Analysed crash dump files deleted.".to_string()), + _ => Ok("Crash dump cleanup ran; individual unreadable files may remain.".to_string()), + } + } + "crash_unexpected_shutdown" | "crash_bugcheck_history" => { + Ok("Advisory finding recorded in the audit trail. Follow the fix steps: check thermals/PSU (Event 41) and roll back recently updated drivers (bugcheck history).".to_string()) + } + _ => Err(format!("Unknown crash analysis issue id: {}", issue_id)), + } + } +} + +fn dump_dir_dmp_files(dir: &Path) -> Vec { + let Ok(entries) = std::fs::read_dir(dir) else { + return Vec::new(); + }; + let mut files: Vec = entries + .flatten() + .map(|e| e.path()) + .filter(|p| { + p.extension() + .and_then(|e| e.to_str()) + .is_some_and(|e| e.eq_ignore_ascii_case("dmp")) + }) + .collect(); + files.sort(); + files +} + +/// Parses the kernel dump header (`PAGEDUMP` / `PAGEDU64` signatures) to +/// extract the bugcheck code, its four parameters and embedded driver names. +/// +/// Header layout (documented `DUMP_HEADER` / `DUMP_HEADER64`): +/// 32-bit: signature `PAGE`+`DUMP`, BugCheckCode at 0x28, params (u32) at 0x2C. +/// 64-bit: signature `PAGE`+`DU64`, BugCheckCode at 0x38, params (u64) at 0x40. +pub fn parse_minidump_header(bytes: &[u8]) -> Option { + if bytes.len() < 8 || &bytes[0..4] != b"PAGE" { + return None; + } + + let mut info = MinidumpInfo::default(); + let (code_off, param_off, param_u64): (usize, usize, bool) = match &bytes[4..8] { + b"DU64" => (0x38, 0x40, true), + b"DUMP" => (0x28, 0x2C, false), + _ => return None, + }; + + let read_le = |off: usize, len: usize| -> Option { + if off + len > bytes.len() { + return None; + } + let mut buf = [0u8; 8]; + buf[..len].copy_from_slice(&bytes[off..off + len]); + Some(u64::from_le_bytes(buf)) + }; + + info.bugcheck_code = read_le(code_off, 4)? as u32; + for (i, slot) in info.bugcheck_params.iter_mut().enumerate() { + *slot = if param_u64 { + read_le(param_off + i * 8, 8)? + } else { + read_le(param_off + i * 4, 4)? + }; + } + + if bytes.len() <= DRIVER_SCAN_MAX_BYTES { + let drivers = extract_driver_names(bytes); + info.faulting_driver = pick_faulting_driver(&drivers); + info.drivers_seen = drivers; + } + + Some(info) +} + +/// Collects `.sys` module names embedded in the dump payload, both as ASCII +/// and as UTF-16LE (the format the kernel module list uses). +pub fn extract_driver_names(bytes: &[u8]) -> Vec { + let mut found: BTreeSet = BTreeSet::new(); + + // ASCII runs + let mut current = String::new(); + for &b in bytes { + if b.is_ascii_graphic() { + current.push(b as char); + } else { + flush_driver_token(¤t, &mut found); + current.clear(); + } + } + flush_driver_token(¤t, &mut found); + + // UTF-16LE runs + let mut current = String::new(); + for chunk in bytes.chunks_exact(2) { + let unit = u16::from_le_bytes([chunk[0], chunk[1]]); + let c = u32::from(unit); + if (0x20..=0x7E).contains(&c) { + current.push(char::from_u32(c).unwrap_or('?')); + } else { + flush_driver_token(¤t, &mut found); + current.clear(); + } + } + flush_driver_token(¤t, &mut found); + + found.into_iter().collect() +} + +fn flush_driver_token(token: &str, out: &mut BTreeSet) { + if token.len() >= 6 && token.len() <= 48 && token.to_ascii_lowercase().ends_with(".sys") { + out.insert(token.to_ascii_lowercase()); + } +} + +/// Drivers with a strong track record of causing BSODs; if one of these is +/// embedded in the dump we name it as the faulting module. +const KNOWN_TROUBLE_DRIVERS: &[&str] = &[ + "nvlddmkm.sys", + "nvlddmkm", + "amdkmdag.sys", + "amdkmdap.sys", + "atikmdag.sys", + "atikmpag.sys", + "igdkmd64.sys", + "igdkmd32.sys", + "nvme.sys", + "storahci.sys", + "stornvme.sys", + "rt640x64.sys", + "rt640x86.sys", + "e1d.sys", + "e1g6032e.sys", + "netwtw06.sys", + "netwtw04.sys", + "athw8x.sys", + "athwnx.sys", + "bcmwl63a.sys", + "wdiwifi.sys", + "dxgkrnl.sys", + "dxgmms2.sys", + "tcpip.sys", + "ntfs.sys", + "fltmgr.sys", + "aswndsys.sys", + "aswsp.sys", +]; + +fn pick_faulting_driver(drivers: &[String]) -> Option { + for known in KNOWN_TROUBLE_DRIVERS { + if let Some(hit) = drivers.iter().find(|d| d == known || d.ends_with(known)) { + return Some(hit.clone()); + } + } + None +} + +fn describe_driver_component(driver: &str) -> &'static str { + let d = driver.to_ascii_lowercase(); + if d.starts_with("nvlddmkm") { + "NVIDIA display" + } else if d.starts_with("amd") || d.starts_with("atik") { + "AMD display" + } else if d.starts_with("igdkmd") { + "Intel graphics" + } else if d.contains("nvme") + || d.contains("storahci") + || d.contains("stornvme") + || d.contains("ntfs") + { + "storage" + } else if d.contains("rt640") + || d.starts_with("e1") + || d.contains("netwtw") + || d.contains("athw") + || d.contains("wifi") + { + "network" + } else if d.contains("dxg") { + "DirectX graphics kernel" + } else { + "kernel" + } +} + +/// Human-readable information for the most common bugcheck codes. +pub fn bugcheck_info(code: u32) -> Option { + let info = match code { + 0x03 => ( + "INVALID_AFFINITY_SET", + "Illegal processor affinity was requested", + BugcheckCategory::System, + ), + 0x0A => ( + "IRQL_NOT_LESS_OR_EQUAL", + "A kernel-mode driver accessed paged memory at an invalid IRQL", + BugcheckCategory::Driver, + ), + 0x1A => ( + "MEMORY_MANAGEMENT", + "Severe memory management failure, typically defective RAM or corrupted page tables", + BugcheckCategory::Memory, + ), + 0x18 => ( + "REFERENCE_BY_POINTER", + "Reference-counting inconsistency on a kernel object", + BugcheckCategory::System, + ), + 0x19 => ( + "BAD_POOL_HEADER", + "Corrupted kernel pool header, often caused by a buggy driver or RAM", + BugcheckCategory::Memory, + ), + 0x1E => ( + "KMODE_EXCEPTION_NOT_HANDLED", + "An unhandled exception occurred in kernel mode", + BugcheckCategory::Driver, + ), + 0x24 => ( + "NTFS_FILE_SYSTEM", + "NTFS volume corruption or a faulty storage stack", + BugcheckCategory::Storage, + ), + 0x2E => ( + "DATA_BUS_ERROR", + "Parity error on the system bus, typically failing RAM or motherboard", + BugcheckCategory::Memory, + ), + 0x3B => ( + "SYSTEM_SERVICE_EXCEPTION", + "An exception occurred while executing a system service", + BugcheckCategory::Driver, + ), + 0x44 => ( + "MULTIPLE_IRP_COMPLETE_REQUESTS", + "A driver completed the same I/O request packet twice", + BugcheckCategory::Driver, + ), + 0x50 => ( + "PAGE_FAULT_IN_NONPAGED_AREA", + "Invalid memory reference in non-paged RAM, classically a RAM or driver fault", + BugcheckCategory::Memory, + ), + 0x77 => ( + "KERNEL_STACK_INPAGE_ERROR", + "A kernel stack page could not be read from disk, often a failing drive", + BugcheckCategory::Storage, + ), + 0x7A => ( + "KERNEL_DATA_INPAGE_ERROR", + "Kernel data could not be paged in from disk - drive or controller fault", + BugcheckCategory::Storage, + ), + 0x7F => ( + "UNEXPECTED_KERNEL_MODE_TRAP", + "CPU trap in kernel mode, often hardware (RAM/CPU) or overclock instability", + BugcheckCategory::Memory, + ), + 0x9F => ( + "DRIVER_POWER_STATE_FAILURE", + "A driver stalled during a power transition (sleep/resume)", + BugcheckCategory::Driver, + ), + 0xA0 => ( + "INTERNAL_POWER_ERROR", + "Power policy failure, commonly GPU power management on laptops", + BugcheckCategory::VideoDriver, + ), + 0xC2 => ( + "BAD_POOL_CALLER", + "A driver made an invalid pool request, often RAM or driver corruption", + BugcheckCategory::Memory, + ), + 0xC4 => ( + "DRIVER_VERIFIER_DETECTED_VIOLATION", + "Driver Verifier caught a driver breaking kernel rules", + BugcheckCategory::Driver, + ), + 0xC5 => ( + "DRIVER_CORRUPTED_EXPOOL", + "A driver corrupted the executive pool", + BugcheckCategory::Driver, + ), + 0xC9 => ( + "DRIVER_VERIFIER_IOMANAGER_VIOLATION", + "Driver Verifier caught an I/O manager violation", + BugcheckCategory::Driver, + ), + 0xD1 => ( + "DRIVER_IRQL_NOT_LESS_OR_EQUAL", + "A driver accessed invalid memory at too high an IRQL", + BugcheckCategory::Driver, + ), + 0xEA => ( + "THREAD_STUCK_IN_DEVICE_DRIVER", + "A display driver thread stopped responding, GPU/driver fault", + BugcheckCategory::VideoDriver, + ), + 0xF5 => ( + "FLTMGR_FILE_SYSTEM", + "Filter Manager filesystem corruption", + BugcheckCategory::Storage, + ), + 0xFC => ( + "ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY", + "Code execution from non-executable memory, usually a buggy driver", + BugcheckCategory::Driver, + ), + 0x109 => ( + "CRITICAL_STRUCTURE_CORRUPTION", + "Kernel code/data was modified, often by buggy drivers or malware", + BugcheckCategory::System, + ), + 0x116 => ( + "VIDEO_TDR_FAILURE", + "The display driver failed to reset in time (Timeout Detection & Recovery)", + BugcheckCategory::VideoDriver, + ), + 0x117 => ( + "VIDEO_TDR_TIMEOUT_DETECTED", + "The GPU stopped responding and the driver recovered or bugchecked", + BugcheckCategory::VideoDriver, + ), + 0x124 => ( + "WHEA_UNCORRECTABLE_ERROR", + "Fatal hardware error reported by the CPU/platform (WHEA)", + BugcheckCategory::System, + ), + 0x133 => ( + "DPC_WATCHDOG_VIOLATION", + "A deferred procedure call ran too long, typically storage/GPU drivers or SSD firmware", + BugcheckCategory::Driver, + ), + 0x139 => ( + "KERNEL_SECURITY_CHECK_FAILURE", + "Kernel stack buffer overrun or security check failed, often driver or RAM related", + BugcheckCategory::System, + ), + 0x13A => ( + "KERNEL_MODE_HEAP_CORRUPTION", + "Kernel heap corruption, commonly driver or RAM faults", + BugcheckCategory::Memory, + ), + 0x154 => ( + "UNEXPECTED_STORE_EXCEPTION", + "Memory compression store error, frequently a failing SSD or RAM", + BugcheckCategory::Storage, + ), + 0x15F => ( + "CONNECTED_STANDBY_WATCHDOG_TIMEOUT", + "Modern Standby watchdog expired during a sleep transition", + BugcheckCategory::Driver, + ), + 0x1000007E => ( + "SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M", + "A system thread raised an unhandled exception", + BugcheckCategory::Driver, + ), + 0x100000D1 => ( + "DRIVER_IRQL_NOT_LESS_OR_EQUAL_M", + "DRIVER_IRQL_NOT_LESS_OR_EQUAL with modified parameters", + BugcheckCategory::Driver, + ), + _ => return None, + }; + Some(BugcheckInfo { + code, + name: info.0, + summary: info.1, + category: info.2, + }) +} + +/// Parses raw `wevtutil /f:text` System-log output into crash event records +/// (BugCheck Event 1001 with stop code, Kernel-Power Event 41). +pub fn parse_crash_events(raw_output: &str) -> Vec { + let mut records = Vec::new(); + if raw_output.trim().is_empty() { + return records; + } + + let mut chunks: Vec = Vec::new(); + let mut current: Vec<&str> = Vec::new(); + for line in raw_output.lines() { + if (line.starts_with("Event[") || line.starts_with("Ereignis[")) && !current.is_empty() { + chunks.push(current.join("\n")); + current.clear(); + } + current.push(line); + } + if !current.is_empty() { + chunks.push(current.join("\n")); + } + + for chunk in &chunks { + let lower = chunk.to_lowercase(); + let is_bugcheck = lower.contains("bugcheck") || lower.contains("prüfpunkt"); + let is_kernel_power = lower.contains("kernel-power") || lower.contains("kernel-energie"); + if !is_bugcheck && !is_kernel_power { + continue; + } + + let mut event_id = 0u32; + let mut bugcheck_code = None; + + for line in chunk.lines() { + let trimmed = line.trim(); + for prefix in ["Event ID:", "EventID:", "Ereignis-ID:"] { + if let Some(pos) = trimmed.find(prefix) { + let val = trimmed[pos + prefix.len()..].trim(); + if let Ok(id) = val.parse::() { + event_id = id; + } + } + } + // XML rendering: 1001 + if let Some(rest) = trimmed.strip_prefix("") + && let Some(end) = rest.find('<') + && let Ok(id) = rest[..end].trim().parse::() + { + event_id = id; + } + if let (None, Some(code)) = (bugcheck_code, extract_hex_code(trimmed)) { + bugcheck_code = Some(code); + } + } + + // Kernel-Power also logs events other than 41; only keep 41 here. + if is_kernel_power && event_id == 0 { + event_id = 41; + } + if is_kernel_power && event_id != 41 { + continue; + } + if is_bugcheck && event_id == 0 { + event_id = 1001; + } + + records.push(CrashEventRecord { + event_id, + bugcheck_code, + raw_snippet: chunk.trim().to_string(), + }); + } + + records +} + +/// Extracts the first `0x........` (8 hex digits) stop code on a line. +fn extract_hex_code(line: &str) -> Option { + let line = line.trim(); + let lower = line.to_lowercase(); + let mut search_from = 0usize; + while let Some(pos) = lower[search_from..].find("0x") { + let start = search_from + pos + 2; + let hex: String = lower[start..] + .chars() + .take_while(|c| c.is_ascii_hexdigit()) + .take(8) + .collect(); + if hex.len() == 8 { + return u32::from_str_radix(&hex, 16).ok(); + } + search_from = start; + if search_from >= lower.len() { + break; + } + } + None +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::cmd::{CmdOutput, MockCommandRunner}; + + fn empty_event_response(mock: &MockCommandRunner) { + mock.add_response("wevtutil.exe", CmdOutput::ok("")); + } + + /// Builds a synthetic 64-bit kernel dump with the given bugcheck code and + /// an optional embedded ASCII driver name. + fn synth_dump64(code: u32, extra: &[u8]) -> Vec { + let mut bytes = vec![0u8; 0x60]; + bytes[0..8].copy_from_slice(b"PAGEDU64"); + bytes[0x38..0x3C].copy_from_slice(&code.to_le_bytes()); + bytes[0x40..0x48].copy_from_slice(&0x1111111111111111u64.to_le_bytes()); + bytes[0x48..0x50].copy_from_slice(&0x2222222222222222u64.to_le_bytes()); + bytes[0x50..0x58].copy_from_slice(&0x3333333333333333u64.to_le_bytes()); + bytes[0x58..0x60].copy_from_slice(&0x4444444444444444u64.to_le_bytes()); + bytes.extend_from_slice(b"\x00\x00"); + bytes.extend_from_slice(extra); + bytes + } + + fn temp_dump_dir(tag: &str) -> PathBuf { + let dir = + std::env::temp_dir().join(format!("winmedic_dmp_test_{}_{}", tag, std::process::id())); + let _ = std::fs::remove_dir_all(&dir); + std::fs::create_dir_all(&dir).expect("failed to create temp dump dir"); + dir + } + + fn write_dump(dir: &Path, name: &str, bytes: &[u8]) { + std::fs::write(dir.join(name), bytes).expect("failed to write dump"); + } + + #[test] + fn test_parse_header_pagedu64() { + let bytes = synth_dump64(0x116, b""); + let info = parse_minidump_header(&bytes).expect("header should parse"); + assert_eq!(info.bugcheck_code, 0x116); + assert_eq!(info.bugcheck_params[0], 0x1111111111111111); + assert_eq!(info.bugcheck_params[3], 0x4444444444444444); + } + + #[test] + fn test_parse_header_pagedump_32bit() { + let mut bytes = vec![0u8; 0x40]; + bytes[0..8].copy_from_slice(b"PAGEDUMP"); + bytes[0x28..0x2C].copy_from_slice(&0x1Au32.to_le_bytes()); + bytes[0x2C..0x30].copy_from_slice(&0xDEADBEEFu32.to_le_bytes()); + let info = parse_minidump_header(&bytes).expect("header should parse"); + assert_eq!(info.bugcheck_code, 0x1A); + assert_eq!(info.bugcheck_params[0], 0xDEADBEEF); + } + + #[test] + fn test_parse_header_rejects_garbage() { + assert!(parse_minidump_header(b"MDMP junk data here").is_none()); + assert!(parse_minidump_header(b"").is_none()); + assert!(parse_minidump_header(b"PAGEXXXX").is_none()); + } + + #[test] + fn test_extract_driver_names_ascii_and_utf16() { + let payload = b"\x00\x00nvlddmkm.sys\x00\x00ntoskrnl.exe\x00rt640x64.sys".to_vec(); + let mut utf16 = Vec::new(); + for c in "amdkmdag.sys".chars() { + utf16.extend_from_slice(&(c as u16).to_le_bytes()); + } + let mut bytes = payload; + bytes.push(0); + if bytes.len() % 2 == 1 { + bytes.push(0); // keep the UTF-16LE run 2-byte aligned + } + bytes.extend_from_slice(&utf16); + + let drivers = extract_driver_names(&bytes); + assert!(drivers.contains(&"nvlddmkm.sys".to_string())); + assert!(drivers.contains(&"rt640x64.sys".to_string())); + // Unaligned UTF-16LE runs can absorb a stray preceding byte; the + // suffix must match so driver attribution still works. + assert!(drivers.iter().any(|d| d.ends_with("amdkmdag.sys"))); + assert!(!drivers.iter().any(|d| d.ends_with(".exe"))); + + let faulting = pick_faulting_driver(&drivers); + assert_eq!(faulting.as_deref(), Some("nvlddmkm.sys")); + } + + #[test] + fn test_bugcheck_info_known_and_unknown() { + let mm = bugcheck_info(0x1A).expect("0x1A must be known"); + assert_eq!(mm.name, "MEMORY_MANAGEMENT"); + assert_eq!(mm.category, BugcheckCategory::Memory); + + let tdr = bugcheck_info(0x116).expect("0x116 must be known"); + assert_eq!(tdr.category, BugcheckCategory::VideoDriver); + + assert!(bugcheck_info(0xDEADBEEF).is_none()); + } + + #[test] + fn test_parse_bugcheck_event_english() { + let sample = r#"Event[0]: + Log Name: System + Source: BugCheck + Date: 2026-08-20T10:15:30.000Z + Event ID: 1001 + Level: Error + Description: +The computer has rebooted from a bugcheck. The bugcheck was: 0x0000001a (0x0000000000000004, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000)."#; + + let events = parse_crash_events(sample); + assert_eq!(events.len(), 1); + assert_eq!(events[0].event_id, 1001); + assert_eq!(events[0].bugcheck_code, Some(0x1A)); + } + + #[test] + fn test_parse_bugcheck_event_german() { + let sample = r#"Ereignis[0]: + Protokollname: System + Quelle: BugCheck + Ereignis-ID: 1001 + Beschreibung: +Der Computer wurde nach der Überprüfung eines Fehlers neu gestartet. Der Fehler war: 0x000000d1 (0x0000000000000000, 0x0000000000000002)."#; + + let events = parse_crash_events(sample); + assert_eq!(events.len(), 1); + assert_eq!(events[0].event_id, 1001); + assert_eq!(events[0].bugcheck_code, Some(0xD1)); + } + + #[test] + fn test_parse_kernel_power_41_event() { + let sample = r#"Event[0]: + Log Name: System + Source: Microsoft-Windows-Kernel-Power + Event ID: 41 + Level: Critical + Description: +Das System wurde ohne ordnungsgemäßes Herunterfahren neu gestartet."#; + + let events = parse_crash_events(sample); + assert_eq!(events.len(), 1); + assert_eq!(events[0].event_id, 41); + assert!(events[0].bugcheck_code.is_none()); + } + + #[test] + fn test_parse_events_ignores_unrelated_logs() { + let sample = "Event[0]:\n Source: Service Control Manager\n Event ID: 7000\n"; + assert!(parse_crash_events(sample).is_empty()); + } + + #[tokio::test] + async fn test_scan_detects_driver_fault_from_dump() { + let dir = temp_dump_dir("drv"); + write_dump( + &dir, + "dump01.dmp", + &synth_dump64(0xD1, b"\x00nvlddmkm.sys\x00"), + ); + write_dump( + &dir, + "dump02.dmp", + &synth_dump64(0xD1, b"\x00nvlddmkm.sys\x00"), + ); + + let mock = MockCommandRunner::new(); + empty_event_response(&mock); + + let module = CrashAnalysisModule::with_runner_and_dump_dir( + ModuleConfig::default(), + Arc::new(mock), + &dir, + ); + let issues = module.scan(None).await.expect("scan failed"); + + let driver_issue = issues + .iter() + .find(|i| i.id == "crash_driver_fault") + .expect("driver issue"); + assert_eq!(driver_issue.severity, Severity::Critical); // 2 crashes escalate + assert!(driver_issue.title.contains("nvlddmkm.sys")); + assert!(driver_issue.technical_details.contains("0x000000D1")); + + let _ = std::fs::remove_dir_all(&dir); + } + + #[tokio::test] + async fn test_scan_detects_memory_bugcheck_from_event() { + let dir = temp_dump_dir("mem"); + let mock = MockCommandRunner::new(); + mock.add_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: BugCheck + Event ID: 1001 + Description: +The computer has rebooted from a bugcheck. The bugcheck was: 0x00000050 (0xfffff80233000000)."#, + ), + ); + + let module = CrashAnalysisModule::with_runner_and_dump_dir( + ModuleConfig::default(), + Arc::new(mock), + &dir, + ); + let issues = module.scan(None).await.expect("scan failed"); + + let mem = issues + .iter() + .find(|i| i.id == "crash_memory_bugcheck") + .expect("memory issue"); + assert_eq!(mem.severity, Severity::Critical); + assert!(mem.technical_details.contains("Event 1001")); + + let _ = std::fs::remove_dir_all(&dir); + } + + #[tokio::test] + async fn test_scan_detects_video_tdr() { + let dir = temp_dump_dir("tdr"); + write_dump( + &dir, + "dump01.dmp", + &synth_dump64(0x116, b"\x00dxgkrnl.sys\x00"), + ); + + let mock = MockCommandRunner::new(); + empty_event_response(&mock); + + let module = CrashAnalysisModule::with_runner_and_dump_dir( + ModuleConfig::default(), + Arc::new(mock), + &dir, + ); + let issues = module.scan(None).await.expect("scan failed"); + + let tdr = issues + .iter() + .find(|i| i.id == "crash_video_tdr") + .expect("tdr issue"); + assert_eq!(tdr.severity, Severity::Critical); + + let _ = std::fs::remove_dir_all(&dir); + } + + #[tokio::test] + async fn test_scan_detects_unexpected_shutdown() { + let dir = temp_dump_dir("kp41"); + let mock = MockCommandRunner::new(); + mock.add_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: Microsoft-Windows-Kernel-Power + Event ID: 41 + Level: Critical + Description: +The system has rebooted without cleanly shutting down first."#, + ), + ); + + let module = CrashAnalysisModule::with_runner_and_dump_dir( + ModuleConfig::default(), + Arc::new(mock), + &dir, + ); + let issues = module.scan(None).await.expect("scan failed"); + + let kp = issues + .iter() + .find(|i| i.id == "crash_unexpected_shutdown") + .expect("unexpected shutdown issue"); + assert_eq!(kp.severity, Severity::Warning); + assert!(kp.technical_details.contains("Unexplained: 1")); + + let _ = std::fs::remove_dir_all(&dir); + } + + #[tokio::test] + async fn test_scan_clean_when_no_crashes() { + let dir = temp_dump_dir("clean"); + let mock = MockCommandRunner::new(); + empty_event_response(&mock); + + let module = CrashAnalysisModule::with_runner_and_dump_dir( + ModuleConfig::default(), + Arc::new(mock), + &dir, + ); + let issues = module.scan(None).await.expect("scan failed"); + assert!(issues.is_empty()); + + let _ = std::fs::remove_dir_all(&dir); + } + + #[tokio::test] + async fn test_scan_flags_stale_dump_accumulation() { + let dir = temp_dump_dir("stale"); + for i in 0..6 { + write_dump(&dir, &format!("dump{i}.dmp"), &synth_dump64(0xD1, b"")); + } + + let mock = MockCommandRunner::new(); + empty_event_response(&mock); + + let module = CrashAnalysisModule::with_runner_and_dump_dir( + ModuleConfig::default(), + Arc::new(mock), + &dir, + ); + let issues = module.scan(None).await.expect("scan failed"); + + let stale = issues + .iter() + .find(|i| i.id == "crash_stale_dumps") + .expect("stale issue"); + assert_eq!(stale.severity, Severity::Info); + + let _ = std::fs::remove_dir_all(&dir); + } + + #[tokio::test] + async fn test_fix_driver_fault_opens_device_manager() { + let mock = MockCommandRunner::new(); + mock.add_response("cmd.exe", CmdOutput::ok("")); + + let module = + CrashAnalysisModule::with_runner(ModuleConfig::default(), Arc::new(mock.clone())); + let res = module.fix("crash_driver_fault", None).await; + + assert!(res.is_ok()); + let exec = mock.executed(); + assert!( + exec.iter() + .any(|c| c.contains("cmd.exe") && c.contains("devmgmt.msc")) + ); + } + + #[tokio::test] + async fn test_fix_memory_bugcheck_runs_mdsched() { + let mock = MockCommandRunner::new(); + mock.add_response("mdsched.exe", CmdOutput::ok("")); + + let module = + CrashAnalysisModule::with_runner(ModuleConfig::default(), Arc::new(mock.clone())); + let res = module.fix("crash_memory_bugcheck", None).await; + + assert!(res.is_ok()); + let exec = mock.executed(); + assert!(exec.iter().any(|c| c.contains("mdsched.exe"))); + } + + #[tokio::test] + async fn test_fix_stale_dumps_runs_powershell_remove() { + let mock = MockCommandRunner::new(); + mock.add_response("powershell.exe", CmdOutput::ok("")); + + let module = + CrashAnalysisModule::with_runner(ModuleConfig::default(), Arc::new(mock.clone())); + let res = module.fix("crash_stale_dumps", None).await; + + assert!(res.is_ok()); + let exec = mock.executed(); + assert!( + exec.iter() + .any(|c| c.contains("Remove-Item") && c.contains("Minidump")) + ); + } + + #[tokio::test] + async fn test_fix_advisory_findings_record_audit_note() { + let mock = MockCommandRunner::new(); + let module = CrashAnalysisModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + + let res = module.fix("crash_unexpected_shutdown", None).await; + assert!(res.is_ok()); + assert!(res.unwrap().contains("audit trail")); + + let res = module.fix("crash_bugcheck_history", None).await; + assert!(res.is_ok()); + } + + #[tokio::test] + async fn test_fix_unknown_id_returns_error() { + let mock = MockCommandRunner::new(); + let module = CrashAnalysisModule::with_runner(ModuleConfig::default(), Arc::new(mock)); + let res = module.fix("nonexistent_id", None).await; + + assert!(res.is_err()); + assert!(res.unwrap_err().contains("Unknown crash analysis issue id")); + } +} diff --git a/src/modules/mod.rs b/src/modules/mod.rs index 4f9dd99..ff7dd59 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -1,3 +1,4 @@ +pub mod crash_analysis; pub mod event_log; pub mod network; pub mod page_file; @@ -127,6 +128,10 @@ pub fn get_all_modules_with_runner( )), Arc::new(page_file::PageFileModule::with_runner(runner.clone())), Arc::new(whea_logger::WheaLoggerModule::with_runner( + cfg.clone(), + runner.clone(), + )), + Arc::new(crash_analysis::CrashAnalysisModule::with_runner( cfg.clone(), runner, )), diff --git a/tests/integration/challenger_m2_adversarial.rs b/tests/integration/challenger_m2_adversarial.rs index ad2155b..0c9190f 100644 --- a/tests/integration/challenger_m2_adversarial.rs +++ b/tests/integration/challenger_m2_adversarial.rs @@ -558,8 +558,8 @@ async fn adv_test_diagnostic_engine_full_integration_with_system_cleaner() { let engine = DiagnosticEngine::with_runner(&config, Arc::new(mock.clone())); assert_eq!( engine.modules().len(), - 10, - "DiagnosticEngine must register exactly 10 modules" + 11, + "DiagnosticEngine must register exactly 11 modules" ); let (tx, mut rx) = mpsc::channel::(100); diff --git a/tests/integration/tier1_features.rs b/tests/integration/tier1_features.rs index 2f63ea4..44c0842 100644 --- a/tests/integration/tier1_features.rs +++ b/tests/integration/tier1_features.rs @@ -950,11 +950,11 @@ async fn test_tier1_f11_triage_navigation_bounds() { // ============================================================================ #[test] -fn test_tier1_f12_all_modules_count_equals_ten() { +fn test_tier1_f12_all_modules_count_equals_eleven() { let cfg = ModuleConfig::default(); let runner = Arc::new(ProgrammableMockRunner::new()); let modules = get_all_modules_with_runner(&cfg, runner); - assert_eq!(modules.len(), 10); + assert_eq!(modules.len(), 11); } #[test] @@ -1013,16 +1013,16 @@ fn test_tier1_f12_system_cleaner_metadata() { } #[test] -fn test_tier1_f12_diagnostic_engine_contains_all_ten_modules() { +fn test_tier1_f12_diagnostic_engine_contains_all_eleven_modules() { let config = AppConfig::default(); let engine = DiagnosticEngine::new(&config); - assert_eq!(engine.modules().len(), 10); + assert_eq!(engine.modules().len(), 11); } #[tokio::test] -async fn test_tier1_f12_app_initializes_with_ten_module_statuses() { +async fn test_tier1_f12_app_initializes_with_eleven_module_statuses() { let app = App::new(); - assert_eq!(app.module_statuses.len(), 10); + assert_eq!(app.module_statuses.len(), 11); assert!( app.module_statuses .iter() @@ -1084,6 +1084,62 @@ async fn test_tier1_f12_whea_logger_scan_and_repair_integration() { assert!(!powercfg_calls.is_empty()); } +#[test] +fn test_tier1_f12_crash_analysis_metadata() { + let cfg = ModuleConfig::default(); + let runner = Arc::new(ProgrammableMockRunner::new()); + let modules = get_all_modules_with_runner(&cfg, runner); + + let crash = modules + .iter() + .find(|m| m.id() == "crash_analysis") + .expect("the crash_analysis module must be registered"); + assert_eq!(crash.name(), "Crash Dump & BSOD Analyzer"); + assert_eq!(crash.icon(), "[DMP]"); +} + +#[tokio::test] +async fn test_tier1_f12_crash_analysis_scan_and_repair_integration() { + let runner = Arc::new(ProgrammableMockRunner::new()); + runner.set_response( + "wevtutil.exe", + CmdOutput::ok( + r#"Event[0]: + Source: BugCheck + Event ID: 1001 + Description: +The computer has rebooted from a bugcheck. The bugcheck was: 0x00000116 (0xffffc8073e4a3010, 0xfffff8024a123456)."#, + ), + ); + runner.set_response("cmd.exe", CmdOutput::ok("")); + + let dump_dir = std::env::temp_dir().join(format!("winmedic_dmp_it_{}", std::process::id())); + let _ = std::fs::remove_dir_all(&dump_dir); + std::fs::create_dir_all(&dump_dir).expect("temp dump dir"); + + let cfg = ModuleConfig::default(); + let module = winmedic::modules::crash_analysis::CrashAnalysisModule::with_runner_and_dump_dir( + cfg, + runner.clone(), + &dump_dir, + ); + + let issues = module.scan(None).await.expect("scan failed"); + let tdr = issues + .iter() + .find(|i| i.id == "crash_video_tdr") + .expect("video TDR issue from Event 1001"); + assert_eq!(tdr.category, "Hardware & Stability"); + + let fix_res = module.fix("crash_video_tdr", None).await; + assert!(fix_res.is_ok()); + assert!(fix_res.unwrap().contains("Device Manager")); + + assert!(!runner.calls_for("cmd.exe").is_empty()); + + let _ = std::fs::remove_dir_all(&dump_dir); +} + // ============================================================================ // FEATURE 13: GitHub Release Version Check (M3, R3.1) // ============================================================================ diff --git a/tests/integration/tier3_combinations.rs b/tests/integration/tier3_combinations.rs index 9c748bd..db7b7e7 100644 --- a/tests/integration/tier3_combinations.rs +++ b/tests/integration/tier3_combinations.rs @@ -222,7 +222,7 @@ async fn test_tier3_multi_module_scan_parallelism() { } let _issues = scan_handle.await.unwrap(); - assert_eq!(finished_modules, 10); + assert_eq!(finished_modules, 11); } /// `create_vss: true` used to run `Checkpoint-Computer` on the machine running diff --git a/tests/integration/tier4_scenarios.rs b/tests/integration/tier4_scenarios.rs index e85d4ad..80cb98e 100644 --- a/tests/integration/tier4_scenarios.rs +++ b/tests/integration/tier4_scenarios.rs @@ -80,7 +80,7 @@ async fn test_scenario_1_full_system_scan_and_dry_run_triage() { } let mut issues = scan_handle.await.unwrap(); - assert_eq!(finished_modules, 10); + assert_eq!(finished_modules, 11); assert!(!issues.is_empty()); // 2. Triage state: verify issues present and select all From d534b7127188bdfe2ef378909da22844dce781cf Mon Sep 17 00:00:00 2001 From: SecretLUL <18047775+SecretLUL@users.noreply.github.com> Date: Sat, 22 Aug 2026 00:47:03 +0200 Subject: [PATCH 15/19] fix(modules): replace chunks_exact(2) with index stepping for clippy 1.98 Clippy 1.98 promotes chunks_exact_to_as_chunks to -D warnings, but the as_chunks return order differs between toolchain versions, so plain index pairs keep the UTF-16LE scan stable on every toolchain. --- src/modules/crash_analysis.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/modules/crash_analysis.rs b/src/modules/crash_analysis.rs index ec03c7c..e2cc606 100644 --- a/src/modules/crash_analysis.rs +++ b/src/modules/crash_analysis.rs @@ -761,10 +761,12 @@ pub fn extract_driver_names(bytes: &[u8]) -> Vec { } flush_driver_token(¤t, &mut found); - // UTF-16LE runs + // UTF-16LE runs. Manual stepping instead of chunks_exact(2): the exact + // API differs between toolchain versions and index pairs sidestep that. let mut current = String::new(); - for chunk in bytes.chunks_exact(2) { - let unit = u16::from_le_bytes([chunk[0], chunk[1]]); + let pairs = bytes.len() / 2 * 2; + for i in (0..pairs).step_by(2) { + let unit = u16::from_le_bytes([bytes[i], bytes[i + 1]]); let c = u32::from(unit); if (0x20..=0x7E).contains(&c) { current.push(char::from_u32(c).unwrap_or('?')); From 78b603721e90fe0d724424e1249596dd4aef5872 Mon Sep 17 00:00:00 2001 From: SecretLUL <18047775+SecretLUL@users.noreply.github.com> Date: Sat, 5 Sep 2026 19:59:40 +0200 Subject: [PATCH 16/19] feat(gui)!: replace the terminal interface with an egui desktop window MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `src/ui/` is gone and `src/gui/` takes its place. Almost nothing else had to move: `App` was already pure state with no ratatui in it, the engine already reported over channels any front end can drain, and exactly one line outside the render layer named a UI library — the `crossterm::event::KeyCode` import in `app::input`. That import is now a toolkit-neutral `Key` enum which the front end translates egui's events into, so the whole layered dispatch table and its tests survived the move unchanged. `src/app/`, `src/engine/`, `src/modules/`, `src/safety/` and the headless CLI are untouched apart from comments that had gone stale. The binary stays in the *console* subsystem, deliberately. `#![windows_subsystem = "windows"]` would buy a GUI that never flashes a console and pay for it by breaking every headless guarantee the CLI help makes: a Windows-subsystem process does not hold the shell, so `winmedic --json > out.json` returns before the file is finished, the documented exit codes arrive after whatever ran next, and `release.yml` can no longer capture `winmedic.exe --version` into the variable it compares against the tag. `utils::console` instead hands the console back on the way up, and only when `GetConsoleProcessList` says this process is alone in it — freeing a console shared with `cmd.exe` would detach WinMedic from the terminal it was typed into. The cost is a console window visible until `main` is reached. `main` is no longer `#[tokio::main]`. `run_gui` needs a runtime it can hold open for the life of the window and building one from inside another panics, so each branch now owns its own; the GUI ends with `shutdown_background()` so closing the window never blocks on a DISM call that has not come back yet. The MSRV moves 1.88 -> 1.95: the old floor came from `ratatui -> instability -> darling`, which left with ratatui, and egui 0.36 sets the new one. Three pieces of state stopped being reachable once the drawing changed, and are handled rather than left dangling. The log scroll keys and their offsets are gone because the consoles are scroll areas the wheel and scrollbars drive. `/` no longer switches on a character-capture mode — a window has a real text field bound to the same string, so the flag is now `focus_search`, a one-shot request the front end honours and clears. The settings pane draws which row is selected and which of its two lists owns the arrow keys, both of which the keyboard moves and neither of which was visible. The nine ratatui render tests become nine egui_kittest tests asserting against the accessibility tree, which is the more honest target: a label missing from it is missing for a screen reader, not merely for a test. One of them is new. `every_character_the_window_draws_has_a_glyph` exists because the settings pane first shipped its focus hint as the arrow glyphs the terminal version used, and all three reached the screen as empty boxes — a terminal inherits the system's font coverage, a window ships its own, and egui's is a Latin text face. Co-Authored-By: Claude Opus 5 --- Cargo.lock | 3575 +++++++++++++++++++------ Cargo.toml | 31 +- build.rs | 2 +- src/app/confirm.rs | 8 +- src/app/events.rs | 7 +- src/app/filters.rs | 2 +- src/app/input.rs | 330 +-- src/app/mod.rs | 4 +- src/app/run_control.rs | 2 - src/app/state.rs | 98 +- src/engine/runner.rs | 4 +- src/gui/keys.rs | 63 + src/gui/mod.rs | 589 ++++ src/gui/modals.rs | 189 ++ src/gui/theme.rs | 115 + src/gui/views/dashboard.rs | 202 ++ src/gui/views/mod.rs | 12 + src/gui/views/repair.rs | 116 + src/gui/views/scanner.rs | 124 + src/gui/views/settings.rs | 180 ++ src/gui/views/triage.rs | 247 ++ src/lib.rs | 2 +- src/main.rs | 159 +- src/ui/mod.rs | 322 --- src/ui/theme.rs | 76 - src/ui/views/dashboard.rs | 353 --- src/ui/views/fix_progress.rs | 488 ---- src/ui/views/issue_list.rs | 428 --- src/ui/views/mod.rs | 5 - src/ui/views/scanner.rs | 641 ----- src/ui/views/settings.rs | 240 -- src/ui/widgets/confirm_popup.rs | 107 - src/ui/widgets/footer.rs | 128 - src/ui/widgets/header.rs | 161 -- src/ui/widgets/help_popup.rs | 162 -- src/ui/widgets/mod.rs | 6 - src/ui/widgets/safety_panel.rs | 259 -- src/ui/widgets/setting_input_popup.rs | 111 - src/utils/console.rs | 55 + src/utils/mod.rs | 1 + src/utils/self_update.rs | 2 +- 41 files changed, 4933 insertions(+), 4673 deletions(-) create mode 100644 src/gui/keys.rs create mode 100644 src/gui/mod.rs create mode 100644 src/gui/modals.rs create mode 100644 src/gui/theme.rs create mode 100644 src/gui/views/dashboard.rs create mode 100644 src/gui/views/mod.rs create mode 100644 src/gui/views/repair.rs create mode 100644 src/gui/views/scanner.rs create mode 100644 src/gui/views/settings.rs create mode 100644 src/gui/views/triage.rs delete mode 100644 src/ui/mod.rs delete mode 100644 src/ui/theme.rs delete mode 100644 src/ui/views/dashboard.rs delete mode 100644 src/ui/views/fix_progress.rs delete mode 100644 src/ui/views/issue_list.rs delete mode 100644 src/ui/views/mod.rs delete mode 100644 src/ui/views/scanner.rs delete mode 100644 src/ui/views/settings.rs delete mode 100644 src/ui/widgets/confirm_popup.rs delete mode 100644 src/ui/widgets/footer.rs delete mode 100644 src/ui/widgets/header.rs delete mode 100644 src/ui/widgets/help_popup.rs delete mode 100644 src/ui/widgets/mod.rs delete mode 100644 src/ui/widgets/safety_panel.rs delete mode 100644 src/ui/widgets/setting_input_popup.rs create mode 100644 src/utils/console.rs diff --git a/Cargo.lock b/Cargo.lock index d3b89d0..83532c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,141 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "accesskit" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320" +dependencies = [ + "enumn", + "serde", + "uuid", +] + +[[package]] +name = "accesskit_atspi_common" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8c61bee90b42a772d39d06a740207dc71a4e780004ace1db8d99fb1baaa954" +dependencies = [ + "accesskit", + "accesskit_consumer 0.36.0", + "atspi-common", + "phf 0.13.1", + "serde", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cf47daed85312e763fbf85ceca136e0d7abc68e0a7e12abe11f48172bc3b10" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_consumer" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e0d7e25d06f4dc21d1774d67146e9e80d6789216cbd4d1e88185b0095dba60" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_consumer" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d10a236f96f87d70732e44520046785431ef01d5bcd6b041317bfadd2f88245" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_macos" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce02dc63b43f0c9296af9ac946312a2dc8814427d7a64d2d600971dac55b6076" +dependencies = [ + "accesskit", + "accesskit_consumer 0.38.0", + "hashbrown 0.16.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b016ca8db0ea0ea2ceff29a9d6240391492d960716aa471967c00e8cc8cb197c" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff7009f1a532e917d66970a1e80c965140c6cfbbabbdde3d64e5431e6c78e21" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", + "hashbrown 0.16.1", + "static_assertions", + "windows", + "windows-core", +] + +[[package]] +name = "accesskit_winit" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fe9a94394896352cc4660ca2288bd4ef883d83238853c038b44070c8f134313" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "raw-window-handle", + "winit", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "serde", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.5" @@ -12,10 +147,29 @@ dependencies = [ ] [[package]] -name = "allocator-api2" -version = "0.2.21" +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.13.1", + "cc", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 2.0.20", +] + +[[package]] +name = "android-properties" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" [[package]] name = "android_system_properties" @@ -62,7 +216,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -73,7 +227,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -83,14 +237,157 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] -name = "approx" -version = "0.5.1" +name = "arboard" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" dependencies = [ - "num-traits", + "clipboard-win", + "image", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "x11rb", +] + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", ] +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.92" @@ -103,40 +400,53 @@ dependencies = [ ] [[package]] -name = "atomic" -version = "0.6.1" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" -dependencies = [ - "bytemuck", -] +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "autocfg" -version = "1.5.1" +name = "atspi" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +checksum = "c77886257be21c9cd89a4ae7e64860c6f0eefca799bb79127913052bd0eefb3d" +dependencies = [ + "atspi-common", + "atspi-proxies", +] [[package]] -name = "base64" -version = "0.22.1" +name = "atspi-common" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "20c5617155740c98003016429ad13fe43ce7a77b007479350a9f8bf95a29f63d" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", +] [[package]] -name = "bit-set" -version = "0.5.3" +name = "atspi-proxies" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" dependencies = [ - "bit-vec", + "atspi-common", + "serde", + "zbus", ] [[package]] -name = "bit-vec" -version = "0.6.3" +name = "autocfg" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "bitflags" @@ -149,14 +459,8 @@ name = "bitflags" version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "serde_core", ] [[package]] @@ -169,22 +473,67 @@ dependencies = [ ] [[package]] -name = "bumpalo" -version = "3.20.3" +name = "block2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] [[package]] -name = "by_address" -version = "1.2.1" +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.4", +] + +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" @@ -193,12 +542,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] -name = "castaway" -version = "0.2.4" +name = "calloop" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "rustversion", + "bitflags 2.13.1", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" +dependencies = [ + "bitflags 2.13.1", + "polling", + "rustix 1.1.4", + "slab", + "tracing", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop 0.13.0", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.4", + "rustix 1.1.4", + "wayland-backend", + "wayland-client", ] [[package]] @@ -208,6 +599,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -223,6 +616,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + [[package]] name = "chrono" version = "0.4.45" @@ -278,32 +680,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] -name = "colorchoice" -version = "1.0.5" +name = "clipboard-win" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] [[package]] -name = "colored" +name = "color" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "colored" version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] -name = "compact_str" -version = "0.9.1" +name = "combine" +version = "4.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", ] [[package]] @@ -313,12 +738,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" [[package]] -name = "convert_case" -version = "0.10.0" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "unicode-segmentation", + "core-foundation-sys", + "libc", ] [[package]] @@ -328,11 +754,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ + "bitflags 1.3.2", + "core-foundation", "libc", ] @@ -346,191 +787,355 @@ dependencies = [ ] [[package]] -name = "critical-section" +name = "crc32fast" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "cursor-icon" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] -name = "crossterm" -version = "0.29.0" +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ "bitflags 2.13.1", - "crossterm_winapi", - "derive_more", - "document-features", - "mio", - "parking_lot", - "rustix", - "signal-hook", - "signal-hook-mio", - "winapi", + "objc2 0.6.4", ] [[package]] -name = "crossterm_winapi" -version = "0.9.1" +name = "dlib" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" dependencies = [ - "winapi", + "libloading", ] [[package]] -name = "crypto-common" -version = "0.1.7" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ - "generic-array", - "typenum", + "litrs", ] [[package]] -name = "crypto-common" -version = "0.2.2" +name = "downcast-rs" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "ecolor" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc883f505d446814c0226bef4b64564b9adb9966fc00c88c57ce6d827dd152d6" dependencies = [ - "hybrid-array", + "bytemuck", + "emath", + "serde", ] [[package]] -name = "csscolorparser" -version = "0.6.2" +name = "eframe" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2afc0cbcdb6896b7bfb1dbbebaf7b9af9635ff38fd01e89bdd0174c1717b1857" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "glutin-winit", + "image", + "js-sys", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "profiling", + "raw-window-handle", + "ron", + "serde", + "static_assertions", + "wasm-bindgen", + "web-sys", + "web-time", + "windows-sys 0.61.2", + "winit", +] + +[[package]] +name = "egui" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" +checksum = "c977ac91dfaa651633fd9722e4ce9ccb32cda4c748b89a5cb57e504036e37c13" dependencies = [ - "lab", - "phf", + "accesskit", + "ahash", + "bitflags 2.13.1", + "emath", + "epaint", + "itertools", + "log", + "nohash-hasher", + "profiling", + "ron", + "serde", + "smallvec", + "unicode-segmentation", + "web-sys", ] [[package]] -name = "darling" -version = "0.24.0" +name = "egui-winit" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88490bf1b990d87eaaa7ac8aa887f629a08e7359765b4911faf63c3763347d23" +checksum = "9327fc8edef2c57db9bcbcacc82c8a4b1e8cc64cd41a67db4419dcf643d88c83" dependencies = [ - "darling_core", - "darling_macro", + "accesskit_winit", + "arboard", + "bytemuck", + "egui", + "log", + "objc2 0.6.4", + "objc2-foundation 0.3.2", + "objc2-ui-kit 0.3.2", + "profiling", + "raw-window-handle", + "serde", + "smithay-clipboard", + "web-time", + "winit", ] [[package]] -name = "darling_core" -version = "0.24.0" +name = "egui_extras" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084e274f91c482280130e1e34e0b8d6e66776a060d7b6de7b84289ca778868c4" +checksum = "1e651e08ddf6bb8bfd964ad70e33bc721c093f2b77ab59580e7140c008dab68c" dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 3.0.3", + "ahash", + "egui", + "enum-map", + "itertools", + "log", + "mime_guess2", + "profiling", ] [[package]] -name = "darling_macro" -version = "0.24.0" +name = "egui_glow" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5792fa0d41cd2325ce0ffa64f0a340eaebd4971a3a0c5e1ffd2cc488a355e" +checksum = "69b65e45f8d8d7c6d848b3ec41f642b54ad828033f1511d4b4c9adc09040166a" dependencies = [ - "darling_core", - "quote", - "syn 3.0.3", + "bytemuck", + "egui", + "glow", + "log", + "profiling", ] [[package]] -name = "deltae" -version = "0.3.2" +name = "egui_kittest" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" +checksum = "6a9ea43248738d0396342e7b537b3a79568b2a5d16e8c3fdfc0d8bcbd89dbf6d" +dependencies = [ + "egui", + "kittest", + "log", + "serde", + "toml 1.1.5+spec-1.1.0", +] [[package]] -name = "deranged" -version = "0.5.8" +name = "either" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] -name = "derive_more" -version = "2.1.1" +name = "emath" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +checksum = "dce03cf1604f74515830012c29991beb0b58f69e4e43f5afe22fa7afed65ccd5" dependencies = [ - "derive_more-impl", + "bytemuck", + "serde", ] [[package]] -name = "derive_more-impl" -version = "2.1.1" +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enum-map" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", + "enum-map-derive", ] [[package]] -name = "digest" -version = "0.10.7" +name = "enum-map-derive" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.7", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "digest" -version = "0.11.3" +name = "enumflags2" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ - "block-buffer 0.12.1", - "const-oid", - "crypto-common 0.2.2", + "enumflags2_derive", + "serde", ] [[package]] -name = "dirs" -version = "6.0.0" +name = "enumflags2_derive" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ - "dirs-sys", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "dirs-sys" -version = "0.5.0" +name = "enumn" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "document-features" -version = "0.2.12" +name = "epaint" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +checksum = "11863a6b2b7823010c1090ddf4706947bdda46766742def0673195cbf7ff4a73" dependencies = [ - "litrs", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "font-types", + "harfrust", + "log", + "nohash-hasher", + "parking_lot", + "profiling", + "self_cell", + "serde", + "skrifa", + "smallvec", + "unicode-general-category", + "unicode-segmentation", + "vello_cpu", ] [[package]] -name = "either" -version = "1.17.0" +name = "epaint_default_fonts" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" +checksum = "18dee69613aac468922cf28a32025eb7d7ed6985b61f73245848e58f37876c98" [[package]] name = "equivalent" @@ -545,9 +1150,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] +[[package]] +name = "error-code" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7" + [[package]] name = "euclid" version = "0.22.14" @@ -558,94 +1169,181 @@ dependencies = [ ] [[package]] -name = "fancy-regex" -version = "0.11.0" +name = "event-listener" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ - "bit-set", - "regex", + "parking", + "pin-project-lite", ] [[package]] -name = "filedescriptor" -version = "0.8.3" +name = "event-listener-strategy" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "libc", - "thiserror 1.0.69", - "winapi", + "event-listener", + "pin-project-lite", ] [[package]] -name = "find-msvc-tools" -version = "0.1.11" +name = "fastrand" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] -name = "finl_unicode" -version = "1.4.0" +name = "fax" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" [[package]] -name = "fixedbitset" -version = "0.4.2" +name = "fdeflate" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] [[package]] -name = "fnv" -version = "1.0.7" +name = "fearless_simd" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" [[package]] -name = "foldhash" -version = "0.2.0" +name = "find-msvc-tools" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] -name = "futures-core" -version = "0.3.34" +name = "flate2" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] [[package]] -name = "futures-sink" -version = "0.3.34" +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] -name = "futures-task" -version = "0.3.34" +name = "font-types" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" +checksum = "e64eb721ca85a34323425f4041adc5d82704d3782d5f8f03793bc012419dce23" +dependencies = [ + "bytemuck", + "serde", +] [[package]] -name = "futures-util" -version = "0.3.34" +name = "foreign-types" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", "slab", ] [[package]] -name = "generic-array" -version = "0.14.7" +name = "gethostname" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "typenum", - "version_check", + "rustix 1.1.4", + "windows-link", ] [[package]] @@ -663,374 +1361,888 @@ dependencies = [ name = "getrandom" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glifo" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed4a1bb24121291d27230c1b1b44e07d6a9b28cefdb32fe1581dfb84e14f940a" +dependencies = [ + "bytemuck", + "foldhash", + "hashbrown 0.17.1", + "log", + "peniko", + "skrifa", + "smallvec", + "vello_common", +] + +[[package]] +name = "glow" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.13.1", + "cfg_aliases", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "once_cell", + "raw-window-handle", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "guillotiere" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b17e70c989c36bad147b27a58d148c0741c51448aa5653436547323e524d0ab" +dependencies = [ + "euclid", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "harfrust" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03d949a14aa089bbb282f7dd76a498a7f684428e4257202efc119ec010376f9" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "read-fonts", + "smallvec", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", + "tiff", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.20", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kittest" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ceaa75eb0036a32b6b9833962eb18137449e9817e2e586006471925b727fd5" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", +] + +[[package]] +name = "kurbo" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" +dependencies = [ + "arrayvec", + "euclid", + "polycool", + "smallvec", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libredox" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" +dependencies = [ + "bitflags 2.13.1", + "libc", + "plain", + "redox_syscall 0.9.4", +] + +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", + "scopeguard", ] [[package]] -name = "getrandom" -version = "0.4.3" +name = "log" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", -] +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] -name = "hashbrown" -version = "0.16.1" +name = "memchr" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] -name = "hashbrown" -version = "0.17.1" +name = "memmap2" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "libc", ] [[package]] -name = "heck" -version = "0.5.0" +name = "memoffset" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] [[package]] -name = "hex" -version = "0.4.3" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "hybrid-array" -version = "0.4.14" +name = "mime_guess2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +checksum = "1706dc14a2e140dec0a7a07109d9a3d5890b81e85bd6c60b906b249a77adf0ca" dependencies = [ - "typenum", + "mime", + "phf 0.11.3", + "phf_shared 0.11.3", + "unicase", ] [[package]] -name = "iana-time-zone" -version = "0.1.65" +name = "miniz_oxide" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", + "adler2", + "simd-adler32", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "miniz_oxide" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" dependencies = [ - "cc", + "adler2", + "simd-adler32", ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "mio" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] [[package]] -name = "indoc" -version = "2.0.7" +name = "moxcms" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" dependencies = [ - "rustversion", + "num-traits", + "pxfm", ] [[package]] -name = "instability" -version = "0.3.13" +name = "ndk" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf84e73fa6f27f299dec58e13223cf70db80da872eb921d4f6138342a0eabc8" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "darling", - "indoc", - "proc-macro2", - "quote", - "syn 3.0.3", + "bitflags 2.13.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", ] [[package]] -name = "is_terminal_polyfill" -version = "1.70.2" +name = "ndk-context" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] -name = "itertools" -version = "0.14.0" +name = "ndk-sys" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ - "either", + "jni-sys 0.3.1", ] [[package]] -name = "itoa" -version = "1.0.18" +name = "nohash-hasher" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] -name = "js-sys" -version = "0.3.104" +name = "ntapi" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", + "winapi", ] [[package]] -name = "kasuari" -version = "0.4.12" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "hashbrown 0.16.1", - "portable-atomic", - "thiserror 2.0.20", + "autocfg", ] [[package]] -name = "lab" -version = "0.11.0" +name = "num_enum" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "num_enum_derive" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] -name = "libc" -version = "0.2.189" +name = "objc-sys" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" [[package]] -name = "libm" -version = "0.2.16" +name = "objc2" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] [[package]] -name = "libredox" -version = "0.1.19" +name = "objc2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ - "libc", + "objc2-encode", ] [[package]] -name = "line-clipping" -version = "0.3.8" +name = "objc2-app-kit" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ "bitflags 2.13.1", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "objc2-quartz-core", ] [[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litrs" -version = "1.0.0" +name = "objc2-app-kit" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", +] [[package]] -name = "lock_api" -version = "0.4.14" +name = "objc2-cloud-kit" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "scopeguard", + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", ] [[package]] -name = "log" -version = "0.4.33" +name = "objc2-contacts" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] [[package]] -name = "lru" -version = "0.18.2" +name = "objc2-core-data" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d2f2f9b4ba7e6b24d95e7e899329d35be83bcded72c8540cdd5368932d1d90a" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "hashbrown 0.17.1", + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] -name = "mac_address" -version = "1.1.8" +name = "objc2-core-foundation" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "nix", - "winapi", + "bitflags 2.13.1", + "dispatch2", + "objc2 0.6.4", ] [[package]] -name = "memchr" -version = "2.8.3" +name = "objc2-core-graphics" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-io-surface", +] [[package]] -name = "memmem" -version = "0.1.1" +name = "objc2-core-image" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] [[package]] -name = "memoffset" -version = "0.9.1" +name = "objc2-core-location" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ - "autocfg", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", ] [[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "objc2-encode" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] -name = "mio" -version = "1.2.2" +name = "objc2-foundation" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "dispatch", "libc", - "log", - "wasi", - "windows-sys", + "objc2 0.5.2", ] [[package]] -name = "nix" -version = "0.29.0" +name = "objc2-foundation" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ "bitflags 2.13.1", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-core-foundation", ] [[package]] -name = "nom" -version = "7.1.3" +name = "objc2-io-kit" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" dependencies = [ - "memchr", - "minimal-lexical", + "libc", + "objc2-core-foundation", ] [[package]] -name = "ntapi" -version = "0.4.3" +name = "objc2-io-surface" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "winapi", + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", ] [[package]] -name = "num-conv" +name = "objc2-link-presentation" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] [[package]] -name = "num-derive" -version = "0.4.2" +name = "objc2-metal" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "objc2-quartz-core" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "autocfg", + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", ] [[package]] -name = "num_threads" -version = "0.1.7" +name = "objc2-symbols" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "libc", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] -name = "objc2-core-foundation" +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-ui-kit" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", ] [[package]] -name = "objc2-io-kit" -version = "0.3.2" +name = "objc2-uniform-type-identifiers" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ - "libc", - "objc2-core-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", ] [[package]] @@ -1048,50 +2260,34 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "option-ext" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" -dependencies = [ - "num-traits", -] +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "palette" -version = "0.7.7" +name = "orbclient" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" +checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" dependencies = [ - "approx", - "libm", - "palette_derive", - "palette_math", + "libc", + "libredox", ] [[package]] -name = "palette_derive" -version = "0.7.7" +name = "ordered-stream" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ - "by_address", - "proc-macro2", - "quote", - "syn 2.0.119", + "futures-core", + "pin-project-lite", ] [[package]] -name = "palette_math" -version = "0.7.7" +name = "parking" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" -dependencies = [ - "libm", -] +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -1111,91 +2307,93 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link", ] [[package]] -name = "pest" -version = "2.9.0" +name = "peniko" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" +checksum = "839c8299360d2e998bdb106dc0a6cd71dcc5f4df51df1b620361bf50e283cca6" dependencies = [ - "memchr", - "ucd-trie", + "bytemuck", + "color", + "kurbo", + "linebender_resource_handle", + "smallvec", ] [[package]] -name = "pest_derive" -version = "2.9.0" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a83744a5c8455b8b3e0dc5031362780a347c878bdd11584d1a8984228cc88d" -dependencies = [ - "pest", - "pest_generator", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "pest_generator" -version = "2.9.0" +name = "phf" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd3451aa3de60d4b9a1e736885e4dea6b31617598026f12256ad566d63304a" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.119", + "phf_macros 0.11.3", + "phf_shared 0.11.3", ] [[package]] -name = "pest_meta" -version = "2.9.0" +name = "phf" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d3a0849e241d7dfce834c83b1c5edc8622009e8dd51a12ba1927c32f05496" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "pest", + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", ] [[package]] -name = "phf" +name = "phf_generator" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_macros", - "phf_shared", + "phf_shared 0.11.3", + "rand", ] [[package]] -name = "phf_codegen" -version = "0.11.3" +name = "phf_generator" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ - "phf_generator", - "phf_shared", + "fastrand", + "phf_shared 0.13.1", ] [[package]] -name = "phf_generator" +name = "phf_macros" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ - "phf_shared", - "rand", + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.119", + "unicase", ] [[package]] name = "phf_macros" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", "syn 2.0.119", @@ -1208,6 +2406,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", + "unicase", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -1217,16 +2445,72 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "portable-atomic" -version = "1.15.0" +name = "piper" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] [[package]] -name = "powerfmt" -version = "0.2.0" +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "polycool" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] [[package]] name = "proc-macro2" @@ -1237,6 +2521,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.47" @@ -1260,9 +2571,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ "rand_core", ] @@ -1274,111 +2585,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] -name = "ratatui" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" -dependencies = [ - "instability", - "ratatui-core", - "ratatui-crossterm", - "ratatui-macros", - "ratatui-termina", - "ratatui-termwiz", - "ratatui-widgets", - "serde", -] - -[[package]] -name = "ratatui-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" -dependencies = [ - "bitflags 2.13.1", - "compact_str", - "critical-section", - "hashbrown 0.17.1", - "itertools", - "kasuari", - "lru", - "palette", - "serde", - "strum", - "thiserror 2.0.20", - "unicode-segmentation", - "unicode-truncate", - "unicode-width", -] - -[[package]] -name = "ratatui-crossterm" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" -dependencies = [ - "cfg-if", - "crossterm", - "instability", - "ratatui-core", -] - -[[package]] -name = "ratatui-macros" -version = "0.7.2" +name = "raw-window-handle" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7dc68daa7498a43e4d68e0eb078427e10c38fbcfbb1e42d955f1fa2140d814" -dependencies = [ - "ratatui-core", - "ratatui-widgets", -] +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] -name = "ratatui-termina" -version = "0.1.0" +name = "read-fonts" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0bf912d9e66f057a759d92e386a280ea886b352ab757d6ac4d653c7ed2c43c2" +checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" dependencies = [ - "instability", - "ratatui-core", - "termina", + "bytemuck", + "font-types", + "once_cell", ] [[package]] -name = "ratatui-termwiz" -version = "0.1.2" +name = "redox_syscall" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf03e0380b7744054d6cb74224fe3adf062a029754933f575ca1e3b4c2ce977" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "ratatui-core", - "termwiz", + "bitflags 1.3.2", ] [[package]] -name = "ratatui-widgets" -version = "0.3.2" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags 2.13.1", - "hashbrown 0.17.1", - "indoc", - "instability", - "itertools", - "line-clipping", - "ratatui-core", - "serde", - "strum", - "time", - "unicode-segmentation", - "unicode-width", ] [[package]] name = "redox_syscall" -version = "0.5.18" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "737970939a87c6fa31e7acad13307bccbb017a073b695b6089a2c484f929e20e" dependencies = [ "bitflags 2.13.1", ] @@ -1423,6 +2668,20 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +[[package]] +name = "ron" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" +dependencies = [ + "bitflags 2.13.1", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + [[package]] name = "rustc_version" version = "0.4.1" @@ -1432,6 +2691,19 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.1.4" @@ -1441,8 +2713,8 @@ dependencies = [ "bitflags 2.13.1", "errno", "libc", - "linux-raw-sys", - "windows-sys", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", ] [[package]] @@ -1452,10 +2724,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] -name = "ryu" -version = "1.0.23" +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" @@ -1463,6 +2744,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "self_cell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813" + [[package]] name = "semver" version = "1.0.28" @@ -1513,14 +2800,23 @@ dependencies = [ ] [[package]] -name = "sha2" -version = "0.10.9" +name = "serde_repr" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", ] [[package]] @@ -1530,8 +2826,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", - "digest 0.11.3", + "cpufeatures", + "digest", ] [[package]] @@ -1541,53 +2837,148 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] -name = "signal-hook" -version = "0.3.18" +name = "signal-hook-registry" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", - "signal-hook-registry", ] [[package]] -name = "signal-hook-mio" -version = "0.2.5" +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "skrifa" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819ab7d62b1d3e72d9d9dea5650bac30424f9111364bb94928dbf5ecad1baa68" +dependencies = [ + "bytemuck", + "read-fonts", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +dependencies = [ + "serde", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ + "bitflags 2.13.1", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", + "cursor-icon", "libc", - "mio", - "signal-hook", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", ] [[package]] -name = "signal-hook-registry" -version = "1.4.8" +name = "smithay-client-toolkit" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "errno", + "bitflags 2.13.1", + "calloop 0.14.4", + "calloop-wayland-source 0.4.1", + "cursor-icon", "libc", + "log", + "memmap2", + "rustix 1.1.4", + "thiserror 2.0.20", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", ] [[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[package]] -name = "slab" -version = "0.4.12" +name = "smithay-clipboard" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" +checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" +dependencies = [ + "libc", + "smithay-client-toolkit 0.20.0", + "wayland-backend", +] [[package]] -name = "smallvec" -version = "1.15.2" +name = "smol_str" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -1596,7 +2987,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1611,38 +3002,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.119" @@ -1680,79 +3039,16 @@ dependencies = [ ] [[package]] -name = "termina" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9048a889effe34a5cddee0af7f53285198b16dca3be510858d38dfdb3e62a04e" -dependencies = [ - "bitflags 2.13.1", - "parking_lot", - "rustix", - "signal-hook", - "windows-sys", -] - -[[package]] -name = "terminfo" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" -dependencies = [ - "fnv", - "nom", - "phf", - "phf_codegen", -] - -[[package]] -name = "termios" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" -dependencies = [ - "libc", -] - -[[package]] -name = "termwiz" -version = "0.23.3" +name = "tempfile" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ - "anyhow", - "base64", - "bitflags 2.13.1", - "fancy-regex", - "filedescriptor", - "finl_unicode", - "fixedbitset", - "hex", - "lazy_static", - "libc", - "log", - "memmem", - "nix", - "num-derive", - "num-traits", - "ordered-float", - "pest", - "pest_derive", - "phf", - "sha2 0.10.9", - "signal-hook", - "siphasher", - "terminfo", - "termios", - "thiserror 1.0.69", - "ucd-trie", - "unicode-segmentation", - "vtparse", - "wezterm-bidi", - "wezterm-blob-leases", - "wezterm-color-types", - "wezterm-dynamic", - "wezterm-input-types", - "winapi", + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", ] [[package]] @@ -1796,26 +3092,19 @@ dependencies = [ ] [[package]] -name = "time" -version = "0.3.55" +name = "tiff" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" dependencies = [ - "deranged", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde_core", - "time-core", + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", ] -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - [[package]] name = "tokio" version = "1.53.1" @@ -1830,7 +3119,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1866,6 +3155,87 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12c0ba9680044b4ce98d391a62094047eada0d64860b80166c39f4a6b5640785" +dependencies = [ + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.20.1" @@ -1873,39 +3243,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] -name = "ucd-trie" -version = "0.1.7" +name = "uds_windows" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] [[package]] -name = "unicode-ident" -version = "1.0.24" +name = "unicase" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] -name = "unicode-segmentation" -version = "1.13.3" +name = "unicode-general-category" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" +checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" [[package]] -name = "unicode-truncate" -version = "2.0.1" +name = "unicode-ident" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" -dependencies = [ - "itertools", - "unicode-segmentation", - "unicode-width", -] +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] -name = "unicode-width" -version = "0.2.0" +name = "unicode-segmentation" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "utf8parse" @@ -1915,16 +3285,42 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.24.1" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9" +checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" dependencies = [ - "atomic", - "getrandom 0.4.3", "js-sys", + "serde_core", "wasm-bindgen", ] +[[package]] +name = "vello_common" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e9aed918117e8152c9eddfd8362d73c465c23f26c44786aa331707b8a64fa2" +dependencies = [ + "bytemuck", + "fearless_simd", + "guillotiere", + "log", + "peniko", + "smallvec", + "thiserror 2.0.20", +] + +[[package]] +name = "vello_cpu" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac7349e1f55f6b801c7c277958df4ea53e7f20f21e8014910ad888b2ecda93ea" +dependencies = [ + "bytemuck", + "glifo", + "hashbrown 0.17.1", + "vello_common", +] + [[package]] name = "version_check" version = "0.9.5" @@ -1932,12 +3328,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "vtparse" -version = "0.6.2" +name = "walkdir" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ - "utf8parse", + "same-file", + "winapi-util", ] [[package]] @@ -1968,6 +3365,16 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.127" @@ -2001,76 +3408,165 @@ dependencies = [ ] [[package]] -name = "wezterm-bidi" -version = "0.2.3" +name = "wayland-backend" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" +checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078" dependencies = [ - "log", - "wezterm-dynamic", + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", ] [[package]] -name = "wezterm-blob-leases" -version = "0.1.1" +name = "wayland-client" +version = "0.31.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7" +checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" dependencies = [ - "getrandom 0.3.4", - "mac_address", - "sha2 0.10.9", - "thiserror 1.0.69", - "uuid", + "bitflags 2.13.1", + "rustix 1.1.4", + "wayland-backend", + "wayland-scanner", ] [[package]] -name = "wezterm-color-types" +name = "wayland-csd-frame" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "csscolorparser", - "deltae", - "lazy_static", - "wezterm-dynamic", + "bitflags 2.13.1", + "cursor-icon", + "wayland-backend", ] [[package]] -name = "wezterm-dynamic" -version = "0.2.1" +name = "wayland-cursor" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" +dependencies = [ + "rustix 1.1.4", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" dependencies = [ + "dlib", "log", - "ordered-float", - "strsim", - "thiserror 1.0.69", - "wezterm-dynamic-derive", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +dependencies = [ + "js-sys", + "wasm-bindgen", ] [[package]] -name = "wezterm-dynamic-derive" -version = "0.1.1" +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c0cf2d539c645b448eaffec9ec494b8b19bd5077d9e58cb1ae7efece8d575b" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "wezterm-input-types" -version = "0.1.0" +name = "weezl" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" -dependencies = [ - "bitflags 1.3.2", - "euclid", - "lazy_static", - "serde", - "wezterm-dynamic", -] +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "winapi" @@ -2088,6 +3584,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2195,6 +3700,33 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -2204,6 +3736,39 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows-threading" version = "0.2.1" @@ -2213,6 +3778,153 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winit" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.13.1", + "block2 0.5.1", + "bytemuck", + "calloop 0.13.0", + "cfg_aliases", + "concurrent-queue", + "core-foundation", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit 0.2.2", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "smithay-client-toolkit 0.19.2", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + [[package]] name = "winmedic" version = "0.3.4" @@ -2222,22 +3934,32 @@ dependencies = [ "chrono", "clap", "colored", - "crossterm", "dirs", - "ratatui", + "eframe", + "egui_extras", + "egui_kittest", "regex", "serde", "serde_json", - "sha2 0.11.0", + "sha2", "sysinfo", "thiserror 2.0.20", "tokio", "tokio-util", - "windows-sys", + "windows-sys 0.61.2", "winreg", "winres", ] +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.56.0" @@ -2245,7 +3967,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -2254,7 +3976,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -2263,8 +3985,259 @@ version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xcursor" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.13.1", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7" + +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-lockstep" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.3", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "5.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1586c021a01ca0a9216dcd874e546382e156a5cbab5fab6cb5f10087e22682a" +dependencies = [ + "serde", + "winnow", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zlib-rs" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + [[package]] name = "zmij" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zune-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.3", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.3", + "winnow", +] diff --git a/Cargo.toml b/Cargo.toml index dc23555..cc1419e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,16 +3,16 @@ name = "winmedic" version = "0.3.4" edition = "2024" # Verified against the locked dependency tree: edition 2024 itself needs 1.85, -# but ratatui -> instability -> darling raises the floor to 1.88. CI enforces -# this exact version in the `msrv` job so the two can never drift apart. -rust-version = "1.88" +# but egui/eframe raises the floor to 1.95. CI enforces this exact version in +# the `msrv` job so the two can never drift apart. +rust-version = "1.95" build = "build.rs" authors = ["Ammar "] -description = "High-performance Windows Self-Healing & Diagnostic TUI in Rust" +description = "High-performance Windows Self-Healing & Diagnostic GUI in Rust" readme = "README.md" license = "MIT" -keywords = ["windows", "diagnostics", "repair", "tui", "ratatui"] -categories = ["command-line-utilities", "system-administration"] +keywords = ["windows", "diagnostics", "repair", "gui", "egui"] +categories = ["gui", "system-administration"] [lib] name = "winmedic" @@ -24,8 +24,6 @@ path = "src/main.rs" [dependencies] async-trait = "0.1" -ratatui = "0.30" -crossterm = "0.29" tokio = { version = "1.40", features = ["full"] } tokio-util = "0.7" clap = { version = "4.5", features = ["derive"] } @@ -43,8 +41,22 @@ dirs = "6.0" windows-sys = { version = "0.61", features = [ "Win32_Foundation", "Win32_Security", + "Win32_System_Console", ] } +# The desktop front end. Default features are off because most of them are for +# platforms WinMedic does not target: `wayland` and `x11` are Linux display +# servers, `web_screen_reader` is for the wasm build. What is left is the glow +# (OpenGL) renderer, the bundled fonts, AccessKit for screen readers, and +# `persistence` so the window comes back where the user left it. +eframe = { version = "0.36", default-features = false, features = [ + "accesskit", + "default_fonts", + "glow", + "persistence", +] } +egui_extras = "0.36" + [build-dependencies] winres = "0.1" @@ -53,3 +65,6 @@ opt-level = 3 lto = true codegen-units = 1 panic = "abort" + +[dev-dependencies] +egui_kittest = "0.36.1" diff --git a/build.rs b/build.rs index ff45749..b3d92c8 100644 --- a/build.rs +++ b/build.rs @@ -8,7 +8,7 @@ fn main() { res.set("ProductName", "WinMedic"); res.set( "FileDescription", - "WinMedic – Windows Self-Healing & Diagnostic TUI", + "WinMedic – Windows Self-Healing & Diagnostic GUI", ); res.set("CompanyName", "SecretLUL"); res.set("LegalCopyright", "Copyright (c) 2026 SecretLUL"); diff --git a/src/app/confirm.rs b/src/app/confirm.rs index f61aaa1..d7d4f41 100644 --- a/src/app/confirm.rs +++ b/src/app/confirm.rs @@ -29,8 +29,8 @@ const UPDATE_TRANSFER_TIMEOUT: std::time::Duration = std::time::Duration::from_s /// /// [`Default`] is deliberately the *inert* set, so an [`App`] built anywhere — /// a test, a future tool, a benchmark — cannot reach the desktop by accident. -/// The real actions are installed once, explicitly, by the TUI entry point via -/// [`App::enable_real_system_actions`]. +/// The real actions are installed once, explicitly, by the desktop front end +/// via [`App::enable_real_system_actions`]. #[derive(Debug, Clone, Copy)] pub struct SystemActions { /// Hand a release URL to the OS so it opens in the default browser. @@ -274,7 +274,7 @@ impl App { /// /// Returns immediately: the work runs on the Tokio runtime and reports back /// through [`BackgroundEvent::UpdateInstallStep`] and - /// [`BackgroundEvent::UpdateInstallFinished`], so the TUI keeps drawing + /// [`BackgroundEvent::UpdateInstallFinished`], so the window keeps drawing /// while a multi-megabyte download is in flight. fn start_update_install( &mut self, @@ -387,7 +387,7 @@ mod tests { /// A default-built [`App`] must not be able to reach the desktop. Accepting /// a dialog used to open a browser window and raise a UAC prompt on whoever /// ran the suite — several times per run, since more than one test accepts - /// one. The real actions are opt-in, and only the TUI opts in. + /// one. The real actions are opt-in, and only the desktop front end opts in. #[test] fn a_default_app_cannot_reach_the_desktop() { let actions = App::new().system_actions; diff --git a/src/app/events.rs b/src/app/events.rs index 2b30960..22fff06 100644 --- a/src/app/events.rs +++ b/src/app/events.rs @@ -1,8 +1,9 @@ //! Draining the scan, repair and background channels into application state. //! -//! Called once per frame from the TUI loop. Everything here is non-blocking: -//! `try_recv` until empty, never awaiting, so a slow producer cannot stall -//! rendering. +//! Called once per frame from the front end, out of `eframe::App::logic` — +//! which runs even while the window is hidden, so a scan does not appear to +//! stall when it is minimised. Everything here is non-blocking: `try_recv` +//! until empty, never awaiting, so a slow producer cannot stall rendering. use super::state::{App, ModuleScanProgress}; use super::{BackgroundEvent, push_bounded_log}; diff --git a/src/app/filters.rs b/src/app/filters.rs index 591e8ef..6617d49 100644 --- a/src/app/filters.rs +++ b/src/app/filters.rs @@ -150,7 +150,7 @@ impl App { self.severity_filter = None; self.module_filter = None; self.search_query.clear(); - self.is_searching = false; + self.focus_search = false; self.clamp_filtered_selection(); } diff --git a/src/app/input.rs b/src/app/input.rs index be5f17b..ca8eea5 100644 --- a/src/app/input.rs +++ b/src/app/input.rs @@ -6,24 +6,55 @@ //! moved somewhere it can be exercised. //! //! Dispatch is layered, and the order matters: a pending confirmation swallows -//! everything, then the help overlay, then search input capture, and only then -//! the normal bindings. +//! everything, then the help overlay, and only then the normal bindings. +//! +//! Text entry is deliberately absent from that list. It used to be a layer of +//! its own, because a terminal has no text fields and the search box and the +//! numeric setting editor had to be assembled a keystroke at a time. The window +//! has real fields bound to the same state, and while one of them holds focus +//! the front end sends nothing here at all. use super::state::App; use super::{TAB_DASHBOARD, TAB_REPAIR, TAB_SCANNER, TAB_SETTINGS, TAB_TRIAGE}; use crate::engine::issue::Severity; -use crossterm::event::KeyCode; -pub fn handle_key(app: &mut App, code: KeyCode) { +/// A keystroke, expressed independently of any UI toolkit. +/// +/// Dispatch used to take `crossterm::event::KeyCode` directly, which made this +/// module — the single largest piece of interaction logic in the crate — a +/// dependent of whichever library happened to be drawing the screen. It is the +/// only thing in `app` that ever was. Naming the keys ourselves keeps the +/// dispatch table and its tests intact across a change of front end; the front +/// end's job is to translate its own key events into these. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Key { + Char(char), + Enter, + Esc, + Backspace, + Tab, + /// Shift+Tab. + BackTab, + Up, + Down, + Left, + Right, + /// Everything the front end recognises but this table does not bind. + /// + /// Mapping the unbound keys onto one variant rather than dropping them at + /// the front end keeps "this key does nothing" a statement the dispatch + /// table makes, and therefore one a test can check. + Unbound, +} + +pub fn handle_key(app: &mut App, code: Key) { // A pending confirmation swallows every other key. if app.pending_confirm.is_some() { match code { - KeyCode::Char('y') - | KeyCode::Char('Y') - | KeyCode::Char('j') - | KeyCode::Char('J') - | KeyCode::Enter => app.confirm_pending_action(), - KeyCode::Char('n') | KeyCode::Char('N') | KeyCode::Esc => app.dismiss_confirm(), + Key::Char('y') | Key::Char('Y') | Key::Char('j') | Key::Char('J') | Key::Enter => { + app.confirm_pending_action() + } + Key::Char('n') | Key::Char('N') | Key::Esc => app.dismiss_confirm(), _ => {} } return; @@ -32,20 +63,20 @@ pub fn handle_key(app: &mut App, code: KeyCode) { // A pending setting numeric input modal captures typing until saved or cancelled. if let Some(input) = app.setting_input.as_mut() { match code { - KeyCode::Char(c) if c.is_ascii_digit() => { + Key::Char(c) if c.is_ascii_digit() => { if input.buffer.len() < 10 { input.buffer.push(c); input.error_msg = None; } } - KeyCode::Backspace => { + Key::Backspace => { input.buffer.pop(); input.error_msg = None; } - KeyCode::Enter => { + Key::Enter => { app.submit_setting_input(); } - KeyCode::Esc => { + Key::Esc => { app.cancel_setting_input(); } _ => {} @@ -55,7 +86,7 @@ pub fn handle_key(app: &mut App, code: KeyCode) { if app.show_help { match code { - KeyCode::Char('?') | KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => { + Key::Char('?') | Key::Esc | Key::Char('q') | Key::Char('Q') => { app.show_help = false; } _ => {} @@ -63,39 +94,21 @@ pub fn handle_key(app: &mut App, code: KeyCode) { return; } - if app.active_tab == TAB_TRIAGE && app.is_searching { - match code { - KeyCode::Esc | KeyCode::Enter => { - app.is_searching = false; - } - KeyCode::Backspace => { - app.search_query.pop(); - app.clamp_filtered_selection(); - } - KeyCode::Char(c) => { - app.search_query.push(c); - app.clamp_filtered_selection(); - } - _ => {} - } - return; - } - match code { - KeyCode::Char('q') | KeyCode::Char('Q') => app.should_quit = true, - KeyCode::Char('?') => app.show_help = true, + Key::Char('q') | Key::Char('Q') => app.should_quit = true, + Key::Char('?') => app.show_help = true, - KeyCode::Char('1') => app.goto_tab(TAB_DASHBOARD), - KeyCode::Char('2') => app.goto_tab(TAB_SCANNER), - KeyCode::Char('3') => app.goto_tab(TAB_TRIAGE), - KeyCode::Char('4') => app.goto_tab(TAB_REPAIR), - KeyCode::Char('5') => app.goto_tab(TAB_SETTINGS), + Key::Char('1') => app.goto_tab(TAB_DASHBOARD), + Key::Char('2') => app.goto_tab(TAB_SCANNER), + Key::Char('3') => app.goto_tab(TAB_TRIAGE), + Key::Char('4') => app.goto_tab(TAB_REPAIR), + Key::Char('5') => app.goto_tab(TAB_SETTINGS), - KeyCode::Tab => app.next_tab(), - KeyCode::BackTab => app.prev_tab(), + Key::Tab => app.next_tab(), + Key::BackTab => app.prev_tab(), - KeyCode::Char('s') | KeyCode::Char('S') => app.start_scan(), - KeyCode::Char('r') | KeyCode::Char('R') => { + Key::Char('s') | Key::Char('S') => app.start_scan(), + Key::Char('r') | Key::Char('R') => { if app.active_tab == TAB_SETTINGS { app.load_safety_data(); app.refresh_restore_points(); @@ -106,13 +119,13 @@ pub fn handle_key(app: &mut App, code: KeyCode) { // Hands the arrow keys to the backup list and back, so one tab can carry // both the settings list and the rollback target selection. - KeyCode::Char('b') | KeyCode::Char('B') if app.active_tab == TAB_SETTINGS => { + Key::Char('b') | Key::Char('B') if app.active_tab == TAB_SETTINGS => { app.toggle_safety_focus(); } - KeyCode::Char('d') | KeyCode::Char('D') => app.toggle_dry_run(), + Key::Char('d') | Key::Char('D') => app.toggle_dry_run(), - KeyCode::Char('f') | KeyCode::Char('F') => { + Key::Char('f') | Key::Char('F') => { if app.active_tab == TAB_TRIAGE || app.active_tab == TAB_REPAIR { app.start_repairs(); } else { @@ -120,16 +133,16 @@ pub fn handle_key(app: &mut App, code: KeyCode) { } } - KeyCode::Char('a') | KeyCode::Char('A') => { + Key::Char('a') | Key::Char('A') => { if app.active_tab == TAB_DASHBOARD { app.start_scan(); } else { app.select_all_issues(); } } - KeyCode::Char('n') | KeyCode::Char('N') => app.deselect_all_issues(), + Key::Char('n') | Key::Char('N') => app.deselect_all_issues(), - KeyCode::Char('u') | KeyCode::Char('U') => { + Key::Char('u') | Key::Char('U') => { if app.active_tab == TAB_SETTINGS { app.request_rollback(); } else { @@ -138,7 +151,7 @@ pub fn handle_key(app: &mut App, code: KeyCode) { } } - KeyCode::Char('e') | KeyCode::Char('E') => match app.export_report() { + Key::Char('e') | Key::Char('E') => match app.export_report() { Ok(path) => { app.status_message = Some(format!("Report exported: {}", path.display())); } @@ -151,75 +164,60 @@ pub fn handle_key(app: &mut App, code: KeyCode) { // list holds focus — there is nothing on that side to toggle, and // silently editing the hidden selection would be worse than doing // nothing. - KeyCode::Enter => match app.active_tab { + Key::Enter => match app.active_tab { TAB_TRIAGE => app.toggle_selected_issue(), TAB_SETTINGS if !app.backups_focused() => app.open_setting_input(), _ => {} }, - KeyCode::Char(' ') => match app.active_tab { + Key::Char(' ') => match app.active_tab { TAB_TRIAGE => app.toggle_selected_issue(), TAB_SETTINGS if !app.backups_focused() => app.toggle_current_setting(), _ => {} }, - KeyCode::Up | KeyCode::Char('k') => match app.active_tab { + // The scan and repair logs used to be scrolled from here. They are + // scroll areas now, which the mouse wheel and their own scrollbars + // drive, so there is nothing left for these keys to move. + Key::Up | Key::Char('k') => match app.active_tab { TAB_TRIAGE => app.prev_issue(), TAB_SETTINGS if app.backups_focused() => app.prev_backup(), TAB_SETTINGS => app.prev_setting(), - TAB_SCANNER | TAB_REPAIR => app.scroll_log_up(1), _ => {} }, - KeyCode::Down | KeyCode::Char('j') => match app.active_tab { + Key::Down | Key::Char('j') => match app.active_tab { TAB_TRIAGE => app.next_issue(), TAB_SETTINGS if app.backups_focused() => app.next_backup(), TAB_SETTINGS => app.next_setting(), - TAB_SCANNER | TAB_REPAIR => app.scroll_log_down(1), - _ => {} - }, - KeyCode::PageUp => match app.active_tab { - TAB_SCANNER | TAB_REPAIR => app.scroll_log_up(10), - _ => {} - }, - KeyCode::PageDown => match app.active_tab { - TAB_SCANNER | TAB_REPAIR => app.scroll_log_down(10), - _ => {} - }, - KeyCode::Home => match app.active_tab { - TAB_SCANNER | TAB_REPAIR => app.scroll_log_top(), - _ => {} - }, - KeyCode::End => match app.active_tab { - TAB_SCANNER | TAB_REPAIR => app.scroll_log_bottom(), _ => {} }, - KeyCode::Char('/') if app.active_tab == TAB_TRIAGE => app.is_searching = true, - KeyCode::Char('c') | KeyCode::Char('C') if app.active_tab == TAB_TRIAGE => { + Key::Char('/') if app.active_tab == TAB_TRIAGE => app.focus_search = true, + Key::Char('c') | Key::Char('C') if app.active_tab == TAB_TRIAGE => { app.toggle_severity_filter(Severity::Critical); } - KeyCode::Char('w') | KeyCode::Char('W') if app.active_tab == TAB_TRIAGE => { + Key::Char('w') | Key::Char('W') if app.active_tab == TAB_TRIAGE => { app.toggle_severity_filter(Severity::Warning); } - KeyCode::Char('i') | KeyCode::Char('I') if app.active_tab == TAB_TRIAGE => { + Key::Char('i') | Key::Char('I') if app.active_tab == TAB_TRIAGE => { app.toggle_severity_filter(Severity::Info); } - KeyCode::Char('m') | KeyCode::Char('M') if app.active_tab == TAB_TRIAGE => { + Key::Char('m') | Key::Char('M') if app.active_tab == TAB_TRIAGE => { app.cycle_module_filter(); } - KeyCode::Char('x') | KeyCode::Char('X') if app.active_tab == TAB_TRIAGE => { + Key::Char('x') | Key::Char('X') if app.active_tab == TAB_TRIAGE => { app.clear_filters(); } - KeyCode::Left | KeyCode::Char('h') => app.prev_tab(), - KeyCode::Right | KeyCode::Char('l') => app.next_tab(), + Key::Left | Key::Char('h') => app.prev_tab(), + Key::Right | Key::Char('l') => app.next_tab(), - KeyCode::Char('+') | KeyCode::Char('=') | KeyCode::Char(']') + Key::Char('+') | Key::Char('=') | Key::Char(']') if app.active_tab == TAB_SETTINGS && !app.backups_focused() => { app.adjust_current_setting(true); } - KeyCode::Char('-') | KeyCode::Char('_') | KeyCode::Char('[') + Key::Char('-') | Key::Char('_') | Key::Char('[') if app.active_tab == TAB_SETTINGS && !app.backups_focused() => { app.adjust_current_setting(false); @@ -227,7 +225,7 @@ pub fn handle_key(app: &mut App, code: KeyCode) { // Esc unwinds one layer at a time: filters, then backup focus, then a // running operation, then the tab itself. - KeyCode::Esc => { + Key::Esc => { if app.active_tab == TAB_TRIAGE && app.has_active_filters() { app.clear_filters(); } else if app.active_tab == TAB_SETTINGS && app.backups_focused() { @@ -306,7 +304,7 @@ mod tests { app.pending_confirm = Some(ConfirmRequest::Elevate); // 'q' or other arbitrary keys would normally trigger actions, but must be swallowed without dismissing. - handle_key(&mut app, KeyCode::Char('q')); + handle_key(&mut app, Key::Char('q')); assert!(!app.should_quit, "the modal must absorb the keystroke"); assert!( app.pending_confirm.is_some(), @@ -314,7 +312,7 @@ mod tests { ); // 'n' or Esc dismisses the confirmation. - handle_key(&mut app, KeyCode::Esc); + handle_key(&mut app, Key::Esc); assert!(app.pending_confirm.is_none(), "Esc dismisses the modal"); } @@ -324,14 +322,14 @@ mod tests { // Dismiss via 'n' app.pending_confirm = Some(ConfirmRequest::Elevate); - handle_key(&mut app, KeyCode::Char(' ')); + handle_key(&mut app, Key::Char(' ')); assert!(app.pending_confirm.is_some(), "Space ignored"); - handle_key(&mut app, KeyCode::Char('n')); + handle_key(&mut app, Key::Char('n')); assert!(app.pending_confirm.is_none(), "'n' dismisses"); // Dismiss via 'N' app.pending_confirm = Some(ConfirmRequest::Elevate); - handle_key(&mut app, KeyCode::Char('N')); + handle_key(&mut app, Key::Char('N')); assert!(app.pending_confirm.is_none(), "'N' dismisses"); // Confirm via 'y' @@ -341,7 +339,7 @@ mod tests { release_url: "https://example.com".into(), download: None, }); - handle_key(&mut app, KeyCode::Char('y')); + handle_key(&mut app, Key::Char('y')); assert!(app.pending_confirm.is_none(), "'y' confirms"); // Confirm via 'Enter' @@ -351,7 +349,7 @@ mod tests { release_url: "https://example.com".into(), download: None, }); - handle_key(&mut app, KeyCode::Enter); + handle_key(&mut app, Key::Enter); assert!(app.pending_confirm.is_none(), "'Enter' confirms"); } @@ -361,35 +359,27 @@ mod tests { app.show_help = true; app.active_tab = TAB_DASHBOARD; - handle_key(&mut app, KeyCode::Char('3')); + handle_key(&mut app, Key::Char('3')); assert!(app.show_help, "still open"); assert_eq!(app.active_tab, TAB_DASHBOARD, "tab switch was swallowed"); - handle_key(&mut app, KeyCode::Esc); + handle_key(&mut app, Key::Esc); assert!(!app.show_help); } + /// `/` asks for the search box; it does not start capturing text itself. #[test] - fn search_mode_captures_letters_instead_of_triggering_bindings() { + fn slash_requests_the_search_box_only_on_the_triage_tab() { let mut app = app_with_issues(); - app.active_tab = TAB_TRIAGE; - app.is_searching = true; - - // 'q' and 's' are quit and scan outside search mode. - for c in "qs".chars() { - handle_key(&mut app, KeyCode::Char(c)); - } - - assert_eq!(app.search_query, "qs"); - assert!(!app.should_quit); - assert!(!app.is_scanning); - handle_key(&mut app, KeyCode::Backspace); - assert_eq!(app.search_query, "q"); + app.active_tab = TAB_DASHBOARD; + handle_key(&mut app, Key::Char('/')); + assert!(!app.focus_search, "nothing to focus outside triage"); - handle_key(&mut app, KeyCode::Enter); - assert!(!app.is_searching, "Enter leaves search mode"); - assert_eq!(app.search_query, "q", "and keeps the query"); + app.active_tab = TAB_TRIAGE; + handle_key(&mut app, Key::Char('/')); + assert!(app.focus_search); + assert_eq!(app.search_query, "", "and types nothing by itself"); } #[test] @@ -397,10 +387,10 @@ mod tests { let mut app = app(); app.active_tab = TAB_COUNT - 1; - handle_key(&mut app, KeyCode::Tab); + handle_key(&mut app, Key::Tab); assert_eq!(app.active_tab, 0); - handle_key(&mut app, KeyCode::BackTab); + handle_key(&mut app, Key::BackTab); assert_eq!(app.active_tab, TAB_COUNT - 1); } @@ -410,27 +400,27 @@ mod tests { app.active_tab = 0; // Right arrow advances tab - handle_key(&mut app, KeyCode::Right); + handle_key(&mut app, Key::Right); assert_eq!(app.active_tab, 1); // 'l' advances tab - handle_key(&mut app, KeyCode::Char('l')); + handle_key(&mut app, Key::Char('l')); assert_eq!(app.active_tab, 2); // Left arrow goes back - handle_key(&mut app, KeyCode::Left); + handle_key(&mut app, Key::Left); assert_eq!(app.active_tab, 1); // 'h' goes back - handle_key(&mut app, KeyCode::Char('h')); + handle_key(&mut app, Key::Char('h')); assert_eq!(app.active_tab, 0); // Left arrow wraps to last tab - handle_key(&mut app, KeyCode::Left); + handle_key(&mut app, Key::Left); assert_eq!(app.active_tab, TAB_COUNT - 1); // Right arrow wraps back to first tab - handle_key(&mut app, KeyCode::Right); + handle_key(&mut app, Key::Right); assert_eq!(app.active_tab, 0); } @@ -441,16 +431,16 @@ mod tests { app.selected_setting_index = 4; // temp_clean_threshold_mb (default 500) let initial = app.config.temp_clean_threshold_mb; - handle_key(&mut app, KeyCode::Char('+')); + handle_key(&mut app, Key::Char('+')); assert_eq!(app.config.temp_clean_threshold_mb, initial + 100); - handle_key(&mut app, KeyCode::Char('-')); + handle_key(&mut app, Key::Char('-')); assert_eq!(app.config.temp_clean_threshold_mb, initial); - handle_key(&mut app, KeyCode::Char(']')); + handle_key(&mut app, Key::Char(']')); assert_eq!(app.config.temp_clean_threshold_mb, initial + 100); - handle_key(&mut app, KeyCode::Char('[')); + handle_key(&mut app, Key::Char('[')); assert_eq!(app.config.temp_clean_threshold_mb, initial); } @@ -459,15 +449,15 @@ mod tests { let mut app = app_with_issues(); app.active_tab = TAB_DASHBOARD; - handle_key(&mut app, KeyCode::Char('c')); + handle_key(&mut app, Key::Char('c')); assert_eq!(app.severity_filter, None, "no filtering outside triage"); app.active_tab = TAB_TRIAGE; - handle_key(&mut app, KeyCode::Char('c')); + handle_key(&mut app, Key::Char('c')); assert_eq!(app.severity_filter, Some(Severity::Critical)); // Pressing it again clears it. - handle_key(&mut app, KeyCode::Char('c')); + handle_key(&mut app, Key::Char('c')); assert_eq!(app.severity_filter, None); } @@ -477,11 +467,11 @@ mod tests { app.active_tab = TAB_TRIAGE; app.toggle_severity_filter(Severity::Critical); - handle_key(&mut app, KeyCode::Esc); + handle_key(&mut app, Key::Esc); assert!(!app.has_active_filters(), "first Esc clears the filter"); assert_eq!(app.active_tab, TAB_TRIAGE, "and stays put"); - handle_key(&mut app, KeyCode::Esc); + handle_key(&mut app, Key::Esc); assert_eq!(app.active_tab, TAB_DASHBOARD, "second Esc navigates back"); } @@ -492,12 +482,12 @@ mod tests { app.available_update = None; // Nothing parked, so this is a no-op rather than a modal. - handle_key(&mut app, KeyCode::Char('u')); + handle_key(&mut app, Key::Char('u')); assert!(app.pending_confirm.is_none()); app.active_tab = TAB_SETTINGS; app.backup_records.clear(); - handle_key(&mut app, KeyCode::Char('u')); + handle_key(&mut app, Key::Char('u')); // No backups to roll back, so it explains itself instead. assert!(app.pending_confirm.is_none()); assert!(app.status_message.is_some()); @@ -511,12 +501,12 @@ mod tests { app.selected_setting_index = 0; // Focus starts on the settings list. - handle_key(&mut app, KeyCode::Down); + handle_key(&mut app, Key::Down); assert_eq!(app.selected_setting_index, 1); assert_eq!(app.selected_backup_index, 0, "the backup list stayed put"); - handle_key(&mut app, KeyCode::Char('b')); - handle_key(&mut app, KeyCode::Down); + handle_key(&mut app, Key::Char('b')); + handle_key(&mut app, Key::Down); assert_eq!(app.selected_backup_index, 1); assert_eq!( app.selected_setting_index, 1, @@ -526,17 +516,17 @@ mod tests { // While backups hold focus, the setting editors are inert. let before = app.config.temp_clean_threshold_mb; app.selected_setting_index = 4; // temp_clean_threshold_mb - handle_key(&mut app, KeyCode::Char('+')); + handle_key(&mut app, Key::Char('+')); assert_eq!(app.config.temp_clean_threshold_mb, before); - handle_key(&mut app, KeyCode::Enter); + handle_key(&mut app, Key::Enter); assert!(app.setting_input.is_none(), "Enter opens no input dialog"); // Esc gives the arrow keys back before it navigates anywhere. - handle_key(&mut app, KeyCode::Esc); + handle_key(&mut app, Key::Esc); assert!(!app.backups_focused()); assert_eq!(app.active_tab, TAB_SETTINGS, "and stays on the tab"); - handle_key(&mut app, KeyCode::Esc); + handle_key(&mut app, Key::Esc); assert_eq!(app.active_tab, TAB_DASHBOARD); } @@ -545,7 +535,7 @@ mod tests { let mut app = app(); app.active_tab = TAB_TRIAGE; - handle_key(&mut app, KeyCode::Char('b')); + handle_key(&mut app, Key::Char('b')); assert!(!app.backups_focused()); } @@ -560,7 +550,7 @@ mod tests { ('4', TAB_REPAIR), ('5', TAB_SETTINGS), ] { - handle_key(&mut app, KeyCode::Char(key)); + handle_key(&mut app, Key::Char(key)); assert_eq!( app.active_tab, expected, "'{key}' should open tab {expected}" @@ -569,7 +559,7 @@ mod tests { // '6' used to be Settings. It now points past the last tab and must not // move the user anywhere. - handle_key(&mut app, KeyCode::Char('6')); + handle_key(&mut app, Key::Char('6')); assert_eq!(app.active_tab, TAB_SETTINGS, "'6' is no longer bound"); } @@ -580,42 +570,23 @@ mod tests { app.selected_filtered_index = 0; assert!(app.issues[0].is_selected, "issues start selected"); - handle_key(&mut app, KeyCode::Char(' ')); + handle_key(&mut app, Key::Char(' ')); assert!(!app.issues[0].is_selected); - handle_key(&mut app, KeyCode::Char(' ')); + handle_key(&mut app, Key::Char(' ')); assert!(app.issues[0].is_selected); } - #[test] - fn arrow_keys_scroll_logs_on_the_scanner_tab() { - let mut app = app(); - app.active_tab = TAB_SCANNER; - app.scan_log_messages.clear(); - for i in 0..50 { - app.push_scan_log(format!("line {i}")); - } - - handle_key(&mut app, KeyCode::PageUp); - assert_eq!(app.scan_log_scroll, 10); - - handle_key(&mut app, KeyCode::Up); - assert_eq!(app.scan_log_scroll, 11); - - handle_key(&mut app, KeyCode::End); - assert_eq!(app.scan_log_scroll, 0, "End returns to live"); - } - #[test] fn dry_run_toggles_and_reports_itself() { let mut app = app(); assert!(!app.dry_run); - handle_key(&mut app, KeyCode::Char('d')); + handle_key(&mut app, Key::Char('d')); assert!(app.dry_run); assert!(app.status_message.is_some()); - handle_key(&mut app, KeyCode::Char('D')); + handle_key(&mut app, Key::Char('D')); assert!(!app.dry_run); } @@ -623,7 +594,7 @@ mod tests { fn quit_is_bound_in_both_cases() { for c in ['q', 'Q'] { let mut app = app(); - handle_key(&mut app, KeyCode::Char(c)); + handle_key(&mut app, Key::Char(c)); assert!(app.should_quit, "'{c}' should quit"); } } @@ -633,12 +604,7 @@ mod tests { let mut app = app(); let before = app.active_tab; - for code in [ - KeyCode::F(5), - KeyCode::Insert, - KeyCode::Delete, - KeyCode::Char('§'), - ] { + for code in [Key::Unbound, Key::Char('§')] { handle_key(&mut app, code); } @@ -656,37 +622,37 @@ mod tests { assert_eq!(app.config.temp_clean_threshold_mb, 500); // Enter opens input modal - handle_key(&mut app, KeyCode::Enter); + handle_key(&mut app, Key::Enter); assert!(app.setting_input.is_some()); // Backspace 3 times - handle_key(&mut app, KeyCode::Backspace); - handle_key(&mut app, KeyCode::Backspace); - handle_key(&mut app, KeyCode::Backspace); + handle_key(&mut app, Key::Backspace); + handle_key(&mut app, Key::Backspace); + handle_key(&mut app, Key::Backspace); assert_eq!(app.setting_input.as_ref().unwrap().buffer, ""); // Type '8', '0', '0' - handle_key(&mut app, KeyCode::Char('8')); - handle_key(&mut app, KeyCode::Char('0')); - handle_key(&mut app, KeyCode::Char('0')); + handle_key(&mut app, Key::Char('8')); + handle_key(&mut app, Key::Char('0')); + handle_key(&mut app, Key::Char('0')); assert_eq!(app.setting_input.as_ref().unwrap().buffer, "800"); // Non-digits are ignored - handle_key(&mut app, KeyCode::Char('a')); - handle_key(&mut app, KeyCode::Char('q')); + handle_key(&mut app, Key::Char('a')); + handle_key(&mut app, Key::Char('q')); assert_eq!(app.setting_input.as_ref().unwrap().buffer, "800"); assert!(!app.should_quit, "modal swallows 'q'"); // Enter submits and saves - handle_key(&mut app, KeyCode::Enter); + handle_key(&mut app, Key::Enter); assert!(app.setting_input.is_none()); assert_eq!(app.config.temp_clean_threshold_mb, 800); // Esc cancels without saving - handle_key(&mut app, KeyCode::Enter); + handle_key(&mut app, Key::Enter); assert!(app.setting_input.is_some()); - handle_key(&mut app, KeyCode::Char('9')); - handle_key(&mut app, KeyCode::Esc); + handle_key(&mut app, Key::Char('9')); + handle_key(&mut app, Key::Esc); assert!(app.setting_input.is_none()); assert_eq!(app.config.temp_clean_threshold_mb, 800); } diff --git a/src/app/mod.rs b/src/app/mod.rs index 42bb69d..ad74732 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,4 +1,4 @@ -//! Application state and behaviour for the interactive TUI. +//! Application state and behaviour for the interactive front end. //! //! This used to be one 1400-line file holding UI state, key dispatch, filtering, //! run orchestration, backup listing and the update notice together. The split @@ -30,7 +30,7 @@ pub mod settings; pub mod state; pub use confirm::{ConfirmRequest, SystemActions}; -pub use input::handle_key; +pub use input::{Key, handle_key}; pub use state::{App, SafetyFocus, SettingInput}; /// Maximum number of log lines kept in memory for scan and repair terminal buffers. diff --git a/src/app/run_control.rs b/src/app/run_control.rs index 1ecc23c..f65bd7a 100644 --- a/src/app/run_control.rs +++ b/src/app/run_control.rs @@ -23,7 +23,6 @@ impl App { self.issues.clear(); self.selected_issue_index = 0; self.selected_filtered_index = 0; - self.scan_log_scroll = 0; self.scan_log_messages.clear(); self.push_scan_log("Starting a full system health scan..."); @@ -74,7 +73,6 @@ impl App { self.fixed_count = 0; self.failed_count = 0; self.total_to_fix = selected_count; - self.repair_log_scroll = 0; self.vss_status = if self.dry_run { "Simulation".to_string() } else { diff --git a/src/app/state.rs b/src/app/state.rs index 053958a..e99e03c 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -2,10 +2,7 @@ //! export. Behaviour that belongs to a specific feature lives in the sibling //! modules listed in [`crate::app`]. -use super::{ - BackgroundEvent, TAB_COUNT, TAB_DASHBOARD, TAB_REPAIR, TAB_SCANNER, TAB_SETTINGS, - push_bounded_log, -}; +use super::{BackgroundEvent, TAB_COUNT, TAB_DASHBOARD, TAB_SETTINGS, push_bounded_log}; use crate::config::AppConfig; use crate::engine::issue::{Issue, Severity}; use crate::engine::reporter::DiagnosticReporter; @@ -132,7 +129,14 @@ pub struct App { pub severity_filter: Option, pub module_filter: Option, pub search_query: String, - pub is_searching: bool, + /// A one-shot request from the `/` binding: put the caret in the triage + /// search box. + /// + /// The terminal front end had to capture every keystroke itself and append + /// it to [`Self::search_query`]. A window has a real text field bound to + /// that same string, so the only thing `/` still has to do is say where the + /// keyboard should go. The front end clears the flag as it honours it. + pub focus_search: bool, pub selected_filtered_index: usize, // Live Scanner State @@ -146,7 +150,6 @@ pub struct App { pub module_progress_list: Vec, pub module_statuses: Vec<(String, String, String, ModuleStatus)>, pub scan_log_messages: VecDeque, - pub scan_log_scroll: usize, // Live Repair State pub is_fixing: bool, @@ -158,7 +161,6 @@ pub struct App { pub total_to_fix: usize, pub vss_status: String, pub repair_console_lines: VecDeque, - pub repair_log_scroll: usize, // Safety: audit log, registry backups, VSS restore points pub audit_logger: AuditLogger, @@ -189,7 +191,7 @@ pub struct App { /// windows, UAC prompts, restore points. /// /// Inert unless the caller opts in through - /// [`App::enable_real_system_actions`], which only the TUI entry point + /// [`App::enable_real_system_actions`], which only the desktop front end /// does — see [`SystemActions`]. pub system_actions: SystemActions, pub should_quit: bool, @@ -240,7 +242,7 @@ impl App { severity_filter: None, module_filter: None, search_query: String::new(), - is_searching: false, + focus_search: false, selected_filtered_index: 0, is_scanning: false, scan_overall_progress: 0, @@ -251,7 +253,6 @@ impl App { scan_log_messages: VecDeque::from([String::from( "WinMedic initialised. Ready to diagnose.", )]), - scan_log_scroll: 0, is_fixing: false, dry_run: false, current_fix_title: String::new(), @@ -260,7 +261,6 @@ impl App { total_to_fix: 0, vss_status: "Ready".to_string(), repair_console_lines: VecDeque::from([String::from("Repair centre ready.")]), - repair_log_scroll: 0, audit_logger, reg_backup_mgr, audit_entries, @@ -305,8 +305,8 @@ impl App { /// [`App::new`] builds an app that cannot touch it: confirming a dialog /// opens no browser and raises no UAC prompt, and a repair run asks Windows /// for no restore point. That default is what keeps `cargo test` — which - /// builds dozens of `App`s — off the developer's own desktop. The TUI entry - /// point is the one caller that wants the real thing, so it is the one + /// builds dozens of `App`s — off the developer's own desktop. The desktop + /// front end is the one caller that wants the real thing, so it is the one /// caller that opts in. /// /// The engine is rebuilt because it reads @@ -328,8 +328,8 @@ impl App { /// /// Deliberately *not* part of [`App::new`]: constructing an `App` must stay /// free of network I/O so the test suite — which builds dozens of them - /// inside `#[tokio::test]` — never reaches out to api.github.com. The TUI - /// entry point calls this once, right after construction. + /// inside `#[tokio::test]` — never reaches out to api.github.com. The + /// desktop front end calls this once, right after construction. pub fn start_update_check(&mut self) { if !self.config.check_for_updates { return; @@ -442,56 +442,6 @@ impl App { push_bounded_log(&mut self.repair_console_lines, line); } - pub fn scroll_log_up(&mut self, amount: usize) { - match self.active_tab { - TAB_SCANNER => { - let max_scroll = self.scan_log_messages.len().saturating_sub(1); - self.scan_log_scroll = (self.scan_log_scroll + amount).min(max_scroll); - } - TAB_REPAIR => { - let max_scroll = self.repair_console_lines.len().saturating_sub(1); - self.repair_log_scroll = (self.repair_log_scroll + amount).min(max_scroll); - } - _ => {} - } - } - - pub fn scroll_log_down(&mut self, amount: usize) { - match self.active_tab { - TAB_SCANNER => { - self.scan_log_scroll = self.scan_log_scroll.saturating_sub(amount); - } - TAB_REPAIR => { - self.repair_log_scroll = self.repair_log_scroll.saturating_sub(amount); - } - _ => {} - } - } - - pub fn scroll_log_top(&mut self) { - match self.active_tab { - TAB_SCANNER => { - self.scan_log_scroll = self.scan_log_messages.len().saturating_sub(1); - } - TAB_REPAIR => { - self.repair_log_scroll = self.repair_console_lines.len().saturating_sub(1); - } - _ => {} - } - } - - pub fn scroll_log_bottom(&mut self) { - match self.active_tab { - TAB_SCANNER => { - self.scan_log_scroll = 0; - } - TAB_REPAIR => { - self.repair_log_scroll = 0; - } - _ => {} - } - } - /// Export the current scan/repair report as an HTML file in the reports directory. pub fn export_report(&mut self) -> Result { let base = dirs::data_dir().unwrap_or_else(|| std::path::PathBuf::from(".")); @@ -527,7 +477,7 @@ mod tests { } #[test] - fn test_app_log_ring_buffer_and_scrolling() { + fn the_scan_log_evicts_its_oldest_lines_once_it_is_full() { let mut app = App::new(); app.scan_log_messages.clear(); @@ -546,22 +496,6 @@ mod tests { app.scan_log_messages.back(), Some(&"Log line 2099".to_string()) ); - - // Test scrolling - app.active_tab = TAB_SCANNER; - assert_eq!(app.scan_log_scroll, 0); - - app.scroll_log_up(15); - assert_eq!(app.scan_log_scroll, 15); - - app.scroll_log_down(5); - assert_eq!(app.scan_log_scroll, 10); - - app.scroll_log_top(); - assert_eq!(app.scan_log_scroll, MAX_LOG_LINES - 1); - - app.scroll_log_bottom(); - assert_eq!(app.scan_log_scroll, 0); } #[test] diff --git a/src/engine/runner.rs b/src/engine/runner.rs index e83b7ab..63575ff 100644 --- a/src/engine/runner.rs +++ b/src/engine/runner.rs @@ -244,8 +244,8 @@ impl DiagnosticEngine { /// Choose where `run_repairs` gets its restore point from. /// /// Only the two entry points that repair a real machine pass - /// [`RestorePointService::real`] here — the TUI (through - /// [`crate::app::SystemActions`]) and the `--fix` command line. + /// [`RestorePointService::real`] here — the desktop front end (through + /// [`crate::app::SystemActions`]) and the `--auto-fix` command line. pub fn with_restore_points(mut self, service: RestorePointService) -> Self { self.restore_point = service; self diff --git a/src/gui/keys.rs b/src/gui/keys.rs new file mode 100644 index 0000000..7873199 --- /dev/null +++ b/src/gui/keys.rs @@ -0,0 +1,63 @@ +//! Translating egui's key events into the toolkit-neutral [`Key`]. +//! +//! The mirror image of what the terminal front end did with crossterm: the +//! front end names its own key type, [`crate::app::input`] names none. Keeping +//! the whole dispatch table on the far side of this translation is what let it +//! survive the move from terminal to window unchanged. + +use crate::app::Key; +use eframe::egui; + +/// Collect this frame's keystrokes, in the order they arrived. +/// +/// Returns nothing at all while a text field holds focus. That is the rule that +/// makes single-letter bindings safe in a window: typing "storage" into the +/// triage search box must not start a scan on the `s`, and the widget that owns +/// the keyboard is the one egui already tracks. +pub fn shortcuts(ctx: &egui::Context) -> Vec { + if ctx.memory(|memory| memory.focused().is_some()) { + return Vec::new(); + } + + ctx.input(|input| input.events.iter().filter_map(translate).collect()) +} + +fn translate(event: &egui::Event) -> Option { + match event { + // Characters come from `Text` rather than from `Key`, and only from + // there. egui emits both for a printable key, so reading them from both + // would dispatch every letter twice — pressing `d` would toggle + // simulation mode on and straight back off again. + egui::Event::Text(text) => text.chars().next().map(Key::Char), + egui::Event::Key { + key, + pressed: true, + modifiers, + .. + } => named_key(*key, *modifiers), + _ => None, + } +} + +fn named_key(key: egui::Key, modifiers: egui::Modifiers) -> Option { + Some(match key { + egui::Key::Enter => Key::Enter, + egui::Key::Escape => Key::Esc, + egui::Key::Backspace => Key::Backspace, + egui::Key::ArrowUp => Key::Up, + egui::Key::ArrowDown => Key::Down, + egui::Key::ArrowLeft => Key::Left, + egui::Key::ArrowRight => Key::Right, + // Bare Tab belongs to egui, which moves focus between widgets with it — + // taking it away would strip the window of keyboard navigation. Ctrl+Tab + // is free, and is what Windows applications cycle views with anyway. + egui::Key::Tab if modifiers.ctrl => { + if modifiers.shift { + Key::BackTab + } else { + Key::Tab + } + } + _ => return None, + }) +} diff --git a/src/gui/mod.rs b/src/gui/mod.rs new file mode 100644 index 0000000..da86d03 --- /dev/null +++ b/src/gui/mod.rs @@ -0,0 +1,589 @@ +//! The desktop front end. +//! +//! This replaced a ratatui terminal interface, and the replacement was mostly a +//! matter of drawing: [`crate::app::App`] holds the state, [`crate::engine`] +//! reports over channels, and neither had to learn anything about windows. The +//! immediate-mode loop below does what the terminal draw loop did — drain the +//! channels, refresh telemetry once a second, render every frame from state — +//! because that is the shape the application already had. +//! +//! | Module | Responsibility | +//! | --- | --- | +//! | [`theme`] | Palette, shared surfaces, severity colours | +//! | [`keys`] | egui key events into the neutral [`crate::app::Key`] | +//! | [`modals`] | Confirmation, setting entry and help overlays | +//! | [`views`] | One module per tab | + +pub mod keys; +pub mod modals; +pub mod theme; +pub mod views; + +use crate::app::{ + App, TAB_DASHBOARD, TAB_REPAIR, TAB_SCANNER, TAB_SETTINGS, TAB_TRIAGE, handle_key, +}; +use eframe::egui::{self, RichText}; +use std::time::{Duration, Instant}; + +/// The tab strip, in order. The indices are the `TAB_*` constants. +const TABS: [&str; 5] = [ + "Dashboard", + "Health Scan", + "Issue Triage", + "Repair Center", + "Settings & Safety", +]; + +/// How often to redraw while a scan or repair run is in flight. +/// +/// The terminal front end polled every 40ms and this matches it: fast enough +/// that a progress bar moves smoothly, slow enough to stay off the CPU. +const BUSY_REPAINT: Duration = Duration::from_millis(40); + +/// How often to redraw when nothing is running. +/// +/// Not zero, because the header carries live CPU and memory figures that would +/// otherwise freeze until the user moved the mouse. +const IDLE_REPAINT: Duration = Duration::from_millis(500); + +pub struct WinMedicApp { + app: App, + last_telemetry_tick: Instant, +} + +/// Draw the whole frame: header, tab strip, body, status bar and overlays. +/// +/// Separate from [`WinMedicApp::ui`], which owns the parts a test has no use +/// for — reading the keyboard and closing the window — so that a test can put +/// an [`App`] in a given state and assert on what the window then says. +pub fn show(ui: &mut egui::Ui, app: &mut App) { + // Cloned because the overlays are windows, which are addressed on the + // context rather than nested inside a `Ui`. + let ctx = ui.ctx().clone(); + + egui::Panel::top("header").show(ui, |ui| { + header(ui, app); + tab_bar(ui, app); + }); + + egui::Panel::bottom("footer").show(ui, |ui| { + footer(ui, app); + }); + + egui::CentralPanel::default().show(ui, |ui| { + body(ui, app); + }); + + // Overlays, in the order the terminal front end stacked them: a pending + // confirmation outranks a setting being edited, which outranks help. + modals::show(&ctx, app); +} + +impl WinMedicApp { + pub fn new(cc: &eframe::CreationContext<'_>) -> Self { + theme::apply(&cc.egui_ctx); + + let mut app = App::new(); + // `App::new` builds an app that cannot touch the desktop. This is the + // one place that wants it to: accepting the update dialog should really + // open a browser, accepting the elevation dialog should really raise + // UAC, and a repair run should really leave a restore point behind. + app.enable_real_system_actions(); + app.start_update_check(); + + Self { + app, + last_telemetry_tick: Instant::now(), + } + } +} + +fn header(ui: &mut egui::Ui, app: &mut App) { + ui.add_space(4.0); + ui.horizontal(|ui| { + ui.label( + RichText::new(format!("WinMedic v{}", env!("CARGO_PKG_VERSION"))) + .color(theme::CYAN) + .strong() + .size(16.0), + ); + ui.label(theme::muted("Windows Self-Healing Engine")); + + if app.dry_run { + theme::badge(ui, "SIMULATION", theme::AMBER); + } + + // Right-aligned, so the system readout sits opposite the brand and + // does not shift as the numbers change width. + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if app.is_admin { + theme::badge(ui, "ADMIN", theme::EMERALD); + } else { + theme::badge(ui, "NO ADMIN", theme::CORAL); + } + + match app.telemetry.as_ref() { + Some(telemetry) => { + ui.label(theme::muted(format!( + "{} {}", + telemetry.os_name, telemetry.os_version + ))); + ui.separator(); + ui.label(format!( + "RAM {:.1}/{:.1} GB", + telemetry.ram_used_mb as f32 / 1024.0, + telemetry.ram_total_mb as f32 / 1024.0 + )); + ui.separator(); + ui.label(format!("CPU {:.1}%", telemetry.cpu_usage)); + } + None => { + ui.label(theme::muted("Reading system telemetry...")); + } + } + }); + }); + ui.add_space(4.0); +} + +fn tab_bar(ui: &mut egui::Ui, app: &mut App) { + let open_issues = app.issues.iter().filter(|i| !i.is_fixed).count(); + + ui.horizontal(|ui| { + for (index, title) in TABS.iter().enumerate() { + // The two tabs that carry live information say so in the strip, + // so a user watching another tab still sees a scan finish. + let label = match index { + TAB_SCANNER if app.is_scanning => format!("{title} (running)"), + TAB_TRIAGE if open_issues > 0 => format!("{title} [{open_issues}]"), + _ => (*title).to_string(), + }; + + let selected = app.active_tab == index; + let text = if selected { + RichText::new(label).color(theme::CYAN).strong() + } else { + RichText::new(label).color(theme::MUTED) + }; + + if ui.selectable_label(selected, text).clicked() { + app.goto_tab(index); + } + } + }); + ui.add_space(2.0); +} + +fn footer(ui: &mut egui::Ui, app: &mut App) { + ui.add_space(3.0); + ui.horizontal(|ui| { + if app.dry_run { + theme::badge(ui, "SIMULATION", theme::AMBER); + } + + match app.status_message.as_deref() { + Some(message) => { + ui.label(RichText::new(message).color(theme::EMERALD)); + } + None => { + ui.label(theme::muted("Ready")); + } + } + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if ui.button("Help").clicked() { + app.show_help = true; + } + if app.is_busy() && ui.button("Cancel").clicked() { + app.cancel_current_operation(); + } + }); + }); + ui.add_space(3.0); +} + +fn body(ui: &mut egui::Ui, app: &mut App) { + match app.active_tab { + TAB_DASHBOARD => views::dashboard::show(ui, app), + TAB_SCANNER => views::scanner::show(ui, app), + TAB_TRIAGE => views::triage::show(ui, app), + TAB_REPAIR => views::repair::show(ui, app), + TAB_SETTINGS => views::settings::show(ui, app), + _ => {} + } +} + +impl eframe::App for WinMedicApp { + /// Everything that is not drawing. + /// + /// eframe calls this before every `ui` pass, and — unlike `ui` — it keeps + /// calling it while the window is hidden. That is exactly what this work + /// needs: a scan started before the window was minimised must still drain + /// its channels, or it would appear to have frozen the moment it was out of + /// sight and finish all at once on the way back. + fn logic(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + self.app.process_background_events(); + + if self.last_telemetry_tick.elapsed() >= Duration::from_secs(1) { + self.app.refresh_telemetry(); + self.last_telemetry_tick = Instant::now(); + } + + // egui only repaints in response to input, and almost nothing this + // window shows is driven by input: progress bars, log lines and the CPU + // readout in the header all come from work happening elsewhere. + ctx.request_repaint_after(if self.app.is_busy() { + BUSY_REPAINT + } else { + IDLE_REPAINT + }); + } + + fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame) { + for key in keys::shortcuts(ui.ctx()) { + handle_key(&mut self.app, key); + } + + show(ui, &mut self.app); + + if self.app.should_quit { + ui.ctx().send_viewport_cmd(egui::ViewportCommand::Close); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::app::{ConfirmRequest, TAB_COUNT}; + use crate::safety::audit::AuditEntry; + use crate::safety::reg_backup::BackupRecord; + use egui_kittest::Harness; + use egui_kittest::kittest::Queryable; + + /// Drive one frame of the whole window and hand back the result to query. + /// + /// The terminal front end's equivalent read the character buffer back out + /// of a `TestBackend`. A window has no character buffer, so these assert + /// against the accessibility tree instead — which is the more honest + /// target anyway: it is what a screen reader is given, so a label missing + /// from it is missing for a user, not merely for a test. + fn window(app: App) -> Harness<'static, App> { + let mut harness = Harness::builder() + .with_size(egui::vec2(1400.0, 900.0)) + .build_ui_state(|ui, app: &mut App| show(ui, app), app); + harness.run(); + harness + } + + fn populated_app() -> App { + let mut app = App::new(); + // `App::new` raises the elevation prompt when WinMedic is not running + // as Administrator, and that modal covers the tab it is asked about. + app.pending_confirm = None; + app.backup_records = vec![BackupRecord { + id: "b1".to_string(), + timestamp: "2026-01-01 12:00:00".to_string(), + description: "Startup entry removed".to_string(), + key_path: r"HKCU\Software\Microsoft\Windows\CurrentVersion\Run".to_string(), + file_path: r"C:\backups\b1.reg".to_string(), + }]; + app.vss_restore_points = vec!["2026-01-01 11:59 - WinMedic pre-repair".to_string()]; + app.audit_entries = vec![AuditEntry { + timestamp: "2026-01-01 12:00:00".to_string(), + action_type: "FIX".to_string(), + module_id: "registry_startup".to_string(), + title: "Disabled a startup entry".to_string(), + status: "SUCCESS".to_string(), + details: String::new(), + }]; + + // A finished run, so the Health Scan and Repair Center tabs are drawn + // with something in them. Their empty states are what a fresh `App` + // already gives; what these two tabs exist to show is a run. + app.scan_overall_progress = 100; + app.scan_duration = Some(Duration::from_secs(74)); + app.push_scan_log("Module 'network' finished."); + // Shaped the way `app::events` shapes it when the engine reports: a + // module that failed carries both the reason and the step line that + // states it, because the step line is what the scanner draws. + if let Some(module) = app.module_progress_list.first_mut() { + module.percent = 100; + module.is_done = true; + module.step = "Finished - 2 findings".to_string(); + } + if let Some(module) = app.module_progress_list.get_mut(1) { + module.percent = 100; + module.is_done = true; + module.failure = Some("DISM returned 0x800f081f".to_string()); + module.step = "Failed - DISM returned 0x800f081f".to_string(); + } + + app.total_to_fix = 3; + app.fixed_count = 2; + app.failed_count = 1; + app.current_fix_title = "Flushing the DNS resolver cache".to_string(); + app.vss_status = "Created".to_string(); + app.push_repair_log("[OK] DNS cache flushed."); + app.push_repair_log("[X] Failed: access denied."); + + app + } + + /// Layout only fails at draw time, so a tab no window size can satisfy + /// fails here rather than in front of a user. + #[test] + fn every_tab_draws_at_small_and_large_window_sizes() { + for (tab, title) in TABS.iter().enumerate() { + for size in [(960.0, 640.0), (1400.0, 900.0), (1920.0, 1200.0)] { + let mut app = populated_app(); + app.active_tab = tab; + + let mut harness = Harness::builder() + .with_size(egui::vec2(size.0, size.1)) + .build_ui_state(|ui, app: &mut App| show(ui, app), app); + harness.run(); + + assert!( + harness.query_by_label_contains(title).is_some(), + "tab {tab} at {}x{} did not draw its own strip entry", + size.0, + size.1 + ); + } + } + } + + #[test] + fn the_strip_offers_exactly_five_tabs() { + // The strip and the `TAB_*` constants index each other, so they have to + // agree; a label added to one without the other silently misroutes + // every click past it. + assert_eq!(TABS.len(), TAB_COUNT); + + let harness = window(populated_app()); + + for title in TABS { + assert!( + harness.query_by_label_contains(title).is_some(), + "missing tab: {title}" + ); + } + + // The sixth tab was merged into Settings & Safety and must not come + // back as a label the user can look for. + assert!(harness.query_by_label_contains("Backups & Logs").is_none()); + } + + /// The whole point of that merge: none of the safety surface may go missing. + #[test] + fn the_settings_tab_carries_the_whole_safety_surface() { + let mut app = populated_app(); + app.active_tab = TAB_SETTINGS; + let harness = window(app); + + for expected in [ + "SETTINGS", + "REGISTRY BACKUPS", + "SYSTEM RESTORE POINTS", + "LOGS & BACKUPS", + "Startup entry removed", + "Restore the selected snapshot", + ] { + assert!( + harness.query_by_label_contains(expected).is_some(), + "the safety surface lost: {expected}" + ); + } + } + + #[test] + fn the_dashboard_links_back_to_the_audit_trail_it_does_not_own() { + let mut app = populated_app(); + app.active_tab = TAB_DASHBOARD; + let harness = window(app); + + assert!(harness.query_by_label_contains("Last action:").is_some()); + assert!( + harness + .query_by_label_contains("Disabled a startup entry") + .is_some() + ); + assert!( + harness + .query_by_label_contains("Full log, backups & rollback") + .is_some(), + "and points at the tab that now holds it" + ); + } + + #[test] + fn a_machine_with_no_audit_trail_shows_no_empty_last_action_row() { + let mut app = populated_app(); + app.active_tab = TAB_DASHBOARD; + app.audit_entries.clear(); + + let harness = window(app); + assert!(harness.query_by_label_contains("Last action:").is_none()); + } + + /// A confirmation is a question about the machine, and it has to be visible + /// whichever tab the user happened to be on when it was raised. + #[test] + fn a_pending_confirmation_is_drawn_over_every_tab() { + for tab in 0..TAB_COUNT { + let mut app = populated_app(); + app.active_tab = tab; + app.pending_confirm = Some(ConfirmRequest::Elevate); + + let harness = window(app); + assert!( + harness + .query_by_label_contains("ADMINISTRATOR PRIVILEGES REQUIRED") + .is_some(), + "the elevation dialog is missing on tab {tab}" + ); + assert!( + harness + .query_by_label_contains("Continue without Administrator") + .is_some(), + "and offers no way out on tab {tab}" + ); + } + } + + /// Every character the window draws must exist in the fonts egui bundles. + /// + /// This guard has a specific history. The settings pane announced which + /// list owned the arrow keys with the glyphs the terminal front end used, + /// and all three reached the screen as empty boxes: a terminal inherits the + /// system's font coverage, while a window ships its own, and egui's is a + /// Latin text face with no arrows or geometric shapes in it. Nothing failed + /// — it just looked broken. + #[test] + fn every_character_the_window_draws_has_a_glyph() { + for tab in 0..TAB_COUNT { + let mut app = populated_app(); + app.active_tab = tab; + // Machine-supplied text — the CPU model, the host name — is not + // ours to word and differs per machine, which would make this + // assert on the test runner's hardware instead of on WinMedic. + app.telemetry = None; + + let harness = window(app); + + // Both properties, because AccessKit splits them: an interactive + // widget carries its text in `label`, while a plain piece of text — + // which is most of what this window is — is a node of role `Label` + // carrying its text in `value`. Reading only the former collects + // the buttons and none of the prose. + let drawn = std::cell::RefCell::new(Vec::new()); + harness + .query_all_by(|node| { + let mut drawn = drawn.borrow_mut(); + drawn.extend(node.label()); + drawn.extend(node.value()); + false + }) + .count(); + let drawn = drawn.into_inner(); + assert!( + drawn.len() > 20, + "tab {tab} produced only {} strings, so this asserts on nothing", + drawn.len() + ); + + let font = egui::FontId::proportional(14.0); + harness.ctx.fonts_mut(|fonts| { + for label in &drawn { + for character in label.chars() { + assert!( + fonts.has_glyph(&font, character), + "tab {tab}: no glyph for U+{:04X} ({character:?}) in {label:?}", + character as u32 + ); + } + } + }); + } + } + + /// A finished run has to be legible after the fact, not only while it runs: + /// how long it took, which module gave up and why, and what the repair pass + /// managed. The failure line matters most — a module that quit mid-scan is + /// the single thing a user most needs to see. + #[test] + fn the_scan_and_repair_tabs_report_a_finished_run() { + let mut app = populated_app(); + app.active_tab = TAB_SCANNER; + let harness = window(app); + + assert!( + harness.query_by_label_contains("1m 14s").is_some(), + "the scan duration is missing" + ); + assert!( + harness + .query_by_label_contains("DISM returned 0x800f081f") + .is_some(), + "a module that failed must say so" + ); + assert!( + harness + .query_by_label_contains("Module 'network' finished.") + .is_some(), + "the scan log is missing" + ); + + let mut app = populated_app(); + app.active_tab = TAB_REPAIR; + let harness = window(app); + + assert!(harness.query_by_label_contains("2 repaired").is_some()); + assert!(harness.query_by_label_contains("1 failed").is_some()); + assert!(harness.query_by_label_contains("VSS: Created").is_some()); + assert!( + harness + .query_by_label_contains("[X] Failed: access denied.") + .is_some(), + "the repair console is missing" + ); + } + + /// An empty triage tab has to say why it is empty, and the two reasons are + /// not the same: nothing scanned yet, versus nothing left after filtering. + #[test] + fn the_triage_tab_distinguishes_no_scan_from_no_matches() { + let mut app = populated_app(); + app.active_tab = TAB_TRIAGE; + let harness = window(app); + assert!( + harness + .query_by_label_contains("No scan has run yet.") + .is_some() + ); + + let mut app = populated_app(); + app.active_tab = TAB_TRIAGE; + app.issues = vec![crate::engine::issue::Issue::new( + "a", + "network", + "DNS cache full", + "Network", + crate::engine::issue::Severity::Critical, + crate::engine::issue::RiskScore::Low, + "description", + "details", + "fix", + vec![], + )]; + app.search_query = "nothing matches this".to_string(); + + let harness = window(app); + assert!( + harness + .query_by_label_contains("Nothing matches the current filters.") + .is_some() + ); + } +} diff --git a/src/gui/modals.rs b/src/gui/modals.rs new file mode 100644 index 0000000..b8b53dd --- /dev/null +++ b/src/gui/modals.rs @@ -0,0 +1,189 @@ +//! The three overlays, stacked in the order the terminal front end stacked them. +//! +//! Precedence matters and is not cosmetic: a pending confirmation is a question +//! about the machine that must be answered before anything else happens, so it +//! outranks a setting being edited, which in turn outranks the help sheet. +//! [`crate::app::input`] enforces exactly the same order for the keyboard. + +use crate::app::App; +use crate::gui::theme; +use eframe::egui::{self, RichText}; + +pub fn show(ctx: &egui::Context, app: &mut App) { + if app.pending_confirm.is_some() { + confirm(ctx, app); + } else if app.setting_input.is_some() { + setting_input(ctx, app); + } else if app.show_help { + help(ctx, app); + } +} + +/// The frame every overlay shares: modal, centred, not resizable. +fn modal_window<'a>(title: &'a str) -> egui::Window<'a> { + egui::Window::new(title) + .collapsible(false) + .resizable(false) + .anchor(egui::Align2::CENTER_CENTER, egui::vec2(0.0, 0.0)) +} + +fn confirm(ctx: &egui::Context, app: &mut App) { + let Some(request) = app.pending_confirm.as_ref() else { + return; + }; + + // Cloned out of `app` before the closure, which needs `app` mutably in + // order to answer the question the request is asking. + let title = request.title(); + let body = request.body(); + let confirm_label = request.confirm_label(); + let dismiss_label = request.dismiss_label(); + + let mut confirmed = false; + let mut dismissed = false; + + modal_window(title).show(ctx, |ui| { + ui.set_max_width(560.0); + + for line in &body { + if line.is_empty() { + ui.add_space(6.0); + } else { + ui.label(line); + } + } + + ui.add_space(10.0); + ui.separator(); + ui.add_space(6.0); + + ui.horizontal(|ui| { + if ui + .add( + egui::Button::new(RichText::new(confirm_label).color(theme::BG_DEEP).strong()) + .fill(theme::CYAN), + ) + .clicked() + { + confirmed = true; + } + if ui.button(dismiss_label).clicked() { + dismissed = true; + } + }); + }); + + if confirmed { + app.confirm_pending_action(); + } else if dismissed { + app.dismiss_confirm(); + } +} + +fn setting_input(ctx: &egui::Context, app: &mut App) { + let mut submitted = false; + let mut cancelled = false; + + // Held across the closure so the text field can write straight into the + // buffer `submit_setting_input` validates. + let Some(input) = app.setting_input.as_mut() else { + return; + }; + let title = input.setting_name.clone(); + let unit = input.unit.clone(); + let min = input.min_value; + let max = input.max_value; + let error = input.error_msg.clone(); + + modal_window("Edit setting").show(ctx, |ui| { + ui.set_max_width(420.0); + + ui.label(RichText::new(&title).color(theme::CYAN).strong()); + ui.label(theme::muted(format!("Allowed: {min}–{max} {unit}"))); + ui.add_space(8.0); + + let field = ui.add( + egui::TextEdit::singleline(&mut input.buffer) + .desired_width(f32::INFINITY) + .hint_text("Enter a number"), + ); + // Opening the dialog should put the caret in the field, the way the + // terminal front end put every keystroke there. + if field.changed() { + input.error_msg = None; + } + field.request_focus(); + + if let Some(message) = error.as_deref() { + ui.add_space(4.0); + ui.label(RichText::new(message).color(theme::CORAL)); + } + + ui.add_space(10.0); + ui.horizontal(|ui| { + let enter_pressed = ui.input(|i| i.key_pressed(egui::Key::Enter)); + if ui.button("Save").clicked() || enter_pressed { + submitted = true; + } + if ui.button("Cancel").clicked() || ui.input(|i| i.key_pressed(egui::Key::Escape)) { + cancelled = true; + } + }); + }); + + if submitted { + app.submit_setting_input(); + } else if cancelled { + app.cancel_setting_input(); + } +} + +fn help(ctx: &egui::Context, app: &mut App) { + let mut close = false; + + modal_window("Keyboard shortcuts").show(ctx, |ui| { + ui.set_max_width(520.0); + ui.label(theme::muted( + "Every action below is also a button in the window; these are the shortcuts.", + )); + ui.add_space(8.0); + + for (keys, description) in SHORTCUTS { + ui.horizontal(|ui| { + ui.label(RichText::new(*keys).color(theme::CYAN).strong()); + ui.label(*description); + }); + } + + ui.add_space(10.0); + ui.separator(); + ui.add_space(6.0); + if ui.button("Close").clicked() || ui.input(|i| i.key_pressed(egui::Key::Escape)) { + close = true; + } + }); + + if close { + app.show_help = false; + } +} + +const SHORTCUTS: &[(&str, &str)] = &[ + ("1 – 5", "Jump to a tab"), + ("Ctrl+Tab / Ctrl+Shift+Tab", "Cycle through the tabs"), + ("S / R", "Start a health scan"), + ("F", "Repair the selected issues"), + ("D", "Toggle simulation mode"), + ("A / N", "Select or deselect every issue"), + ("Space", "Toggle the highlighted issue"), + ("C / W / I", "Filter by critical, warning or info"), + ("M / X", "Cycle the module filter, clear all filters"), + ("E", "Export an HTML report"), + ("U", "Roll back a registry backup (Settings & Safety)"), + ("B", "Move focus between settings and backups"), + ( + "Esc", + "Unwind: filters, then focus, then a running operation", + ), + ("Q", "Quit"), +]; diff --git a/src/gui/theme.rs b/src/gui/theme.rs new file mode 100644 index 0000000..d12b249 --- /dev/null +++ b/src/gui/theme.rs @@ -0,0 +1,115 @@ +//! The visual identity, carried over unchanged from the terminal front end. +//! +//! The palette is the same set of colours WinMedic has always used, because it +//! is the same product: cyan is the brand, and emerald / amber / coral are the +//! three severities the whole tool is organised around. What changed is only +//! how they reach the screen — egui takes `Color32` where ratatui took `Color`. + +use crate::engine::issue::Severity; +use eframe::egui::{self, Color32, RichText, Stroke, Visuals}; + +// Cyber-Medic / Dark Slate palette. +/// Primary brand colour. +pub const CYAN: Color32 = Color32::from_rgb(0, 210, 255); +/// Success / healthy. +pub const EMERALD: Color32 = Color32::from_rgb(16, 185, 129); +/// Warning. +pub const AMBER: Color32 = Color32::from_rgb(245, 158, 11); +/// Critical / error. +pub const CORAL: Color32 = Color32::from_rgb(239, 68, 68); +/// Window background. +pub const BG_DEEP: Color32 = Color32::from_rgb(15, 23, 42); +/// Card and panel surface. +pub const CARD_SURFACE: Color32 = Color32::from_rgb(30, 41, 59); +/// Borders and inactive elements. +pub const BORDER: Color32 = Color32::from_rgb(71, 85, 105); +/// Secondary text. +pub const MUTED: Color32 = Color32::from_rgb(148, 163, 184); +/// Primary text. +pub const TEXT_WHITE: Color32 = Color32::from_rgb(248, 250, 252); +pub const ACCENT_PURPLE: Color32 = Color32::from_rgb(168, 85, 247); + +/// The darkest surface, for sunken areas: log views and text fields. +/// +/// The terminal front end got this for free — anything it did not paint was the +/// terminal's own background. A window has no such default, so the shade the +/// logs used to sit on has to be named. +pub const BG_SUNKEN: Color32 = Color32::from_rgb(2, 6, 23); + +/// Install the palette on a freshly created context. +/// +/// Called once at startup rather than per frame: egui keeps the style until it +/// is replaced, and rebuilding it every frame would throw away any adjustment +/// made in between. +pub fn apply(ctx: &egui::Context) { + let mut visuals = Visuals::dark(); + + visuals.panel_fill = BG_DEEP; + visuals.window_fill = CARD_SURFACE; + visuals.faint_bg_color = CARD_SURFACE; + visuals.extreme_bg_color = BG_SUNKEN; + visuals.window_stroke = Stroke::new(1.0, BORDER); + visuals.hyperlink_color = CYAN; + visuals.selection.bg_fill = CYAN.linear_multiply(0.35); + visuals.selection.stroke = Stroke::new(1.0, CYAN); + + ctx.set_visuals(visuals); + + ctx.all_styles_mut(|style| { + style.spacing.item_spacing = egui::vec2(8.0, 6.0); + style.spacing.button_padding = egui::vec2(10.0, 5.0); + }); +} + +/// The colour that stands for a severity, everywhere it is shown. +pub fn severity_color(severity: Severity) -> Color32 { + match severity { + Severity::Critical => CORAL, + Severity::Warning => AMBER, + Severity::Info => CYAN, + } +} + +/// The colour a health score should be read in. +/// +/// The thresholds match what the score already means elsewhere in the tool, so +/// a machine the dashboard calls healthy is never painted in the warning colour. +pub fn health_color(score: u8) -> Color32 { + match score { + 80..=100 => EMERALD, + 50..=79 => AMBER, + _ => CORAL, + } +} + +/// A titled surface, the direct equivalent of the terminal front end's bordered +/// block. Everything that was a box on screen stays a box. +pub fn card(ui: &mut egui::Ui, title: &str, add: impl FnOnce(&mut egui::Ui) -> R) { + egui::Frame::group(ui.style()) + .fill(CARD_SURFACE) + .stroke(Stroke::new(1.0, BORDER)) + .show(ui, |ui| { + // Without this the frame shrinks to its content and a row of cards + // ends up ragged, each one a different width. + ui.set_width(ui.available_width()); + ui.label(RichText::new(title).color(CYAN).strong()); + ui.separator(); + add(ui); + }); +} + +/// A small filled badge: the admin state, the simulation mode, a severity count. +pub fn badge(ui: &mut egui::Ui, text: &str, fill: Color32) { + egui::Frame::NONE + .fill(fill) + .inner_margin(egui::Margin::symmetric(6, 2)) + .corner_radius(3) + .show(ui, |ui| { + ui.label(RichText::new(text).color(BG_DEEP).strong().size(11.0)); + }); +} + +/// Muted secondary text, for everything that labels rather than reports. +pub fn muted(text: impl Into) -> RichText { + RichText::new(text.into()).color(MUTED) +} diff --git a/src/gui/views/dashboard.rs b/src/gui/views/dashboard.rs new file mode 100644 index 0000000..7a10a06 --- /dev/null +++ b/src/gui/views/dashboard.rs @@ -0,0 +1,202 @@ +//! The landing tab: how healthy the machine is, what the last scan found, and +//! the one button that starts another one. + +use crate::app::{App, TAB_SETTINGS}; +use crate::engine::issue::Severity; +use crate::gui::theme; +use crate::modules::ModuleStatus; +use eframe::egui::{self, RichText}; + +pub fn show(ui: &mut egui::Ui, app: &mut App) { + egui::ScrollArea::vertical().show(ui, |ui| { + ui.columns(2, |columns| { + health(&mut columns[0], app); + system(&mut columns[1], app); + }); + + ui.add_space(8.0); + modules(ui, app); + ui.add_space(8.0); + last_action(ui, app); + }); +} + +fn health(ui: &mut egui::Ui, app: &mut App) { + theme::card(ui, "SYSTEM HEALTH", |ui| { + let score = app.health_score; + + ui.horizontal(|ui| { + ui.label( + RichText::new(format!("{score}")) + .color(theme::health_color(score)) + .strong() + .size(46.0), + ); + ui.vertical(|ui| { + ui.add_space(14.0); + ui.label(theme::muted("out of 100")); + ui.label(RichText::new(verdict(score)).color(theme::health_color(score))); + }); + }); + + ui.add_space(6.0); + ui.add( + egui::ProgressBar::new(score as f32 / 100.0) + .fill(theme::health_color(score)) + .desired_height(8.0), + ); + ui.add_space(10.0); + + let counts = severity_counts(app); + ui.horizontal(|ui| { + theme::badge(ui, &format!("{} critical", counts.0), theme::CORAL); + theme::badge(ui, &format!("{} warnings", counts.1), theme::AMBER); + theme::badge(ui, &format!("{} info", counts.2), theme::CYAN); + }); + + ui.add_space(12.0); + ui.horizontal(|ui| { + let busy = app.is_busy(); + if ui + .add_enabled(!busy, egui::Button::new("Start health scan")) + .clicked() + { + app.start_scan(); + } + let mut dry_run = app.dry_run; + if ui.checkbox(&mut dry_run, "Simulation mode").changed() { + app.toggle_dry_run(); + } + }); + }); +} + +fn verdict(score: u8) -> &'static str { + match score { + 95..=100 => "Healthy", + 80..=94 => "Minor findings", + 50..=79 => "Needs attention", + _ => "Critical", + } +} + +fn severity_counts(app: &App) -> (usize, usize, usize) { + let open = || app.issues.iter().filter(|issue| !issue.is_fixed); + ( + open().filter(|i| i.severity == Severity::Critical).count(), + open().filter(|i| i.severity == Severity::Warning).count(), + open().filter(|i| i.severity == Severity::Info).count(), + ) +} + +fn system(ui: &mut egui::Ui, app: &mut App) { + theme::card(ui, "SYSTEM", |ui| { + let Some(telemetry) = app.telemetry.as_ref() else { + ui.label(theme::muted("Reading system telemetry...")); + return; + }; + + ui.label(RichText::new(&telemetry.cpu_name).strong()); + ui.label(theme::muted(format!( + "{} {} · {} · {} cores", + telemetry.os_name, telemetry.os_version, telemetry.host_name, telemetry.cpu_count + ))); + ui.add_space(8.0); + + meter( + ui, + "CPU", + telemetry.cpu_usage / 100.0, + &format!("{:.1}%", telemetry.cpu_usage), + ); + meter( + ui, + "Memory", + telemetry.ram_usage_percent / 100.0, + &format!( + "{:.1} / {:.1} GB", + telemetry.ram_used_mb as f32 / 1024.0, + telemetry.ram_total_mb as f32 / 1024.0 + ), + ); + + ui.add_space(8.0); + for disk in &telemetry.disks { + meter( + ui, + &disk.mount_point, + disk.used_percent / 100.0, + &format!( + "{:.0} GB free of {:.0} GB", + disk.available_space_gb, disk.total_space_gb + ), + ); + } + }); +} + +/// A labelled bar. Load is coloured the same way a health score is, so a disk +/// at 95% reads as critical without needing a legend. +fn meter(ui: &mut egui::Ui, label: &str, fraction: f32, value: &str) { + ui.horizontal(|ui| { + ui.label(theme::muted(label)); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.label(value); + }); + }); + ui.add( + egui::ProgressBar::new(fraction.clamp(0.0, 1.0)) + .fill(theme::health_color( + 100u8.saturating_sub((fraction * 100.0) as u8), + )) + .desired_height(6.0), + ); + ui.add_space(4.0); +} + +fn modules(ui: &mut egui::Ui, app: &mut App) { + theme::card(ui, "DIAGNOSTIC MODULES", |ui| { + for (_, name, icon, status) in &app.module_statuses { + ui.horizontal(|ui| { + ui.label(icon.as_str()); + ui.label(name.as_str()); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + let (text, color) = describe(status); + ui.label(RichText::new(text).color(color)); + }); + }); + } + }); +} + +fn describe(status: &ModuleStatus) -> (String, egui::Color32) { + match status { + ModuleStatus::Idle => ("Not scanned".to_string(), theme::MUTED), + ModuleStatus::Scanning => ("Scanning...".to_string(), theme::CYAN), + ModuleStatus::Passed => ("Passed".to_string(), theme::EMERALD), + ModuleStatus::Warning(n) => (format!("{n} warnings"), theme::AMBER), + ModuleStatus::Critical(n) => (format!("{n} critical"), theme::CORAL), + ModuleStatus::Failed(error) => (format!("Failed: {error}"), theme::CORAL), + } +} + +/// The audit trail's most recent entry, and a way to the rest of it. +/// +/// A machine that has never been repaired has no last action, and an empty row +/// saying so is worse than no row at all. +fn last_action(ui: &mut egui::Ui, app: &mut App) { + let Some(entry) = app.audit_entries.last().cloned() else { + return; + }; + + theme::card(ui, "AUDIT TRAIL", |ui| { + ui.horizontal(|ui| { + ui.label(theme::muted("Last action:")); + ui.label(RichText::new(&entry.title).strong()); + ui.label(theme::muted(format!("({})", entry.timestamp))); + }); + if ui.link("Full log, backups & rollback").clicked() { + app.goto_tab(TAB_SETTINGS); + } + }); +} diff --git a/src/gui/views/mod.rs b/src/gui/views/mod.rs new file mode 100644 index 0000000..626b08a --- /dev/null +++ b/src/gui/views/mod.rs @@ -0,0 +1,12 @@ +//! One module per tab, in the order the tab strip shows them. +//! +//! Each exposes a single `show(ui, app)`. They take `&mut App` rather than the +//! handful of fields they read, because in an immediate-mode UI a button *is* +//! the action: the Repair Center's start button calls `App::start_repairs` +//! directly instead of routing a keystroke through the dispatch table first. + +pub mod dashboard; +pub mod repair; +pub mod scanner; +pub mod settings; +pub mod triage; diff --git a/src/gui/views/repair.rs b/src/gui/views/repair.rs new file mode 100644 index 0000000..b248b19 --- /dev/null +++ b/src/gui/views/repair.rs @@ -0,0 +1,116 @@ +//! The repair run: what is being fixed, how far along it is, and the console +//! output of the commands doing it. + +use crate::app::App; +use crate::gui::theme; +use eframe::egui::{self, RichText}; + +pub fn show(ui: &mut egui::Ui, app: &mut App) { + status(ui, app); + ui.add_space(8.0); + console(ui, app); +} + +fn status(ui: &mut egui::Ui, app: &mut App) { + theme::card( + ui, + if app.dry_run { + "SIMULATED REPAIR RUN" + } else { + "REPAIR RUN" + }, + |ui| { + let selected = app + .issues + .iter() + .filter(|i| i.is_selected && !i.is_fixed) + .count(); + + ui.horizontal(|ui| { + if app.is_fixing { + if ui.button("Cancel").clicked() { + app.cancel_current_operation(); + } + } else { + if ui + .add_enabled( + selected > 0, + egui::Button::new(if app.dry_run { + "Simulate repairs" + } else { + "Start repairs" + }), + ) + .clicked() + { + app.start_repairs(); + } + let mut dry_run = app.dry_run; + if ui.checkbox(&mut dry_run, "Simulation mode").changed() { + app.toggle_dry_run(); + } + } + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.label(theme::muted(format!("VSS: {}", app.vss_status))); + }); + }); + + ui.add_space(8.0); + + let total = app.total_to_fix.max(1); + let done = app.fixed_count + app.failed_count; + ui.add( + egui::ProgressBar::new(done as f32 / total as f32) + .fill(if app.failed_count > 0 { + theme::AMBER + } else { + theme::EMERALD + }) + .text(format!("{done} / {}", app.total_to_fix)), + ); + + ui.add_space(6.0); + ui.horizontal(|ui| { + theme::badge(ui, &format!("{} repaired", app.fixed_count), theme::EMERALD); + if app.failed_count > 0 { + theme::badge(ui, &format!("{} failed", app.failed_count), theme::CORAL); + } + if !app.current_fix_title.is_empty() { + ui.label(theme::muted(&app.current_fix_title)); + } + }); + + if !app.is_fixing && app.total_to_fix == 0 && selected == 0 { + ui.add_space(6.0); + ui.label(theme::muted( + "Nothing is selected. Pick the findings to repair on the Issue Triage tab.", + )); + } + }, + ); +} + +fn console(ui: &mut egui::Ui, app: &mut App) { + theme::card(ui, "CONSOLE", |ui| { + egui::ScrollArea::vertical() + .id_salt("repair_console") + .stick_to_bottom(true) + .auto_shrink([false, false]) + .show(ui, |ui| { + for line in &app.repair_console_lines { + // The engine already marks its own outcomes in the text, so + // colouring on those markers keeps a long run scannable + // without the view having to parse anything. + let color = if line.contains("[X]") || line.contains("Failed") { + theme::CORAL + } else if line.contains("[OK]") { + theme::EMERALD + } else { + theme::MUTED + }; + ui.label(RichText::new(line).monospace().color(color)); + } + }); + }); +} diff --git a/src/gui/views/scanner.rs b/src/gui/views/scanner.rs new file mode 100644 index 0000000..ae46862 --- /dev/null +++ b/src/gui/views/scanner.rs @@ -0,0 +1,124 @@ +//! The live scan: one row per diagnostic module, and the log they all write to. + +use crate::app::App; +use crate::gui::theme; +use eframe::egui::{self, RichText}; +use std::time::Duration; + +pub fn show(ui: &mut egui::Ui, app: &mut App) { + controls(ui, app); + ui.add_space(8.0); + + // The log takes whatever the module list leaves over, with a floor, so a + // short window shows a usable amount of both instead of squeezing the log + // to a single line. + let log_height = (ui.available_height() * 0.35).max(140.0); + + egui::Panel::bottom("scan_log") + .exact_size(log_height) + .show_separator_line(false) + .frame(egui::Frame::NONE) + .show(ui, |ui| log(ui, app)); + + modules(ui, app); +} + +fn controls(ui: &mut egui::Ui, app: &mut App) { + ui.horizontal(|ui| { + if app.is_scanning { + if ui.button("Cancel scan").clicked() { + app.cancel_current_operation(); + } + } else if ui.button("Start health scan").clicked() { + app.start_scan(); + } + + ui.add_space(12.0); + + let progress = app.scan_overall_progress as f32 / 100.0; + ui.add( + egui::ProgressBar::new(progress) + .fill(theme::CYAN) + .desired_width(260.0) + .text(format!("{}%", app.scan_overall_progress)), + ); + + if let Some(elapsed) = app.scan_elapsed() { + ui.label(theme::muted(format!( + "{} {}", + if app.is_scanning { "running" } else { "took" }, + format_duration(elapsed) + ))); + } + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.label(theme::muted(format!("{} issues found", app.issues.len()))); + }); + }); +} + +fn modules(ui: &mut egui::Ui, app: &mut App) { + egui::ScrollArea::vertical() + .id_salt("scan_modules") + .show(ui, |ui| { + for module in &app.module_progress_list { + theme::card(ui, &format!("{} {}", module.icon, module.name), |ui| { + let color = if module.failure.is_some() { + theme::CORAL + } else if module.is_done { + theme::EMERALD + } else { + theme::CYAN + }; + + ui.add( + egui::ProgressBar::new(module.percent as f32 / 100.0) + .fill(color) + .desired_height(8.0), + ); + + ui.horizontal(|ui| { + let step = if module.step.is_empty() { + "Waiting..." + } else { + &module.step + }; + ui.label(RichText::new(step).color(color)); + + // How long the current step has been running is the + // difference between "working" and "hung" for a module + // sitting on a slow DISM call with nothing to report. + if let Some(elapsed) = module.step_elapsed() + && elapsed >= Duration::from_secs(3) + { + ui.label(theme::muted(format!("({})", format_duration(elapsed)))); + } + }); + }); + } + }); +} + +fn log(ui: &mut egui::Ui, app: &mut App) { + theme::card(ui, "SCAN LOG", |ui| { + egui::ScrollArea::vertical() + .id_salt("scan_log_scroll") + .stick_to_bottom(true) + .auto_shrink([false, false]) + .show(ui, |ui| { + for line in &app.scan_log_messages { + ui.label(RichText::new(line).monospace().color(theme::MUTED)); + } + }); + }); +} + +/// `1m 04s` rather than `64.213s`, which is what a progress readout wants. +pub fn format_duration(duration: Duration) -> String { + let seconds = duration.as_secs(); + if seconds >= 60 { + format!("{}m {:02}s", seconds / 60, seconds % 60) + } else { + format!("{seconds}s") + } +} diff --git a/src/gui/views/settings.rs b/src/gui/views/settings.rs new file mode 100644 index 0000000..30e625c --- /dev/null +++ b/src/gui/views/settings.rs @@ -0,0 +1,180 @@ +//! Settings and the safety surface on one tab: what WinMedic is allowed to do +//! to this machine, and how to undo what it has already done. +//! +//! These were two tabs in the terminal front end and were merged for a reason +//! that still holds — every action the backup list offers is the same kind of +//! "what may this tool touch" decision the settings list is made of. + +use crate::app::{App, SafetyFocus}; +use crate::config::AppConfig; +use crate::gui::theme; +use eframe::egui::{self, RichText}; + +pub fn show(ui: &mut egui::Ui, app: &mut App) { + ui.columns(2, |columns| { + settings(&mut columns[0], app); + safety(&mut columns[1], app); + }); +} + +fn settings(ui: &mut egui::Ui, app: &mut App) { + egui::ScrollArea::vertical() + .id_salt("settings_list") + .auto_shrink([false, false]) + .show(ui, |ui| { + let focused = !app.backups_focused(); + theme::card(ui, &focus_title("SETTINGS", focused), |ui| { + for index in 0..AppConfig::SETTING_COUNT { + let Some((label, value, explanation)) = app.config.setting_row(index) else { + continue; + }; + + // The arrow keys move `selected_setting_index`, so the row + // it points at has to be visible. Without this the keyboard + // moves a selection nothing on screen shows. + let fill = if focused && index == app.selected_setting_index { + theme::BG_SUNKEN + } else { + egui::Color32::TRANSPARENT + }; + + egui::Frame::NONE + .fill(fill) + .inner_margin(egui::Margin::symmetric(6, 4)) + .show(ui, |ui| { + ui.horizontal(|ui| { + ui.label(RichText::new(label).strong()); + ui.with_layout( + egui::Layout::right_to_left(egui::Align::Center), + |ui| { + // The two numeric settings open the input + // dialog; the rest are booleans a click + // can flip outright. + let numeric = matches!(index, 4 | 5); + if ui.button(&value).clicked() { + app.safety_focus = SafetyFocus::Settings; + app.selected_setting_index = index; + if numeric { + app.open_setting_input(); + } else { + app.toggle_current_setting(); + } + } + }, + ); + }); + ui.label(theme::muted(explanation)); + }); + ui.add_space(4.0); + } + }); + }); +} + +/// Say which of the two lists the arrow keys are currently driving. +/// +/// The terminal front end put this in the pane titles, and it is needed just as +/// much here: `[B]` moves the arrows between the settings and the snapshots, +/// and a focus the user cannot see is a focus they cannot use. +/// +/// Spelled out in words rather than drawn with the arrow glyphs the terminal +/// front end used: the fonts egui bundles have no glyph for U+25C4 or +/// U+2191/U+2193, so all three reached the screen as empty boxes. +fn focus_title(title: &str, focused: bool) -> String { + if focused { + format!("{title} (arrow keys)") + } else { + format!("{title} ([B] to focus)") + } +} + +fn safety(ui: &mut egui::Ui, app: &mut App) { + egui::ScrollArea::vertical() + .id_salt("safety_panel") + .auto_shrink([false, false]) + .show(ui, |ui| { + backups(ui, app); + ui.add_space(8.0); + restore_points(ui, app); + ui.add_space(8.0); + + theme::card(ui, "LOGS & BACKUPS", |ui| { + ui.label( + RichText::new(app.audit_logger.log_dir().to_string_lossy()) + .monospace() + .size(11.0), + ); + if ui.button("Export HTML report").clicked() { + app.status_message = Some(match app.export_report() { + Ok(path) => format!("Report exported: {}", path.display()), + Err(error) => error, + }); + } + }); + }); +} + +fn backups(ui: &mut egui::Ui, app: &mut App) { + let focused = app.backups_focused(); + theme::card(ui, &focus_title("REGISTRY BACKUPS", focused), |ui| { + let records: Vec<_> = app.backups_newest_first().into_iter().cloned().collect(); + + if records.is_empty() { + ui.label(theme::muted( + "No registry snapshot has been taken yet. WinMedic writes one before it changes a key.", + )); + return; + } + + for (position, record) in records.iter().enumerate() { + let selected = position == app.selected_backup_index; + let response = ui.selectable_label( + selected, + RichText::new(format!("{} {}", record.timestamp, record.description)), + ); + if response.clicked() { + app.safety_focus = SafetyFocus::Backups; + app.selected_backup_index = position; + } + if selected { + ui.label(theme::muted(&record.key_path)); + } + } + + ui.add_space(8.0); + if ui + .add_enabled( + !app.is_restoring, + egui::Button::new("Restore the selected snapshot"), + ) + .clicked() + { + app.request_rollback(); + } + }); +} + +fn restore_points(ui: &mut egui::Ui, app: &mut App) { + theme::card(ui, "SYSTEM RESTORE POINTS", |ui| { + if app.restore_points_loading { + ui.horizontal(|ui| { + ui.spinner(); + ui.label(theme::muted("Asking Windows for its restore points...")); + }); + return; + } + + if app.vss_restore_points.is_empty() { + ui.label(theme::muted("No restore points reported.")); + } else { + for point in &app.vss_restore_points { + ui.label(RichText::new(point).size(12.0)); + } + } + + ui.add_space(8.0); + if ui.button("Refresh").clicked() { + app.refresh_restore_points(); + } + }); +} diff --git a/src/gui/views/triage.rs b/src/gui/views/triage.rs new file mode 100644 index 0000000..3a9de66 --- /dev/null +++ b/src/gui/views/triage.rs @@ -0,0 +1,247 @@ +//! Issue triage: what the scan found, filtered, and which of it to repair. +//! +//! The list decides what a repair run will touch — every issue whose checkbox is +//! ticked — so selection state lives on the issue itself and not on the view. + +use crate::app::App; +use crate::engine::issue::{Issue, Severity}; +use crate::gui::theme; +use eframe::egui::{self, RichText}; + +pub fn show(ui: &mut egui::Ui, app: &mut App) { + filters(ui, app); + ui.add_space(6.0); + + let indices = app.filtered_issue_indices(); + + if app.issues.is_empty() { + empty( + ui, + app, + "No scan has run yet.", + "Start a health scan to see what this machine is dealing with.", + ); + return; + } + if indices.is_empty() { + empty( + ui, + app, + "Nothing matches the current filters.", + "Clear them to see the rest of the findings.", + ); + return; + } + + ui.columns(2, |columns| { + list(&mut columns[0], app, &indices); + detail(&mut columns[1], app, &indices); + }); +} + +fn filters(ui: &mut egui::Ui, app: &mut App) { + ui.horizontal_wrapped(|ui| { + ui.label(theme::muted("Search")); + let field = ui.add( + egui::TextEdit::singleline(&mut app.search_query) + .desired_width(200.0) + .hint_text("title, module or category"), + ); + // `[/]` asks for this field; honouring the request here is what keeps + // the shortcut from having to know anything about widgets. + if app.focus_search { + field.request_focus(); + app.focus_search = false; + } + if field.changed() { + app.clamp_filtered_selection(); + } + + ui.separator(); + + for severity in [Severity::Critical, Severity::Warning, Severity::Info] { + let active = app.severity_filter == Some(severity); + let text = RichText::new(severity.short_label()).color(if active { + theme::BG_DEEP + } else { + theme::severity_color(severity) + }); + if ui.selectable_label(active, text).clicked() { + app.toggle_severity_filter(severity); + } + } + + ui.separator(); + + let module_label = app + .module_filter + .clone() + .unwrap_or_else(|| "All modules".to_string()); + if ui.button(module_label).clicked() { + app.cycle_module_filter(); + } + + if app.has_active_filters() && ui.button("Clear filters").clicked() { + app.clear_filters(); + } + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + let selected = app + .issues + .iter() + .filter(|i| i.is_selected && !i.is_fixed) + .count(); + if ui + .add_enabled( + selected > 0 && !app.is_busy(), + egui::Button::new(if app.dry_run { + format!("Simulate {selected} repairs") + } else { + format!("Repair {selected} issues") + }), + ) + .clicked() + { + app.start_repairs(); + } + if ui.button("None").clicked() { + app.deselect_all_issues(); + } + if ui.button("All").clicked() { + app.select_all_issues(); + } + }); + }); +} + +fn list(ui: &mut egui::Ui, app: &mut App, indices: &[usize]) { + egui::ScrollArea::vertical() + .id_salt("issue_list") + .auto_shrink([false, false]) + .show(ui, |ui| { + for (position, &issue_index) in indices.iter().enumerate() { + let highlighted = position == app.selected_filtered_index; + row(ui, app, issue_index, highlighted, position); + } + }); +} + +fn row(ui: &mut egui::Ui, app: &mut App, issue_index: usize, highlighted: bool, position: usize) { + let fill = if highlighted { + theme::CARD_SURFACE + } else { + egui::Color32::TRANSPARENT + }; + + let response = egui::Frame::NONE + .fill(fill) + .inner_margin(egui::Margin::symmetric(6, 4)) + .show(ui, |ui| { + ui.horizontal(|ui| { + let issue = &mut app.issues[issue_index]; + + // A fixed issue is history: it cannot be selected for another + // repair run, so the checkbox stops offering. + if issue.is_fixed { + ui.label(RichText::new("done").color(theme::EMERALD).size(11.0)); + } else { + ui.checkbox(&mut issue.is_selected, ""); + } + + let severity = issue.severity; + ui.label( + RichText::new(severity.badge()) + .color(theme::severity_color(severity)) + .strong() + .size(11.0), + ); + ui.label(RichText::new(&issue.title).strong()); + }); + ui.horizontal(|ui| { + ui.add_space(28.0); + let issue = &app.issues[issue_index]; + ui.label(theme::muted(format!( + "{} · {}", + issue.category, issue.module_id + ))); + }); + }) + .response; + + if response.interact(egui::Sense::click()).clicked() { + app.selected_filtered_index = position; + } +} + +fn detail(ui: &mut egui::Ui, app: &mut App, indices: &[usize]) { + let Some(&issue_index) = indices.get(app.selected_filtered_index) else { + return; + }; + let issue: &Issue = &app.issues[issue_index]; + + egui::ScrollArea::vertical() + .id_salt("issue_detail") + .auto_shrink([false, false]) + .show(ui, |ui| { + theme::card(ui, "DETAILS", |ui| { + ui.horizontal_wrapped(|ui| { + theme::badge( + ui, + issue.severity.badge(), + theme::severity_color(issue.severity), + ); + theme::badge(ui, issue.risk_score.badge(), theme::ACCENT_PURPLE); + ui.label(theme::muted(&issue.category)); + }); + ui.add_space(6.0); + ui.label(RichText::new(&issue.title).strong().size(15.0)); + ui.add_space(6.0); + ui.label(&issue.description); + + if !issue.technical_details.is_empty() { + ui.add_space(10.0); + ui.label(theme::muted("Technical detail")); + ui.label( + RichText::new(&issue.technical_details) + .monospace() + .size(11.0), + ); + } + + ui.add_space(10.0); + ui.label(theme::muted("Recommended fix")); + ui.label(&issue.recommended_fix); + + if !issue.fix_steps.is_empty() { + ui.add_space(6.0); + for (number, step) in issue.fix_steps.iter().enumerate() { + ui.label(format!("{}. {}", number + 1, step)); + } + } + + if let Some(error) = issue.fix_error.as_deref() { + ui.add_space(10.0); + ui.label(RichText::new(format!("Repair failed: {error}")).color(theme::CORAL)); + } + }); + }); +} + +fn empty(ui: &mut egui::Ui, app: &mut App, headline: &str, hint: &str) { + ui.vertical_centered(|ui| { + ui.add_space(60.0); + ui.label(RichText::new(headline).size(15.0)); + ui.label(theme::muted(hint)); + ui.add_space(12.0); + if app.issues.is_empty() { + if ui + .add_enabled(!app.is_busy(), egui::Button::new("Start health scan")) + .clicked() + { + app.start_scan(); + } + } else if ui.button("Clear filters").clicked() { + app.clear_filters(); + } + }); +} diff --git a/src/lib.rs b/src/lib.rs index 5c6ae7a..d44e6a7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ pub mod app; pub mod config; pub mod engine; +pub mod gui; pub mod modules; pub mod safety; -pub mod ui; pub mod utils; diff --git a/src/main.rs b/src/main.rs index b0ef057..db5b9f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,24 +2,13 @@ // also what the integration tests link against. The binary is a thin front end // over it — declaring `mod app; mod config; …` here again would compile every // module a second time into a separate, untested set of types. -use winmedic::{app, config, engine, safety, ui, utils}; +use winmedic::{config, engine, gui, safety, utils}; use clap::Parser; -use crossterm::cursor::Show; -use crossterm::event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyEventKind}; -use crossterm::execute; -use crossterm::terminal::{ - EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, -}; -use ratatui::Terminal; -use ratatui::backend::CrosstermBackend; -use std::io::stdout; use std::process::ExitCode; -use std::time::{Duration, Instant}; use tokio::sync::mpsc::channel; use tokio_util::sync::CancellationToken; -use app::{App, handle_key}; use config::AppConfig; use engine::exit_code; use engine::reporter::DiagnosticReporter; @@ -31,8 +20,10 @@ use utils::admin::{is_admin, relaunch_as_admin}; #[command( name = "WinMedic", version, - about = "WinMedic - Advanced Windows Self-Healing & Diagnostic TUI in Rust", - long_about = "A high-performance terminal utility that automatically diagnoses, categorizes, and safely repairs Windows errors, update stalls, registry bloat, and network issues. + about = "WinMedic - Advanced Windows Self-Healing & Diagnostic GUI in Rust", + long_about = "A high-performance Windows utility that automatically diagnoses, categorizes, and safely repairs Windows errors, update stalls, registry bloat, and network issues. + +Started with no arguments it opens its desktop window. Every flag below runs headless instead, reporting to the console it was started from. Exit codes (headless mode): 0 no open issues above info level @@ -74,7 +65,7 @@ struct CliArgs { } impl CliArgs { - /// Anything that runs without the interactive TUI. + /// Anything that runs without opening the window. fn is_headless(&self) -> bool { self.scan || self.auto_fix || self.json || self.dry_run || self.output.is_some() } @@ -85,23 +76,26 @@ impl CliArgs { } } -#[tokio::main] -async fn main() -> ExitCode { +fn main() -> ExitCode { let args = CliArgs::parse(); - match run(args).await { + match run(args) { Ok(code) => ExitCode::from(code), Err(err) => { - // The TUI path may have died mid-frame; make sure the terminal is - // usable before the error reaches the user. - restore_terminal(); eprintln!("WinMedic: {}", err); ExitCode::from(exit_code::INTERNAL_ERROR) } } } -async fn run(args: CliArgs) -> Result> { +/// Decide which of the two front ends this invocation wants, and give it a +/// runtime. +/// +/// Deliberately not `#[tokio::main]`. That attribute would put `main` itself +/// inside a runtime, and `run_gui` has to build one it can hold open for the +/// life of the window — building a runtime from inside another one panics. +/// Each branch therefore owns its own. +fn run(args: CliArgs) -> Result> { // A binary replaced by an in-place update is still mapped by the process // that replaced it, so it cannot delete itself; the next start is the first // moment it can go. Best-effort and silent: leftover junk beside the @@ -118,34 +112,13 @@ async fn run(args: CliArgs) -> Result> { } if args.is_headless() { - run_headless(args).await + let runtime = tokio::runtime::Runtime::new()?; + runtime.block_on(run_headless(args)) } else { - run_tui().await + run_gui() } } -/// Put the terminal back into a usable state. -/// -/// Safe to call more than once and safe to call when the TUI never started — -/// which is what makes it usable from the panic hook. -fn restore_terminal() { - let _ = disable_raw_mode(); - let _ = execute!(stdout(), LeaveAlternateScreen, DisableMouseCapture, Show); -} - -/// Install a panic hook that hands the terminal back before printing. -/// -/// Without this a panic inside the draw loop leaves the user with a terminal -/// stuck in raw mode on the alternate screen: no echo, no cursor, no output. -fn install_panic_hook() { - let default_hook = std::panic::take_hook(); - std::panic::set_hook(Box::new(move |info| { - restore_terminal(); - eprintln!("\nWinMedic crashed unexpectedly. The terminal has been restored."); - default_hook(info); - })); -} - // ---------------------------------------------------------------- headless // Scoped rather than a crate-level allow list: the library crate root carries @@ -270,9 +243,9 @@ async fn run_headless(args: CliArgs) -> Result> { ); } - // The other half of the seam described in `run_tui`: repairs from the - // command line protect the machine the same way the TUI does, and this - // is the only other place that says so. + // The other half of the seam described in `run_gui`: repairs from the + // command line protect the machine the same way the window does, and + // this is the only other place that says so. let engine = DiagnosticEngine::new(&config).with_restore_points(RestorePointService::real()); let (fix_tx, mut fix_rx) = channel(100); @@ -396,56 +369,50 @@ async fn run_headless(args: CliArgs) -> Result> { Ok(code) } -// --------------------------------------------------------------------- TUI - -async fn run_tui() -> Result> { - install_panic_hook(); - - enable_raw_mode()?; - let mut stdout_handle = stdout(); - execute!(stdout_handle, EnterAlternateScreen, EnableMouseCapture)?; - let backend = CrosstermBackend::new(stdout_handle); - let mut terminal = Terminal::new(backend)?; - - let mut app = App::new(); - // `App::new` builds an app that cannot touch the desktop. This is the one - // place that wants it to: accepting the update dialog should really open a - // browser here, accepting the elevation dialog should really raise UAC, and - // a repair run should really leave a restore point behind. - app.enable_real_system_actions(); - app.start_update_check(); - let mut last_telemetry_tick = Instant::now(); - - let loop_result = (|| -> Result<(), Box> { - loop { - terminal.draw(|f| { - ui::render_app(f, &app); - })?; - - // `event::read()` only runs when `poll` said something is waiting, - // so short-circuiting keeps it from blocking the draw loop. - if event::poll(Duration::from_millis(40))? - && let Event::Key(key) = event::read()? - && key.kind == KeyEventKind::Press - { - handle_key(&mut app, key.code); - } - - app.process_background_events(); +// --------------------------------------------------------------------- GUI + +fn run_gui() -> Result> { + // WinMedic links into the console subsystem so that its headless mode keeps + // its exit codes and its pipes; see `utils::console` for the whole argument. + // The window has no use for the console that came with it. + utils::console::release_console_if_owned(); + + // The engine is spawned onto tokio from inside the draw loop — + // `App::start_scan` calls `tokio::spawn` directly — so a runtime has to be + // current on the thread eframe draws from. + let runtime = tokio::runtime::Runtime::new()?; + + let mut viewport = eframe::egui::ViewportBuilder::default() + .with_title("WinMedic") + .with_inner_size([1280.0, 820.0]) + .with_min_inner_size([960.0, 640.0]); + + // The same mark the executable carries in its PE resources, so the title + // bar and the taskbar agree with Explorer. A window with no icon still + // works, which is why a decode failure is not worth refusing to start over. + if let Ok(icon) = eframe::icon_data::from_png_bytes(include_bytes!("../assets/logo.png")) { + viewport = viewport.with_icon(icon); + } - if last_telemetry_tick.elapsed() >= Duration::from_secs(1) { - app.refresh_telemetry(); - last_telemetry_tick = Instant::now(); - } + let options = eframe::NativeOptions { + viewport, + ..Default::default() + }; - if app.should_quit { - return Ok(()); - } - } - })(); + let result = { + let _guard = runtime.enter(); + eframe::run_native( + "WinMedic", + options, + Box::new(|cc| Ok(Box::new(gui::WinMedicApp::new(cc)))), + ) + }; - restore_terminal(); - loop_result?; + // Shut down rather than drop: a scan can still be in flight when the window + // closes, and dropping the runtime would block on it. Closing the window + // should not wait for a DISM call that has not come back yet. + runtime.shutdown_background(); + result?; Ok(exit_code::OK) } diff --git a/src/ui/mod.rs b/src/ui/mod.rs deleted file mode 100644 index a36a103..0000000 --- a/src/ui/mod.rs +++ /dev/null @@ -1,322 +0,0 @@ -pub mod theme; -pub mod views; -pub mod widgets; - -use crate::app::{App, TAB_DASHBOARD, TAB_REPAIR, TAB_SCANNER, TAB_SETTINGS, TAB_TRIAGE}; -use crate::ui::views::dashboard::render_dashboard; -use crate::ui::views::fix_progress::render_fix_progress; -use crate::ui::views::issue_list::{IssueListViewState, render_issue_list}; -use crate::ui::views::scanner::{ModuleRow, ScannerViewState, render_scanner}; -use crate::ui::views::settings::{SettingsViewState, render_settings}; -use crate::ui::widgets::confirm_popup::render_confirm_popup; -use crate::ui::widgets::footer::render_footer; -use crate::ui::widgets::header::render_header; -use crate::ui::widgets::help_popup::render_help_popup; -use crate::ui::widgets::safety_panel::SafetyPanelState; -use crate::ui::widgets::setting_input_popup::render_setting_input_popup; -use ratatui::Frame; -use ratatui::layout::{Constraint, Direction, Layout}; - -pub fn render_app(f: &mut Frame, app: &App) { - let area = f.area(); - - let main_layout = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Length(6), // Header + Tabs - Constraint::Min(12), // Active Tab View Body - Constraint::Length(3), // Hotkey / Status Footer - ]) - .split(area); - - // 1. Render Header Bar - render_header( - f, - main_layout[0], - app.active_tab, - app.telemetry.as_ref(), - app.is_admin, - app.issues.iter().filter(|i| !i.is_fixed).count(), - app.is_scanning, - app.dry_run, - ); - - // 2. Render Active Tab View - let body_area = main_layout[1]; - match app.active_tab { - TAB_DASHBOARD => { - render_dashboard( - f, - body_area, - app.telemetry.as_ref(), - app.health_score, - &app.issues, - &app.module_statuses, - &app.audit_entries, - ); - } - TAB_SCANNER => { - // Elapsed times are read once here rather than inside the view, so - // the view stays a pure function of its inputs and a test can pin - // the clock instead of racing it. - let modules: Vec = app - .module_progress_list - .iter() - .map(|m| ModuleRow { - name: &m.name, - icon: &m.icon, - percent: m.percent, - is_done: m.is_done, - failed: m.failure.is_some(), - step: &m.step, - step_elapsed: m.step_elapsed(), - }) - .collect(); - - let state = ScannerViewState { - is_scanning: app.is_scanning, - overall_progress: app.scan_overall_progress, - modules: &modules, - log_messages: &app.scan_log_messages, - issues: &app.issues, - log_scroll: app.scan_log_scroll, - elapsed: app.scan_elapsed(), - }; - render_scanner(f, body_area, &state); - } - TAB_TRIAGE => { - let filtered_indices = app.filtered_issue_indices(); - let state = IssueListViewState { - issues: &app.issues, - filtered_indices: &filtered_indices, - selected_filtered_index: app.selected_filtered_index, - severity_filter: app.severity_filter, - module_filter: app.module_filter.as_deref(), - search_query: &app.search_query, - is_searching: app.is_searching, - }; - render_issue_list(f, body_area, &state); - } - TAB_REPAIR => { - render_fix_progress( - f, - body_area, - app.is_fixing, - &app.current_fix_title, - app.fixed_count, - app.failed_count, - app.total_to_fix, - &app.vss_status, - &app.repair_console_lines, - app.dry_run, - app.repair_log_scroll, - ); - } - TAB_SETTINGS => { - let backups = app.backups_newest_first(); - let state = SettingsViewState { - config: &app.config, - selected_setting_index: app.selected_setting_index, - dry_run: app.dry_run, - safety: SafetyPanelState { - backup_records: &backups, - selected_backup_index: app.selected_backup_index, - vss_restore_points: &app.vss_restore_points, - restore_points_loading: app.restore_points_loading, - is_restoring: app.is_restoring, - is_focused: app.backups_focused(), - }, - log_dir_path: &app.audit_logger.log_dir().to_string_lossy(), - }; - render_settings(f, body_area, &state); - } - _ => {} - } - - // 3. Render Footer - render_footer( - f, - main_layout[2], - app.active_tab, - app.status_message.as_deref(), - app.is_busy(), - app.dry_run, - app.backups_focused(), - ); - - // 4. Modal overlays — confirmation takes precedence, then setting input, then help. - if let Some(request) = app.pending_confirm.as_ref() { - render_confirm_popup(f, area, request); - } else if let Some(input) = app.setting_input.as_ref() { - render_setting_input_popup(f, area, input); - } else if app.show_help { - render_help_popup(f, area); - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::app::{SafetyFocus, TAB_COUNT}; - use crate::safety::audit::AuditEntry; - use crate::safety::reg_backup::BackupRecord; - use ratatui::Terminal; - use ratatui::backend::TestBackend; - - /// Render one frame and return every cell's text, row by row. - fn draw(app: &App, width: u16, height: u16) -> Vec { - let mut terminal = Terminal::new(TestBackend::new(width, height)).unwrap(); - terminal.draw(|f| render_app(f, app)).unwrap(); - - let buffer = terminal.backend().buffer().clone(); - (0..height) - .map(|y| { - (0..width) - .map(|x| buffer[(x, y)].symbol()) - .collect::() - }) - .collect() - } - - fn screen(app: &App, width: u16, height: u16) -> String { - draw(app, width, height).join("\n") - } - - fn populated_app() -> App { - let mut app = App::new(); - app.pending_confirm = None; - app.backup_records = vec![BackupRecord { - id: "b1".to_string(), - timestamp: "2026-01-01 12:00:00".to_string(), - description: "Startup entry removed".to_string(), - key_path: "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run".to_string(), - file_path: "C:\\backups\\b1.reg".to_string(), - }]; - app.vss_restore_points = vec!["2026-01-01 11:59 - WinMedic pre-repair".to_string()]; - app.audit_entries = vec![AuditEntry { - timestamp: "2026-01-01 12:00:00".to_string(), - action_type: "FIX".to_string(), - module_id: "registry_startup".to_string(), - title: "Disabled a startup entry".to_string(), - status: "SUCCESS".to_string(), - details: String::new(), - }]; - app - } - - /// Layout constraints are only checked at draw time, so a tab that no - /// terminal size can satisfy fails here rather than in front of a user. - #[test] - fn every_tab_renders_at_small_and_large_terminal_sizes() { - let mut app = populated_app(); - - for tab in 0..TAB_COUNT { - app.active_tab = tab; - for (w, h) in [(80, 24), (120, 40), (200, 60)] { - let rows = draw(&app, w, h); - assert_eq!(rows.len(), h as usize, "tab {tab} at {w}x{h}"); - } - } - } - - #[test] - fn the_header_offers_exactly_five_tabs() { - let app = populated_app(); - let rendered = screen(&app, 140, 40); - - for title in [ - "[1] Dashboard", - "[2] Health Scan", - "[3] Issue Triage", - "[4] Repair Center", - "[5] Settings & Safety", - ] { - assert!(rendered.contains(title), "missing tab title: {title}"); - } - - assert!( - !rendered.contains("[6]"), - "the sixth tab was merged away and must not be advertised" - ); - } - - /// The whole point of the merge: none of the safety surface may go missing. - #[test] - fn the_settings_tab_carries_the_whole_safety_surface() { - let mut app = populated_app(); - app.active_tab = TAB_SETTINGS; - - let rendered = screen(&app, 160, 45); - - assert!(rendered.contains("SETTINGS"), "the settings list"); - assert!(rendered.contains("BACKUPS & VSS"), "the backup pane"); - assert!(rendered.contains("restore points"), "the VSS section"); - assert!(rendered.contains("[REG]"), "the registry snapshot list"); - assert!(rendered.contains("Startup entry removed"), "the snapshot"); - assert!( - rendered.contains("Logs & backups:"), - "the log directory path" - ); - assert!(rendered.contains("[U]"), "the rollback binding"); - assert!(rendered.contains("[R]"), "the VSS refresh binding"); - } - - /// The audit trail is written and reported, just not listed on this tab. - /// - /// It survives in the file the "Logs & backups" path points at, in the - /// exported report, and as the dashboard's one-line summary. - #[test] - fn the_settings_tab_no_longer_lists_recent_actions() { - let mut app = populated_app(); - app.active_tab = TAB_SETTINGS; - - let rendered = screen(&app, 160, 45); - - assert!(!rendered.contains("RECENT ACTIONS")); - assert!(!rendered.contains("Disabled a startup entry")); - } - - #[test] - fn the_focused_list_is_the_one_advertising_the_arrow_keys() { - let mut app = populated_app(); - app.active_tab = TAB_SETTINGS; - - let on_settings = screen(&app, 160, 45); - assert!( - on_settings.contains("SETTINGS ◄ [↑/↓]"), - "the settings list should claim the arrows first" - ); - assert!(on_settings.contains("BACKUPS & VSS ([B] to focus)")); - - app.safety_focus = SafetyFocus::Backups; - let on_backups = screen(&app, 160, 45); - assert!( - on_backups.contains("BACKUPS & VSS ◄ [↑/↓]"), - "after [B] the backup list should claim them" - ); - assert!(on_backups.contains("SETTINGS ([B] to focus)")); - } - - #[test] - fn the_dashboard_links_back_to_the_audit_trail_it_no_longer_owns() { - let mut app = populated_app(); - app.active_tab = TAB_DASHBOARD; - - let rendered = screen(&app, 160, 45); - assert!(rendered.contains("Last action:")); - assert!(rendered.contains("Disabled a startup entry")); - assert!( - rendered.contains("[5] Full log, backups & rollback"), - "and points at the tab that now holds it" - ); - } - - #[test] - fn a_machine_with_no_audit_trail_shows_no_empty_last_action_row() { - let mut app = populated_app(); - app.active_tab = TAB_DASHBOARD; - app.audit_entries.clear(); - - assert!(!screen(&app, 160, 45).contains("Last action:")); - } -} diff --git a/src/ui/theme.rs b/src/ui/theme.rs deleted file mode 100644 index d04ec54..0000000 --- a/src/ui/theme.rs +++ /dev/null @@ -1,76 +0,0 @@ -use ratatui::style::{Color, Modifier, Style}; -use ratatui::widgets::{Block, Borders}; - -pub struct Theme; - -impl Theme { - // Cyber-Medic / Dark Slate Color Palette - pub const CYAN: Color = Color::Rgb(0, 210, 255); // #00D2FF Primary Brand - pub const EMERALD: Color = Color::Rgb(16, 185, 129); // #10B981 Success / Healthy - pub const AMBER: Color = Color::Rgb(245, 158, 11); // #F59E0B Warning - pub const CORAL: Color = Color::Rgb(239, 68, 68); // #EF4444 Critical / Error - pub const BG_DEEP: Color = Color::Rgb(15, 23, 42); // #0F172A Terminal Background - pub const CARD_SURFACE: Color = Color::Rgb(30, 41, 59); // #1E293B Card / Box Surface - pub const BORDER: Color = Color::Rgb(71, 85, 105); // #475569 Borders & Inactive - pub const MUTED: Color = Color::Rgb(148, 163, 184); // #94A3B8 Muted Text - pub const TEXT_WHITE: Color = Color::Rgb(248, 250, 252); // Bright White Text - pub const ACCENT_PURPLE: Color = Color::Rgb(168, 85, 247); - - // Styles - pub fn title_style() -> Style { - Style::default().fg(Self::CYAN).add_modifier(Modifier::BOLD) - } - - pub fn active_tab_style() -> Style { - Style::default() - .fg(Self::TEXT_WHITE) - .bg(Self::CYAN) - .add_modifier(Modifier::BOLD) - } - - pub fn inactive_tab_style() -> Style { - Style::default().fg(Self::MUTED) - } - - pub fn card_block(title: &str) -> Block<'static> { - Block::default() - .title(format!(" {} ", title)) - .title_style(Self::title_style()) - .borders(Borders::ALL) - .border_style(Style::default().fg(Self::BORDER)) - } - - pub fn focused_block(title: &str) -> Block<'static> { - Block::default() - .title(format!(" {} ", title)) - .title_style(Style::default().fg(Self::CYAN).add_modifier(Modifier::BOLD)) - .borders(Borders::ALL) - .border_style(Style::default().fg(Self::CYAN)) - } - - pub fn critical_style() -> Style { - Style::default() - .fg(Self::CORAL) - .add_modifier(Modifier::BOLD) - } - - pub fn warning_style() -> Style { - Style::default() - .fg(Self::AMBER) - .add_modifier(Modifier::BOLD) - } - - pub fn success_style() -> Style { - Style::default() - .fg(Self::EMERALD) - .add_modifier(Modifier::BOLD) - } - - pub fn info_style() -> Style { - Style::default().fg(Self::CYAN) - } - - pub fn muted_style() -> Style { - Style::default().fg(Self::MUTED) - } -} diff --git a/src/ui/views/dashboard.rs b/src/ui/views/dashboard.rs deleted file mode 100644 index 90f0853..0000000 --- a/src/ui/views/dashboard.rs +++ /dev/null @@ -1,353 +0,0 @@ -use crate::engine::issue::{Issue, Severity}; -use crate::modules::ModuleStatus; -use crate::safety::audit::AuditEntry; -use crate::ui::theme::Theme; -use crate::ui::widgets::safety_panel::latest_action_line; -use crate::utils::hardware::SystemTelemetry; -use ratatui::Frame; -use ratatui::layout::{Constraint, Direction, Layout, Rect}; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, Gauge, Paragraph, Wrap}; - -/// Module cards per dashboard row. -const CARDS_PER_ROW: usize = 4; - -/// Rows one module card needs: four content lines plus its top and bottom -/// border. The grid reserves this per row so a third row of cards is not -/// squeezed into a height that clips it. -const CARD_HEIGHT: usize = 6; - -// Ratatui render functions receive the slice of app state they draw rather than -// `&App`, which is what makes the signature long. -#[allow(clippy::too_many_arguments)] -pub fn render_dashboard( - f: &mut Frame, - area: Rect, - telemetry: Option<&SystemTelemetry>, - health_score: u8, - issues: &[Issue], - module_statuses: &[(String, String, String, ModuleStatus)], - audit_entries: &[AuditEntry], -) { - // The summary bar grows by a line once there is an audit trail to show, so - // an untouched machine does not reserve space for an empty row. - let summary_height = if audit_entries.is_empty() { 5 } else { 6 }; - - // The card grid follows the module list rather than a fixed slot count, so - // registering a module cannot silently drop it off the dashboard. - let row_count = module_statuses.len().div_ceil(CARDS_PER_ROW).max(1); - // Four content lines plus the card's own border. - let cards_height = (row_count * CARD_HEIGHT) as u16; - - let main_chunks = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Length(7), // Health Score & Telemetry Gauges - Constraint::Min(cards_height), // Module Status Cards - Constraint::Length(summary_height), // Quick Action & Status Summary - ]) - .split(area); - - // Top Section: 3 Columns (Health Gauge, CPU Gauge, RAM Gauge & OS Info) - let top_chunks = Layout::default() - .direction(Direction::Horizontal) - .constraints([ - Constraint::Percentage(33), // Health Score - Constraint::Percentage(33), // CPU & RAM Gauges - Constraint::Percentage(34), // System & Hardware Specs - ]) - .split(main_chunks[0]); - - // 1. Health Score Gauge - let health_color = if health_score >= 80 { - Theme::EMERALD - } else if health_score >= 50 { - Theme::AMBER - } else { - Theme::CORAL - }; - - let health_status_text = if health_score == 100 { - "OPTIMAL - all systems healthy" - } else if health_score >= 80 { - "GOOD - minor optimisations possible" - } else if health_score >= 50 { - "WARNING - action needed" - } else { - "CRITICAL - immediate repair recommended" - }; - - let critical_count = issues - .iter() - .filter(|i| i.severity == Severity::Critical && !i.is_fixed) - .count(); - let warning_count = issues - .iter() - .filter(|i| i.severity == Severity::Warning && !i.is_fixed) - .count(); - - let health_gauge = Gauge::default() - .block(Theme::card_block("SYSTEM HEALTH INDEX")) - .gauge_style(Style::default().fg(health_color).bg(Theme::BG_DEEP)) - .percent(health_score as u16) - .label(format!( - " {}/100 ({} critical, {} warnings) ", - health_score, critical_count, warning_count - )); - - f.render_widget(health_gauge, top_chunks[0]); - - // 2. CPU & RAM Telemetry - let (cpu_val, ram_val, ram_str) = if let Some(t) = telemetry { - ( - t.cpu_usage.clamp(0.0, 100.0) as u16, - t.ram_usage_percent.clamp(0.0, 100.0) as u16, - format!( - "{:.1} / {:.1} GB", - t.ram_used_mb as f32 / 1024.0, - t.ram_total_mb as f32 / 1024.0 - ), - ) - } else { - (0, 0, "-- / -- GB".to_string()) - }; - - let telem_chunks = Layout::default() - .direction(Direction::Vertical) - .constraints([Constraint::Percentage(50), Constraint::Percentage(50)]) - .split(top_chunks[1]); - - let cpu_gauge = Gauge::default() - .block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::BORDER)) - .title(" CPU Usage "), - ) - .gauge_style(Style::default().fg(Theme::CYAN).bg(Theme::BG_DEEP)) - .percent(cpu_val) - .label(format!(" {}% ", cpu_val)); - - let ram_gauge = Gauge::default() - .block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::BORDER)) - .title(" RAM Usage "), - ) - .gauge_style(Style::default().fg(Theme::ACCENT_PURPLE).bg(Theme::BG_DEEP)) - .percent(ram_val) - .label(format!(" {}% ({}) ", ram_val, ram_str)); - - f.render_widget(cpu_gauge, telem_chunks[0]); - f.render_widget(ram_gauge, telem_chunks[1]); - - // 3. System Specs Card - let sys_lines = if let Some(t) = telemetry { - let uptime_h = t.uptime_secs / 3600; - let uptime_m = (t.uptime_secs % 3600) / 60; - vec![ - Line::from(vec![ - Span::styled("OS: ", Style::default().fg(Theme::MUTED)), - Span::styled( - format!("{} {}", t.os_name, t.os_version), - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::BOLD), - ), - ]), - Line::from(vec![ - Span::styled("CPU: ", Style::default().fg(Theme::MUTED)), - Span::styled( - format!("{} ({} cores)", t.cpu_name, t.cpu_count), - Style::default().fg(Theme::TEXT_WHITE), - ), - ]), - Line::from(vec![ - Span::styled("Uptime: ", Style::default().fg(Theme::MUTED)), - Span::styled( - format!("{} h {} min", uptime_h, uptime_m), - Style::default().fg(Theme::EMERALD), - ), - ]), - ] - } else { - vec![Line::from("Loading system data...")] - }; - - let sys_card = Paragraph::new(sys_lines).block(Theme::card_block("SYSTEM SPECIFICATION")); - f.render_widget(sys_card, top_chunks[2]); - - // Middle Section: one card per diagnostic module, four to a row. - let row_constraints: Vec = (0..row_count) - .map(|_| Constraint::Ratio(1, row_count as u32)) - .collect(); - let mod_rows = Layout::default() - .direction(Direction::Vertical) - .constraints(row_constraints) - .split(main_chunks[1]); - - // Every row uses the same four-column grid, so a partial last row leaves - // its trailing cells empty. Splitting it into fewer, wider columns would - // render the same kind of card at two different widths, and clip the - // longer module names differently in each row. - let column_constraints = [Constraint::Ratio(1, CARDS_PER_ROW as u32); CARDS_PER_ROW]; - let card_slots: Vec = mod_rows - .iter() - .flat_map(|row| { - Layout::default() - .direction(Direction::Horizontal) - .constraints(column_constraints) - .split(*row) - .to_vec() - }) - .collect(); - - for (idx, slot_rect) in card_slots.into_iter().enumerate() { - if let Some((_id, name, icon, status)) = module_statuses.get(idx) { - let (status_badge, status_color, status_text) = match status { - ModuleStatus::Idle => ("[READY]", Theme::MUTED, "Ready for a diagnostic scan"), - ModuleStatus::Scanning => ("[SCAN...]", Theme::CYAN, "Diagnostics in progress..."), - ModuleStatus::Passed => ("[OPTIMAL]", Theme::EMERALD, "No issues detected"), - ModuleStatus::Warning(_cnt) => ("[WARNING]", Theme::AMBER, "One or more warnings"), - ModuleStatus::Critical(_cnt) => { - ("[CRITICAL]", Theme::CORAL, "Critical faults found") - } - ModuleStatus::Failed(_err) => ("[ERROR]", Theme::CORAL, "Diagnostics failed"), - }; - - let card_content = vec![ - Line::from(vec![ - Span::styled( - format!(" {} ", icon), - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - name.as_str(), - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::BOLD), - ), - ]), - Line::from(""), - Line::from(vec![ - Span::styled("Status: ", Style::default().fg(Theme::MUTED)), - Span::styled( - status_badge, - Style::default() - .fg(status_color) - .add_modifier(Modifier::BOLD), - ), - ]), - Line::from(vec![Span::styled( - format!("Detail: {}", status_text), - Style::default().fg(Theme::MUTED), - )]), - ]; - - // Four cards per row leave ~28 usable columns at 120 terminal - // columns, which is narrower than several module names. Wrapping - // pushes the overflow onto a second line instead of silently - // truncating the name mid-word. - let card = Paragraph::new(card_content) - .wrap(Wrap { trim: false }) - .block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(if *status != ModuleStatus::Idle { - status_color - } else { - Theme::BORDER - })) - .title(format!(" Module {} ", idx + 1)), - ); - - f.render_widget(card, slot_rect); - } - } - - // Bottom Section: Quick Action Bar - let mut bottom_content = vec![ - Line::from(vec![ - Span::styled( - " Quick actions: ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - " [S] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "Start a full health scan ", - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [A] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "One-click auto-fix all ", - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [3] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "Open issue triage ", - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [5] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "Settings & safety ", - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [?] ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled("Help", Style::default().fg(Theme::TEXT_WHITE)), - ]), - Line::from(vec![ - Span::styled( - format!(" Safety status: {}", health_status_text), - Style::default() - .fg(health_color) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - " │ VSS restore points are created automatically before every change.", - Style::default().fg(Theme::MUTED), - ), - ]), - ]; - - // The audit trail moved onto tab 5 when "Backups & Logs" was merged into - // Settings. This one line keeps the most recent action where the user - // already is, and points at the tab that holds the rest of it. - if let Some(line) = latest_action_line(audit_entries) { - bottom_content.push(line); - } - - let bottom_bar = - Paragraph::new(bottom_content).block(Theme::card_block("QUICK ACCESS & RECOMMENDATIONS")); - f.render_widget(bottom_bar, main_chunks[2]); -} diff --git a/src/ui/views/fix_progress.rs b/src/ui/views/fix_progress.rs deleted file mode 100644 index fa729b3..0000000 --- a/src/ui/views/fix_progress.rs +++ /dev/null @@ -1,488 +0,0 @@ -use crate::ui::theme::Theme; -use crate::utils::debug_log::{DebugTag, parse_debug_line}; -use ratatui::Frame; -use ratatui::layout::{Constraint, Direction, Layout, Rect}; -use ratatui::style::{Color, Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, Gauge, Paragraph, Wrap}; -use std::collections::VecDeque; - -/// Colour a verbose tag by what it says. -/// -/// The tag carries the meaning, so it keeps its own colour while the rest of the -/// line stays dim: a trace has to be readable without competing with the repair -/// output it sits between. -fn debug_tag_color(tag: DebugTag) -> Color { - match tag { - DebugTag::Warn => Theme::AMBER, - DebugTag::Hint => Theme::CYAN, - DebugTag::Exec => Theme::ACCENT_PURPLE, - DebugTag::Exit => Theme::EMERALD, - DebugTag::Step => Theme::ACCENT_PURPLE, - DebugTag::Time | DebugTag::Data => Theme::MUTED, - } -} - -/// What a console line turned out to be saying. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -enum Outcome { - Failure, - Success, - /// Anything the run has not called a failure: progress, notices, plain output. - Neutral, -} - -impl Outcome { - /// The gutter printed in front of the line. - fn marker(self) -> &'static str { - match self { - Outcome::Failure => " [X] ", - Outcome::Success => " [OK] ", - Outcome::Neutral => " > ", - } - } - - /// Styles for the gutter and the line text, in that order. - fn styles(self) -> (Style, Style) { - match self { - Outcome::Failure => ( - Style::default() - .fg(Theme::CORAL) - .add_modifier(Modifier::BOLD), - Style::default().fg(Theme::CORAL), - ), - Outcome::Success => ( - Style::default() - .fg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - Style::default().fg(Theme::EMERALD), - ), - Outcome::Neutral => ( - Style::default().fg(Theme::CYAN), - Style::default().fg(Theme::TEXT_WHITE), - ), - } - } -} - -/// Line prefixes the repair pipeline writes itself, and what each one means. -/// -/// [`crate::app::events`] already knows whether a step failed, so its own marker -/// settles the question before the keyword scan gets a look at the line. That -/// order is what stops a repair from being judged by the thing it repaired: -/// "Windows error reports & crash dumps" is the name of a Windows feature, so a -/// run that cleans it *successfully* used to come out coral on both the -/// `Repairing:` line and the `[OK]` line that followed it. -const EMITTED_PREFIXES: &[(&str, Outcome)] = &[ - ("[X]", Outcome::Failure), - ("[STDERR]", Outcome::Failure), - ("[OK]", Outcome::Success), - // A cancellation is the user's decision, not a fault — and its tally reads - // "0 failed" on a clean stop, which the keyword scan would take literally. - ("[STOP]", Outcome::Neutral), - ("Repairing:", Outcome::Neutral), - ("Simulating:", Outcome::Neutral), -]; - -/// Decide what an unparsed console line is reporting, and what of it to print. -/// -/// The returned text is the line minus any prefix the gutter is about to repeat -/// verbatim — an emitted `[OK] …` rendered as-is comes out `[OK] [OK] …`. -/// Prefixes the gutter does *not* echo, `[STDERR]` above all, are left in place: -/// they say something the gutter does not. -fn classify(line: &str) -> (Outcome, &str) { - if let Some((prefix, outcome)) = EMITTED_PREFIXES - .iter() - .find(|(prefix, _)| line.starts_with(prefix)) - { - let text = if outcome.marker().trim() == *prefix { - line[prefix.len()..].trim_start() - } else { - line - }; - return (*outcome, text); - } - - // Everything left is raw output from sfc, dism, chkdsk and friends, where - // the wording is all there is to go on. - let lower = line.to_lowercase(); - let is_negative_assertion = lower.starts_with("no ") - || lower.starts_with("0 errors") - || lower.contains("no errors") - || lower.contains("0 errors"); - - if !is_negative_assertion && (lower.contains("error") || lower.contains("failed")) { - return (Outcome::Failure, line); - } - - if line.contains("SUCCESS") || line.contains("Repaired") || line.contains("finished") { - return (Outcome::Success, line); - } - - (Outcome::Neutral, line) -} - -/// Style one console line for the repair log. -/// -/// Verbose traces are matched *before* [`classify`]: a trace explaining a -/// failure necessarily contains the words "error" and "failed", and colouring -/// those lines coral would make a single failed repair look like a dozen. -pub fn style_console_line(line: &str) -> Line<'_> { - if let Some(parsed) = parse_debug_line(line) { - return Line::from(vec![ - Span::styled( - " [D] ", - Style::default() - .fg(Theme::ACCENT_PURPLE) - .add_modifier(Modifier::DIM), - ), - Span::styled( - parsed.stamp, - Style::default() - .fg(Theme::BORDER) - .add_modifier(Modifier::DIM), - ), - Span::styled( - format!(" {} ", parsed.tag.label()), - Style::default() - .fg(debug_tag_color(parsed.tag)) - .add_modifier(Modifier::BOLD), - ), - Span::styled(parsed.message, Style::default().fg(Theme::MUTED)), - ]); - } - - let (outcome, text) = classify(line); - let (marker_style, text_style) = outcome.styles(); - - Line::from(vec![ - Span::styled(outcome.marker(), marker_style), - Span::styled(text, text_style), - ]) -} - -// See `ui::widgets::header` — render functions take explicit state slices -// rather than borrowing the whole `App`. -#[allow(clippy::too_many_arguments)] -pub fn render_fix_progress( - f: &mut Frame, - area: Rect, - is_fixing: bool, - current_issue_title: &str, - fixed_count: usize, - failed_count: usize, - total_to_fix: usize, - vss_status: &str, - console_lines: &VecDeque, - dry_run: bool, - scroll_offset: usize, -) { - let chunks = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Length(5), // Repair Progress Gauge & VSS Badge - Constraint::Min(10), // Live Repair Console Output - Constraint::Length(5), // Execution Summary & Reboot Alert - ]) - .split(area); - - // Top: Repair Progress Gauge - let progress_percent = if total_to_fix > 0 { - (((fixed_count + failed_count) as f32 / total_to_fix as f32) * 100.0).clamp(0.0, 100.0) - as u16 - } else { - 0 - }; - - let title_str = match (dry_run, is_fixing) { - (true, true) => format!( - " [!] SIMULATION RUNNING - current: {} ", - current_issue_title - ), - (true, false) if total_to_fix > 0 && (fixed_count + failed_count >= total_to_fix) => { - " [!] SIMULATION COMPLETE - nothing was changed ".to_string() - } - (true, false) => { - " [!] SIMULATION MODE - [F] shows the planned steps, [D] switches back ".to_string() - } - (false, true) => format!(" REPAIRS RUNNING - current: {} ", current_issue_title), - (false, false) if total_to_fix > 0 && (fixed_count + failed_count >= total_to_fix) => { - " REPAIR RUN COMPLETE ".to_string() - } - (false, false) => " REPAIR CENTRE - ready to run (press [F]) ".to_string(), - }; - - let gauge_color = if dry_run { - Theme::AMBER - } else if progress_percent >= 100 && failed_count == 0 { - Theme::EMERALD - } else if failed_count > 0 { - Theme::AMBER - } else { - Theme::CYAN - }; - - let top_gauge = Gauge::default() - .block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(gauge_color)) - .title(title_str), - ) - .gauge_style(Style::default().fg(gauge_color).bg(Theme::BG_DEEP)) - .percent(progress_percent) - .label(format!( - " {}/{} Fixes ({:.0}%) │ VSS: {} ", - fixed_count + failed_count, - total_to_fix, - progress_percent, - vss_status - )); - - f.render_widget(top_gauge, chunks[0]); - - // Center: Live Repair Console with scroll offset - let viewport_height = chunks[1].height.saturating_sub(2) as usize; - let total_logs = console_lines.len(); - - let end_idx = total_logs.saturating_sub(scroll_offset); - let start_idx = end_idx.saturating_sub(viewport_height); - - let lines: Vec = (start_idx..end_idx) - .filter_map(|idx| console_lines.get(idx)) - .map(|line| style_console_line(line)) - .collect(); - - let debug_lines = console_lines - .iter() - .filter(|line| parse_debug_line(line).is_some()) - .count(); - - let console_title = if scroll_offset > 0 { - format!( - " LIVE REPAIR CONSOLE [lines {}-{} of {} | End = live] ", - start_idx + 1, - end_idx, - total_logs - ) - } else if debug_lines > 0 { - format!( - " LIVE REPAIR CONSOLE & COMMAND OUTPUT [{} | {} debug] [PgUp/PgDn to scroll] ", - total_logs, debug_lines - ) - } else { - format!( - " LIVE REPAIR CONSOLE & COMMAND OUTPUT [{}] [PgUp/PgDn to scroll] ", - total_logs - ) - }; - - let console_box = Paragraph::new(lines) - .block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(if scroll_offset > 0 { - Theme::AMBER - } else { - Theme::CYAN - })) - .title(console_title), - ) - .wrap(Wrap { trim: false }); - - f.render_widget(console_box, chunks[1]); - - // Bottom: Summary & Next Steps - let summary_lines = vec![ - Line::from(vec![ - Span::styled( - " Status: ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - if dry_run { - format!("{} repair(s) planned", fixed_count) - } else { - format!("{} fixed successfully", fixed_count) - }, - Style::default() - .fg(if dry_run { - Theme::AMBER - } else { - Theme::EMERALD - }) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" │ ", Style::default().fg(Theme::BORDER)), - Span::styled( - format!("{} failed", failed_count), - Style::default() - .fg(if failed_count > 0 { - Theme::CORAL - } else { - Theme::TEXT_WHITE - }) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" │ ", Style::default().fg(Theme::BORDER)), - Span::styled( - if dry_run { - " Press [D] to run repairs for real " - } else if progress_percent >= 100 && failed_count == 0 { - " All repairs completed successfully. " - } else if progress_percent >= 100 { - " Some repairs need a system restart. " - } else if is_fixing { - " Working through the repair scripts... " - } else { - " Press [F] to start repairs, [D] to simulate " - }, - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::ITALIC), - ), - ]), - Line::from(vec![ - Span::styled(" Keys: ", Style::default().fg(Theme::MUTED)), - Span::styled( - "[PgUp/PgDn] Scroll log [Home/End] Top/Live [F] Start [D] Simulate [E] Report", - Style::default().fg(Theme::CYAN), - ), - ]), - ]; - - let summary_box = Paragraph::new(summary_lines).block(Theme::card_block("SUMMARY & NOTES")); - f.render_widget(summary_box, chunks[2]); -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::utils::debug_log::{DebugTag, render_debug_line}; - - fn gutter(line: &str) -> String { - style_console_line(line).spans[0].content.to_string() - } - - /// The whole styled line as the user reads it, gutter included. - fn rendered(line: &str) -> String { - style_console_line(line) - .spans - .iter() - .map(|s| s.content.as_ref()) - .collect() - } - - fn color_of(line: &str, span: usize) -> Option { - style_console_line(line).spans[span].style.fg - } - - #[test] - fn a_trace_gets_its_own_gutter_and_never_the_error_colour() { - // The wording here is the point: this trace explains a failure, so it - // contains both keywords the plain classifier looks for. - let line = render_debug_line( - DebugTag::Warn, - "could not run 'chkdsk.exe': failed, error 5", - ); - - assert_eq!(gutter(&line), " [D] "); - assert_ne!( - color_of(&line, 3), - Some(Theme::CORAL), - "a trace must not be painted as a failed repair" - ); - } - - #[test] - fn each_tag_keeps_its_own_colour() { - let warn = render_debug_line(DebugTag::Warn, "something looks wrong"); - let hint = render_debug_line(DebugTag::Hint, "here is why"); - - assert_eq!(color_of(&warn, 2), Some(Theme::AMBER)); - assert_eq!(color_of(&hint, 2), Some(Theme::CYAN)); - } - - #[test] - fn ordinary_repair_output_keeps_its_existing_styling() { - assert_eq!( - gutter("[X] Error: Failed to empty the Recycle Bin"), - " [X] " - ); - assert_eq!(gutter("[STDERR] dism reported a problem"), " [X] "); - assert_eq!(gutter("chkdsk /scan finished"), " [OK] "); - assert_eq!(gutter("Repairing: Browser caches"), " > "); - assert_eq!( - gutter("No WHEA hardware faults or PCIe/CPU errors logged."), - " > " - ); - assert_eq!(gutter("No errors found in registry"), " > "); - } - - /// A repair is judged by its own marker, never by what it repaired. - /// - /// Both of these lines are about Windows Error Reporting, so both carry the - /// word "error" while reporting a successful clean-up. - #[test] - fn a_fix_whose_subject_is_named_error_is_not_painted_as_one() { - assert_eq!( - gutter("Repairing: Windows error reports & crash dumps (0 B, 1 files)"), - " > " - ); - assert_eq!( - gutter( - "[OK] Windows error reports & crash dumps cleaned: 1 files deleted (0 B freed, 0 locked files skipped)." - ), - " [OK] " - ); - assert_eq!( - gutter("Simulating: Windows error reports & crash dumps (0 B, 1 files)"), - " > " - ); - } - - #[test] - fn a_cancelled_run_is_a_notice_rather_than_a_failure() { - assert_eq!( - gutter("[STOP] Repairs cancelled: 2 done, 0 failed, 3 never attempted."), - " > " - ); - } - - /// The marker still has to lose to a genuine failure it announces itself. - #[test] - fn an_emitted_failure_keeps_the_error_gutter() { - assert_eq!( - gutter("[X] Error: Windows error reports & crash dumps could not be cleaned"), - " [X] " - ); - } - - /// The gutter is the marker, so the line must not carry a second copy. - #[test] - fn a_line_that_already_names_its_outcome_is_not_marked_twice() { - assert_eq!( - rendered("[OK] Pending reboot recorded."), - " [OK] Pending reboot recorded." - ); - assert_eq!( - rendered("[X] Error: could not empty the Recycle Bin"), - " [X] Error: could not empty the Recycle Bin" - ); - } - - /// `[STDERR]` says where the line came from, which the `[X]` gutter does not. - #[test] - fn a_prefix_the_gutter_does_not_repeat_is_left_alone() { - assert_eq!( - rendered("[STDERR] dism reported a problem"), - " [X] [STDERR] dism reported a problem" - ); - assert_eq!( - rendered("Repairing: Browser caches"), - " > Repairing: Browser caches" - ); - } -} diff --git a/src/ui/views/issue_list.rs b/src/ui/views/issue_list.rs deleted file mode 100644 index 2791346..0000000 --- a/src/ui/views/issue_list.rs +++ /dev/null @@ -1,428 +0,0 @@ -use crate::engine::issue::{Issue, RiskScore, Severity}; -use crate::ui::theme::Theme; -use ratatui::Frame; -use ratatui::layout::{Constraint, Direction, Layout, Rect}; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, List, ListItem, Paragraph, Wrap}; - -pub struct IssueListViewState<'a> { - pub issues: &'a [Issue], - pub filtered_indices: &'a [usize], - pub selected_filtered_index: usize, - pub severity_filter: Option, - pub module_filter: Option<&'a str>, - pub search_query: &'a str, - pub is_searching: bool, -} - -pub fn render_issue_list(f: &mut Frame, area: Rect, state: &IssueListViewState) { - if state.issues.is_empty() { - let empty_msg = vec![ - Line::from(""), - Line::from(vec![Span::styled( - " No open issues found. ", - Style::default() - .fg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - )]), - Line::from(""), - Line::from(vec![Span::styled( - " Your system is in good shape.", - Style::default().fg(Theme::TEXT_WHITE), - )]), - Line::from(vec![ - Span::styled(" Press ", Style::default().fg(Theme::MUTED)), - Span::styled( - "[S]", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" or ", Style::default().fg(Theme::MUTED)), - Span::styled( - "[R]", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - " to start a new system health scan.", - Style::default().fg(Theme::MUTED), - ), - ]), - ]; - let empty_box = Paragraph::new(empty_msg).block(Theme::card_block("ISSUE TRIAGE")); - f.render_widget(empty_box, area); - return; - } - - let vertical_chunks = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Length(3), // Filter & Search Bar - Constraint::Min(8), // Split: Issues List & Details - ]) - .split(area); - - // Top Filter & Search Bar - render_filter_bar(f, vertical_chunks[0], state); - - // Split Left/Right - let main_split = Layout::default() - .direction(Direction::Horizontal) - .constraints([Constraint::Percentage(45), Constraint::Percentage(55)]) - .split(vertical_chunks[1]); - - // Left Pane: List of Filtered Issues - if state.filtered_indices.is_empty() { - let no_match_lines = vec![ - Line::from(""), - Line::from(vec![Span::styled( - " No findings match the active filter", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - )]), - Line::from(""), - Line::from(vec![ - Span::styled(" Press ", Style::default().fg(Theme::MUTED)), - Span::styled( - "[x]", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" or ", Style::default().fg(Theme::MUTED)), - Span::styled( - "[Esc]", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" to clear every filter.", Style::default().fg(Theme::MUTED)), - ]), - ]; - let no_match_box = - Paragraph::new(no_match_lines).block(Theme::card_block("ISSUES FOUND [0]")); - f.render_widget(no_match_box, main_split[0]); - } else { - let items: Vec = state - .filtered_indices - .iter() - .enumerate() - .map(|(pos, &orig_idx)| { - let issue = &state.issues[orig_idx]; - let is_current = pos == state.selected_filtered_index; - let check_box = if issue.is_fixed { - "[FIXED]" - } else if issue.is_selected { - "[X]" - } else { - "[ ]" - }; - - let check_color = if issue.is_fixed { - Theme::EMERALD - } else if issue.is_selected { - Theme::CYAN - } else { - Theme::MUTED - }; - - let (sev_str, sev_color) = match issue.severity { - Severity::Critical => ("[CRIT]", Theme::CORAL), - Severity::Warning => ("[WARN]", Theme::AMBER), - Severity::Info => ("[INFO]", Theme::CYAN), - }; - - let line = Line::from(vec![ - Span::styled( - format!(" {} ", check_box), - Style::default() - .fg(check_color) - .add_modifier(Modifier::BOLD), - ), - Span::styled(format!("{} ", sev_str), Style::default().fg(sev_color)), - Span::styled( - issue.title.clone(), - if is_current { - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CYAN) - .add_modifier(Modifier::BOLD) - } else { - Style::default().fg(Theme::TEXT_WHITE) - }, - ), - ]); - - ListItem::new(line) - }) - .collect(); - - let list_title = format!( - " ISSUES FOUND [{}/{}] - [Space] select/deselect ", - state.filtered_indices.len(), - state.issues.len() - ); - - let issue_list = List::new(items).block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::CYAN)) - .title(list_title), - ); - - f.render_widget(issue_list, main_split[0]); - } - - // Right Pane: Detailed Issue View - if let Some(&orig_idx) = state.filtered_indices.get(state.selected_filtered_index) { - let issue = &state.issues[orig_idx]; - - let (sev_badge, sev_color) = match issue.severity { - Severity::Critical => ("[!] CRITICAL", Theme::CORAL), - Severity::Warning => ("[!] WARNING", Theme::AMBER), - Severity::Info => ("[i] INFO", Theme::CYAN), - }; - - let (risk_badge, risk_color) = match issue.risk_score { - RiskScore::Low => ("[OK] LOW (safe auto-fix)", Theme::EMERALD), - RiskScore::Medium => ("[~] MEDIUM (service restart)", Theme::AMBER), - RiskScore::High => ("[!] HIGH (reboot/system)", Theme::CORAL), - }; - - let mut detail_lines = vec![ - Line::from(vec![ - Span::styled(" Title: ", Style::default().fg(Theme::MUTED)), - Span::styled( - issue.title.clone(), - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::BOLD), - ), - ]), - Line::from(vec![ - Span::styled(" Category: ", Style::default().fg(Theme::MUTED)), - Span::styled(issue.category.clone(), Style::default().fg(Theme::CYAN)), - Span::styled(" Module: ", Style::default().fg(Theme::MUTED)), - Span::styled( - issue.module_id.clone(), - Style::default().fg(Theme::TEXT_WHITE), - ), - ]), - Line::from(vec![ - Span::styled(" Severity: ", Style::default().fg(Theme::MUTED)), - Span::styled( - sev_badge, - Style::default().fg(sev_color).add_modifier(Modifier::BOLD), - ), - Span::styled(" Risk score: ", Style::default().fg(Theme::MUTED)), - Span::styled( - risk_badge, - Style::default().fg(risk_color).add_modifier(Modifier::BOLD), - ), - ]), - Line::from(""), - Line::from(vec![Span::styled( - " Description:", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - )]), - Line::from(vec![Span::styled( - format!(" {}", issue.description), - Style::default().fg(Theme::TEXT_WHITE), - )]), - Line::from(""), - Line::from(vec![Span::styled( - " Technical diagnosis / finding:", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - )]), - Line::from(vec![Span::styled( - format!(" {}", issue.technical_details), - Style::default().fg(Theme::MUTED), - )]), - Line::from(""), - Line::from(vec![Span::styled( - " Recommended repair (auto-fix):", - Style::default() - .fg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - )]), - Line::from(vec![Span::styled( - format!(" -> {}", issue.recommended_fix), - Style::default().fg(Theme::TEXT_WHITE), - )]), - Line::from(""), - Line::from(vec![Span::styled( - " Repair steps:", - Style::default() - .fg(Theme::MUTED) - .add_modifier(Modifier::BOLD), - )]), - ]; - - for (step_idx, step) in issue.fix_steps.iter().enumerate() { - detail_lines.push(Line::from(vec![ - Span::styled( - format!(" {}. ", step_idx + 1), - Style::default().fg(Theme::CYAN), - ), - Span::styled(step.as_str(), Style::default().fg(Theme::TEXT_WHITE)), - ])); - } - - if let Some(ref err) = issue.fix_error { - detail_lines.push(Line::from("")); - detail_lines.push(Line::from(vec![ - Span::styled( - " [X] Last repair error: ", - Style::default() - .fg(Theme::CORAL) - .add_modifier(Modifier::BOLD), - ), - Span::styled(err.as_str(), Style::default().fg(Theme::CORAL)), - ])); - } - - detail_lines.push(Line::from("")); - detail_lines.push(Line::from(vec![Span::styled( - " A VSS restore point is created automatically before repairs.", - Style::default() - .fg(Theme::EMERALD) - .add_modifier(Modifier::ITALIC), - )])); - - let detail_box = Paragraph::new(detail_lines) - .block(Theme::card_block("ISSUE DETAILS & SUGGESTED REPAIR")) - .wrap(Wrap { trim: true }); - - f.render_widget(detail_box, main_split[1]); - } else { - let empty_detail = - Paragraph::new("No issue selected.").block(Theme::card_block("ISSUE DETAILS")); - f.render_widget(empty_detail, main_split[1]); - } -} - -fn render_filter_bar(f: &mut Frame, area: Rect, state: &IssueListViewState) { - let mut spans = vec![Span::styled(" Filter: ", Style::default().fg(Theme::MUTED))]; - - // Severity pills - let crit_active = state.severity_filter == Some(Severity::Critical); - spans.push(Span::styled( - " [c] Critical ", - if crit_active { - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CORAL) - .add_modifier(Modifier::BOLD) - } else { - Style::default().fg(Theme::CORAL) - }, - )); - spans.push(Span::styled(" ", Style::default())); - - let warn_active = state.severity_filter == Some(Severity::Warning); - spans.push(Span::styled( - " [w] Warning ", - if warn_active { - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::AMBER) - .add_modifier(Modifier::BOLD) - } else { - Style::default().fg(Theme::AMBER) - }, - )); - spans.push(Span::styled(" ", Style::default())); - - let info_active = state.severity_filter == Some(Severity::Info); - spans.push(Span::styled( - " [i] Info ", - if info_active { - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CYAN) - .add_modifier(Modifier::BOLD) - } else { - Style::default().fg(Theme::CYAN) - }, - )); - spans.push(Span::styled(" │ ", Style::default().fg(Theme::BORDER))); - - // Module filter - let mod_label = match state.module_filter { - Some(m) => format!(" [m] Module: {} ", m), - None => " [m] Module: all ".to_string(), - }; - spans.push(Span::styled( - mod_label, - if state.module_filter.is_some() { - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CYAN) - .add_modifier(Modifier::BOLD) - } else { - Style::default().fg(Theme::TEXT_WHITE) - }, - )); - spans.push(Span::styled(" │ ", Style::default().fg(Theme::BORDER))); - - // Search query - let search_text = if state.is_searching { - format!(" [/] Search: \"{}\"█ ", state.search_query) - } else if !state.search_query.is_empty() { - format!(" [/] Search: \"{}\" ", state.search_query) - } else { - " [/] Search ".to_string() - }; - - spans.push(Span::styled( - search_text, - if state.is_searching { - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CYAN) - .add_modifier(Modifier::BOLD) - } else if !state.search_query.is_empty() { - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD) - } else { - Style::default().fg(Theme::MUTED) - }, - )); - - // Reset button hint if filters active - let has_filter = state.severity_filter.is_some() - || state.module_filter.is_some() - || !state.search_query.is_empty(); - - if has_filter { - spans.push(Span::styled(" ", Style::default())); - spans.push(Span::styled( - " [x] Reset ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - )); - } - - let block = Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(if state.is_searching { - Theme::CYAN - } else { - Theme::BORDER - })) - .title(" FILTER & SEARCH "); - - let paragraph = Paragraph::new(Line::from(spans)).block(block); - f.render_widget(paragraph, area); -} diff --git a/src/ui/views/mod.rs b/src/ui/views/mod.rs deleted file mode 100644 index e2527a8..0000000 --- a/src/ui/views/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod dashboard; -pub mod fix_progress; -pub mod issue_list; -pub mod scanner; -pub mod settings; diff --git a/src/ui/views/scanner.rs b/src/ui/views/scanner.rs deleted file mode 100644 index 5648791..0000000 --- a/src/ui/views/scanner.rs +++ /dev/null @@ -1,641 +0,0 @@ -//! Tab 2 — "Health Scan". -//! -//! Every diagnostic module runs at the same time, which is what makes this tab -//! harder to draw than a plain progress bar: there is no single "current" step -//! to report. The modules pane therefore lets each module speak for itself, and -//! puts a running clock on whatever it is doing — some steps shell out to DISM -//! and hold one percentage for minutes, and a stopped number is -//! indistinguishable from a hung program without one. - -use crate::engine::issue::{Issue, Severity}; -use crate::ui::theme::Theme; -use crate::ui::views::fix_progress::style_console_line; -use ratatui::Frame; -use ratatui::layout::{Constraint, Direction, Layout, Rect}; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, Gauge, List, ListItem, Paragraph}; -use std::collections::VecDeque; -use std::time::Duration; - -/// One module's row in the modules pane. -pub struct ModuleRow<'a> { - pub name: &'a str, - pub icon: &'a str, - pub percent: u8, - pub is_done: bool, - pub failed: bool, - /// What the module last reported it was doing. - pub step: &'a str, - /// How long it has been on that step, while it is still running. - pub step_elapsed: Option, -} - -pub struct ScannerViewState<'a> { - pub is_scanning: bool, - pub overall_progress: u8, - pub modules: &'a [ModuleRow<'a>], - pub log_messages: &'a VecDeque, - pub issues: &'a [Issue], - pub log_scroll: usize, - /// Wall-clock time since the scan started. - pub elapsed: Option, -} - -/// Frames of the activity marker on a running module. -/// -/// Deliberately ASCII: the modules pane is the one place a user stares at while -/// wondering whether the program is alive, which is the worst possible place to -/// risk a missing glyph on a machine still running the raster console font. -const SPINNER: [char; 4] = ['|', '/', '-', '\\']; - -/// How long a step has to run before its clock is worth showing. -/// -/// Most steps finish inside a second, and a timer flickering on and off next to -/// every one of them reads as noise rather than as reassurance. -const CLOCK_AFTER: Duration = Duration::from_secs(2); - -/// Rows a one-line widget in a bordered block needs. -const BAR_HEIGHT: u16 = 3; - -/// Below this the live log stops carrying enough scrollback to be worth the -/// row it costs, so the layout changes shape instead of shrinking it further. -const MIN_LOG_HEIGHT: u16 = 5; - -pub fn render_scanner(f: &mut Frame, area: Rect, state: &ScannerViewState) { - let modules_height = state.modules.len() as u16 + 2; - - // Two layouts, chosen by the height available. - // - // Given the room, the modules pane spans the full width and each module - // states its current step on its own line. That step is the whole answer to - // "what is it doing", and half a terminal width truncates it to uselessness - // — "Analysing the WinSxS component s..." tells nobody anything. On a short - // terminal modules and log go back to sharing the row and the step text is - // what gives way, because seven visible modules beat three detailed ones. - let full_width = area.height >= modules_height + BAR_HEIGHT * 2 + MIN_LOG_HEIGHT; - - if full_width { - let rows = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Length(BAR_HEIGHT), // Overall progress - Constraint::Length(modules_height), // Modules, one line each - Constraint::Min(MIN_LOG_HEIGHT), // Live log - Constraint::Length(BAR_HEIGHT), // Findings summary - ]) - .split(area); - - render_overall_gauge(f, rows[0], state); - render_modules(f, rows[1], state, true); - render_log(f, rows[2], state); - render_summary(f, rows[3], state.issues); - } else { - let rows = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Length(BAR_HEIGHT), - Constraint::Min(4), - Constraint::Length(BAR_HEIGHT), - ]) - .split(area); - - let center = Layout::default() - .direction(Direction::Horizontal) - .constraints([Constraint::Percentage(48), Constraint::Percentage(52)]) - .split(rows[1]); - - render_overall_gauge(f, rows[0], state); - render_modules(f, center[0], state, false); - render_log(f, center[1], state); - render_summary(f, rows[2], state.issues); - } -} - -/// The run as a whole: how much is done, and how long it has been going. -/// -/// The title used to name the module that reported most recently and the step -/// it was on. With every module running at once that is a lottery, not a -/// status — the winner was whichever module happened to be chatty, never the -/// slow one actually holding the run up. -fn render_overall_gauge(f: &mut Frame, area: Rect, state: &ScannerViewState) { - let done = state.modules.iter().filter(|m| m.is_done).count(); - let clock = state - .elapsed - .map(|d| format!(" - {} elapsed", format_duration(d))) - .unwrap_or_default(); - - let title = if state.is_scanning { - format!( - " DIAGNOSTICS RUNNING - {}/{} modules complete{} ", - done, - state.modules.len(), - clock - ) - } else if done > 0 { - format!( - " DIAGNOSTICS COMPLETE - {} modules{} - ready for triage & repair ", - done, clock - ) - } else { - " DIAGNOSTICS - press [S] to start a system health scan ".to_string() - }; - - let color = if state.overall_progress >= 100 { - Theme::EMERALD - } else { - Theme::CYAN - }; - - let gauge = Gauge::default() - .block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(color)) - .title(title), - ) - .gauge_style(Style::default().fg(color).bg(Theme::BG_DEEP)) - .percent(state.overall_progress as u16) - .label(format!(" {}% ", state.overall_progress)); - - f.render_widget(gauge, area); -} - -/// Columns consumed by the marker, the percentage and the icon: `" | 100% [CLR] "`. -const ROW_PREFIX_WIDTH: usize = 14; - -/// Widest the module-name column may grow before it starts costing the step -/// text room it needs more. The longest name, "System Integrity (DISM / SFC / -/// VSS)", loses its closing bracket here — worth it, because during a scan the -/// name is the part the reader already knows and the step is the part they are -/// waiting on. -const NAME_COLUMN_MAX: usize = 30; - -/// One line per module: marker, percentage, icon, name, and — when the layout -/// gave this pane the full width — what the module is doing and for how long. -fn render_modules(f: &mut Frame, area: Rect, state: &ScannerViewState, with_steps: bool) { - let inner_width = area.width.saturating_sub(2) as usize; - - let spinner = state - .elapsed - .map(|d| SPINNER[(d.as_millis() / 150) as usize % SPINNER.len()]) - .unwrap_or(SPINNER[0]); - - // Names share one column width so the step texts start at the same offset. - // A ragged left edge on seven steps that all update independently is much - // harder to skim than a straight one. - let widest_name = state - .modules - .iter() - .map(|m| m.name.chars().count()) - .max() - .unwrap_or(0); - let name_col = widest_name - .min(NAME_COLUMN_MAX) - .min(inner_width.saturating_sub(ROW_PREFIX_WIDTH) * 2 / 5); - - let items: Vec = state - .modules - .iter() - .map(|module| { - let (marker, marker_color) = match (module.is_done, module.failed) { - (_, true) => ('x', Theme::CORAL), - (true, false) => ('+', Theme::EMERALD), - (false, false) if state.is_scanning => (spinner, Theme::CYAN), - _ => ('.', Theme::MUTED), - }; - - let name_style = if module.is_done { - Style::default().fg(Theme::TEXT_WHITE) - } else { - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::BOLD) - }; - - let name_room = if with_steps { - name_col - } else { - inner_width.saturating_sub(ROW_PREFIX_WIDTH) - }; - - let mut spans = vec![ - Span::styled( - format!(" {} ", marker), - Style::default() - .fg(marker_color) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - format!("{:>3}% ", module.percent), - Style::default().fg(percent_color(module)), - ), - Span::styled( - format!("{} ", module.icon), - Style::default().fg(Theme::CYAN), - ), - Span::styled( - format!( - "{:(module: &ModuleRow<'a>, room: usize) -> Vec> { - let clock = module - .step_elapsed - .filter(|d| *d >= CLOCK_AFTER) - .map(|d| format!(" {}", format_duration(d))) - .unwrap_or_default(); - - let step = if module.step.is_empty() { - "Waiting to start..." - } else { - module.step - }; - - let gap = 2; - let step_room = room - .saturating_sub(gap) - .saturating_sub(clock.chars().count()); - - let step_style = if module.failed { - Style::default().fg(Theme::CORAL) - } else if module.is_done { - Style::default().fg(Theme::MUTED) - } else { - Style::default().fg(Theme::CYAN) - }; - - vec![ - Span::styled(" ".repeat(gap), Style::default()), - Span::styled(truncate(step, step_room), step_style), - // A clock only appears once a step has been running long enough to be - // worth a second look, so it earns the colour that says "look here". - Span::styled(clock, Style::default().fg(Theme::AMBER)), - ] -} - -fn percent_color(module: &ModuleRow) -> ratatui::style::Color { - if module.failed { - Theme::CORAL - } else if module.is_done { - Theme::EMERALD - } else { - Theme::AMBER - } -} - -fn render_log(f: &mut Frame, area: Rect, state: &ScannerViewState) { - let viewport_height = area.height.saturating_sub(2) as usize; - let total_logs = state.log_messages.len(); - - let end_idx = total_logs.saturating_sub(state.log_scroll); - let start_idx = end_idx.saturating_sub(viewport_height); - - let log_lines: Vec = (start_idx..end_idx) - .filter_map(|idx| state.log_messages.get(idx)) - .map(|msg| style_console_line(msg)) - .collect(); - - let title = if state.log_scroll > 0 { - format!( - " LIVE DIAGNOSTIC LOG [lines {}-{} of {} | End = live] ", - start_idx + 1, - end_idx, - total_logs - ) - } else { - format!( - " LIVE DIAGNOSTIC LOG [{}] [PgUp/PgDn to scroll] ", - total_logs - ) - }; - - let log_box = Paragraph::new(log_lines).block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(if state.log_scroll > 0 { - Theme::AMBER - } else { - Theme::BORDER - })) - .title(title), - ); - f.render_widget(log_box, area); -} - -fn render_summary(f: &mut Frame, area: Rect, issues: &[Issue]) { - let count = |severity: Severity| issues.iter().filter(|i| i.severity == severity).count(); - - let summary_line = Line::from(vec![ - Span::styled( - " Scan result: ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - format!(" {} issues in total ", issues.len()), - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::BOLD), - ), - Span::styled("│ ", Style::default().fg(Theme::BORDER)), - Span::styled( - format!(" [!] {} critical ", count(Severity::Critical)), - Style::default() - .fg(Theme::CORAL) - .add_modifier(Modifier::BOLD), - ), - Span::styled("│ ", Style::default().fg(Theme::BORDER)), - Span::styled( - format!(" [!] {} warnings ", count(Severity::Warning)), - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled("│ ", Style::default().fg(Theme::BORDER)), - Span::styled( - format!(" [i] {} informational ", count(Severity::Info)), - Style::default().fg(Theme::CYAN), - ), - Span::styled( - " -> Press [3] for issue triage & selection ", - Style::default() - .fg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - ), - ]); - - let summary_bar = Paragraph::new(summary_line).block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::BORDER)), - ); - - f.render_widget(summary_bar, area); -} - -/// Cut `text` to `width` columns, marking the cut with an ellipsis. -/// -/// Ratatui would clip an overlong span for us, but silently and at whatever the -/// pane edge happens to be; a visible "..." is the difference between a name -/// that is abbreviated and one that looks corrupted. -fn truncate(text: &str, width: usize) -> String { - if text.chars().count() <= width { - return text.to_string(); - } - if width <= 3 { - return ".".repeat(width); - } - let kept: String = text.chars().take(width - 3).collect(); - format!("{}...", kept.trim_end()) -} - -/// Seconds under a minute, `m:ss` above it. -fn format_duration(d: Duration) -> String { - let secs = d.as_secs(); - if secs < 60 { - format!("{}s", secs) - } else { - format!("{}:{:02}", secs / 60, secs % 60) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use ratatui::Terminal; - use ratatui::backend::TestBackend; - - fn row<'a>(name: &'a str, percent: u8, step: &'a str, secs: u64) -> ModuleRow<'a> { - ModuleRow { - name, - icon: "[CLR]", - percent, - is_done: false, - failed: false, - step, - step_elapsed: Some(Duration::from_secs(secs)), - } - } - - /// Renders into the *body* area, which is what `render_app` passes: the - /// header and footer take nine rows off the terminal before this view sees - /// it, so a 30-row terminal is `height = 21` here. - fn screen(state: &ScannerViewState, width: u16, height: u16) -> String { - let mut terminal = Terminal::new(TestBackend::new(width, height)).unwrap(); - terminal - .draw(|f| render_scanner(f, f.area(), state)) - .unwrap(); - let buffer = terminal.backend().buffer().clone(); - (0..height) - .map(|y| { - (0..width) - .map(|x| buffer[(x, y)].symbol()) - .collect::() - }) - .collect::>() - .join("\n") - } - - fn state<'a>(modules: &'a [ModuleRow<'a>], logs: &'a VecDeque) -> ScannerViewState<'a> { - ScannerViewState { - is_scanning: true, - overall_progress: 30, - modules, - log_messages: logs, - issues: &[], - log_scroll: 0, - elapsed: Some(Duration::from_secs(75)), - } - } - - /// The reported bug: a module parked on a long DISM call showed a bare - /// "10%" and nothing else, so it was indistinguishable from a hang. - #[test] - fn a_running_module_shows_what_it_is_doing_and_for_how_long() { - let logs = VecDeque::new(); - let modules = [row( - "System & Cache Cleaner", - 10, - "Analysing the WinSxS component store (DISM, 1-2 min)...", - 62, - )]; - let rendered = screen(&state(&modules, &logs), 120, 21); - - assert!(rendered.contains("System & Cache Cleaner")); - assert!( - rendered.contains("Analysing the WinSxS component store (DISM, 1-2 min)..."), - "the step, in full, on the module's own row: {rendered}" - ); - assert!( - rendered.contains("1:02"), - "and how long it has been running: {rendered}" - ); - } - - /// The step is the answer to the user's question, so the layout has to keep - /// it whole at the sizes people actually run a terminal at — with all seven - /// modules present, which is what sets the name column width. - /// - /// These two are the longest step labels the modules emit; if a new one - /// outgrows them, this is where that shows up rather than on a user's - /// screen as "Checking the Windows Update services (wuause...". - #[test] - fn the_longest_steps_survive_intact_at_ordinary_terminal_sizes() { - let logs = VecDeque::new(); - let names = [ - "Network & DNS Connectivity", - "Storage & File System", - "System & Cache Cleaner", - "Windows Update & Services", - "Registry & Autostart", - "Event-Log & Crash-Dump Analyse", - "System Integrity (DISM / SFC / VSS)", - ]; - - for step in [ - "Checking the Windows Update services (wuauserv, bits, cryptsvc)...", - "Analysing the WinSxS component store (DISM, 1-2 min)...", - ] { - let modules: Vec = names.iter().map(|n| row(n, 10, step, 62)).collect(); - // Body heights for 30-, 36- and 60-row terminals. - for (w, h) in [(120, 21), (140, 27), (200, 51)] { - let rendered = screen(&state(&modules, &logs), w, h); - assert!( - rendered.contains(step), - "'{step}' was cut short at {w}x{h}:\n{rendered}" - ); - } - } - } - - /// A step that has only just started does not need a clock next to it. - #[test] - fn a_short_step_is_not_cluttered_with_a_timer() { - let logs = VecDeque::new(); - let modules = [row("Network & DNS Connectivity", 20, "Testing DNS...", 1)]; - let rendered = screen(&state(&modules, &logs), 100, 30); - - assert!(rendered.contains("Testing DNS...")); - assert!(!rendered.contains("1s"), "got: {rendered}"); - } - - /// The header has to describe the run, not whichever module spoke last. - #[test] - fn the_gauge_counts_completed_modules_rather_than_naming_one() { - let logs = VecDeque::new(); - let mut modules = [ - row("Network & DNS Connectivity", 100, "Finished", 0), - row("System & Cache Cleaner", 10, "Analysing...", 62), - ]; - modules[0].is_done = true; - - let rendered = screen(&state(&modules, &logs), 100, 30); - assert!(rendered.contains("1/2 modules complete"), "got: {rendered}"); - assert!(rendered.contains("1:15 elapsed"), "got: {rendered}"); - } - - /// A failed module has stopped working and must stop looking busy. - #[test] - fn a_failed_module_is_marked_as_finished_not_as_running() { - let logs = VecDeque::new(); - let mut modules = [row( - "Storage & File System", - 100, - "Failed - access denied", - 0, - )]; - modules[0].is_done = true; - modules[0].failed = true; - - let rendered = screen(&state(&modules, &logs), 100, 30); - assert!( - rendered.contains("Failed - access denied"), - "got: {rendered}" - ); - assert!(rendered.contains(" x "), "the failure marker: {rendered}"); - } - - /// On a terminal too short for the stacked layout the step text is what - /// gives way — every module stays listed, and the log keeps its pane. - #[test] - fn a_short_terminal_keeps_every_module_and_the_log_visible() { - let logs = VecDeque::new(); - let names = [ - "Network & DNS Connectivity", - "Storage & File System", - "System & Cache Cleaner", - "Windows Update & Services", - "Registry & Autostart", - "Event-Log & Crash-Dump Analyse", - "System Integrity (DISM / SFC / VSS)", - ]; - let modules: Vec = names - .iter() - .map(|n| row(n, 10, "Analysing the WinSxS component store...", 30)) - .collect(); - - // The body of an 80x24 terminal, the smallest size the app supports. - let rendered = screen(&state(&modules, &logs), 80, 15); - - // Names are abbreviated hard at this width, so match on enough of each - // to tell them apart rather than on an assumed truncation point. - for name in names { - let identifiable: String = name.chars().take(15).collect(); - assert!( - rendered.contains(&identifiable), - "module '{name}' fell off the pane:\n{rendered}" - ); - } - assert!( - rendered.contains("LIVE DIAGNOSTIC LOG"), - "the log keeps its pane:\n{rendered}" - ); - } - - #[test] - fn durations_read_as_seconds_below_a_minute_and_clock_time_above() { - assert_eq!(format_duration(Duration::from_secs(0)), "0s"); - assert_eq!(format_duration(Duration::from_secs(59)), "59s"); - assert_eq!(format_duration(Duration::from_secs(60)), "1:00"); - assert_eq!(format_duration(Duration::from_secs(125)), "2:05"); - assert_eq!(format_duration(Duration::from_secs(3600)), "60:00"); - } - - #[test] - fn truncation_marks_the_cut_and_never_exceeds_the_width() { - assert_eq!(truncate("short", 20), "short"); - assert_eq!(truncate("System Integrity (DISM)", 12), "System In..."); - assert_eq!(truncate("anything", 2), ".."); - for width in 0..30 { - assert!( - truncate("System Integrity (DISM / SFC / VSS)", width) - .chars() - .count() - <= width - ); - } - } -} diff --git a/src/ui/views/settings.rs b/src/ui/views/settings.rs deleted file mode 100644 index dd27e20..0000000 --- a/src/ui/views/settings.rs +++ /dev/null @@ -1,240 +0,0 @@ -//! Tab 5 — "Settings & Safety". -//! -//! Two lists side by side: what WinMedic is configured to do (left) and what it -//! has already done, plus how to undo it (right). The `[B]` key decides which of -//! the two the arrow keys drive; [`SafetyPanelState::is_focused`] is what tells -//! the user which one that currently is. - -use crate::config::AppConfig; -use crate::ui::theme::Theme; -use crate::ui::widgets::safety_panel::{SafetyPanelState, render_safety_panel}; -use ratatui::Frame; -use ratatui::layout::{Constraint, Direction, Layout, Rect}; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, List, ListItem, Paragraph, Wrap}; - -pub struct SettingsViewState<'a> { - pub config: &'a AppConfig, - pub selected_setting_index: usize, - pub dry_run: bool, - pub safety: SafetyPanelState<'a>, - /// Where the audit log and the `.reg` snapshots are written. - pub log_dir_path: &'a str, -} - -pub fn render_settings(f: &mut Frame, area: Rect, state: &SettingsViewState) { - let rows = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Min(8), // Settings list | Backups & VSS - Constraint::Length(6), // Selected setting - Constraint::Length(5), // Storage locations & rollback hint - ]) - .split(area); - - let top = Layout::default() - .direction(Direction::Horizontal) - .constraints([Constraint::Percentage(52), Constraint::Percentage(48)]) - .split(rows[0]); - - render_setting_list( - f, - top[0], - state.config, - state.selected_setting_index, - !state.safety.is_focused, - ); - render_safety_panel(f, top[1], &state.safety); - // The description used to share this row with a "Recent actions" pane. It - // now spans the full width, which is what keeps a long help text on one line. - render_description( - f, - rows[1], - state.config, - state.selected_setting_index, - state.dry_run, - ); - render_storage_locations(f, rows[2], state.log_dir_path); -} - -/// The configuration list itself. -fn render_setting_list( - f: &mut Frame, - area: Rect, - config: &AppConfig, - selected_index: usize, - is_focused: bool, -) { - let mut items: Vec = Vec::new(); - for idx in 0..AppConfig::SETTING_COUNT { - let Some((label, value, _)) = config.setting_row(idx) else { - continue; - }; - let is_current = idx == selected_index; - - let value_color = match value.as_str() { - "ON" => Theme::EMERALD, - "OFF" => Theme::CORAL, - _ => Theme::CYAN, - }; - - // The cursor is only reverse-videoed while this list owns the arrow - // keys; otherwise it is a dimmer marker that still shows where you were. - let (marker, label_style) = match (is_current, is_focused) { - (true, true) => ( - " > ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - (true, false) => ( - " · ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - _ => (" ", Style::default().fg(Theme::TEXT_WHITE)), - }; - - let line = Line::from(vec![ - Span::styled( - marker, - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled(format!("{:<40}", label), label_style), - Span::styled( - format!(" {}", value), - Style::default() - .fg(value_color) - .add_modifier(Modifier::BOLD), - ), - ]); - items.push(ListItem::new(line)); - } - - let border_color = if is_focused { - Theme::CYAN - } else { - Theme::BORDER - }; - let title = if is_focused { - "SETTINGS ◄ [↑/↓]" - } else { - "SETTINGS ([B] to focus)" - }; - - let list = List::new(items) - .block(Theme::card_block(title).border_style(Style::default().fg(border_color))); - f.render_widget(list, area); -} - -/// What the highlighted setting means, and whether repairs are simulated. -fn render_description( - f: &mut Frame, - area: Rect, - config: &AppConfig, - selected_index: usize, - dry_run: bool, -) { - let mut lines = Vec::new(); - if let Some((label, value, help)) = config.setting_row(selected_index) { - lines.push(Line::from(vec![ - Span::styled(" Setting: ", Style::default().fg(Theme::MUTED)), - Span::styled( - label, - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" Current: ", Style::default().fg(Theme::MUTED)), - Span::styled( - value, - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - ])); - lines.push(Line::from(vec![Span::styled( - format!(" {}", help), - Style::default().fg(Theme::MUTED), - )])); - } - - lines.push(Line::from("")); - lines.push(Line::from(vec![ - Span::styled(" Simulation mode [D]: ", Style::default().fg(Theme::MUTED)), - if dry_run { - Span::styled( - "ON - repairs are only shown, never executed", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ) - } else { - Span::styled( - "OFF - repairs really are executed", - Style::default().fg(Theme::EMERALD), - ) - }, - ])); - - let info_box = Paragraph::new(lines) - .block(Theme::card_block("DESCRIPTION")) - .wrap(Wrap { trim: false }); - f.render_widget(info_box, area); -} - -/// Where settings, logs and backups live on disk, and how to roll back by hand. -fn render_storage_locations(f: &mut Frame, area: Rect, log_dir_path: &str) { - // One path per line: side by side, two full `%APPDATA%` paths overrun even a - // 120-column terminal and the second one gets cut off mid-directory. - let lines = vec![ - Line::from(vec![ - Span::styled( - " Settings file: ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - AppConfig::config_path().display().to_string(), - Style::default().fg(Theme::EMERALD), - ), - ]), - Line::from(vec![ - Span::styled( - " Logs & backups: ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled(log_dir_path, Style::default().fg(Theme::EMERALD)), - ]), - // The footer only advertises [R] while the backup pane holds focus, so - // this line is what keeps the refresh discoverable from either side. - Line::from(vec![ - Span::styled( - " Rollback: ", - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - "[B] picks a snapshot, [U] restores it after confirming, [R] reloads. Or run 'reg import '.", - Style::default().fg(Theme::MUTED), - ), - ]), - ]; - - let bottom_box = Paragraph::new(lines).block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::BORDER)), - ); - - f.render_widget(bottom_box, area); -} diff --git a/src/ui/widgets/confirm_popup.rs b/src/ui/widgets/confirm_popup.rs deleted file mode 100644 index 7087501..0000000 --- a/src/ui/widgets/confirm_popup.rs +++ /dev/null @@ -1,107 +0,0 @@ -use crate::app::ConfirmRequest; -use crate::ui::theme::Theme; -use ratatui::Frame; -use ratatui::layout::Rect; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, Clear, Paragraph, Wrap}; - -/// Modal shown before an action that changes the system without a prior scan. -pub fn render_confirm_popup(f: &mut Frame, area: Rect, request: &ConfirmRequest) { - let body = request.body(); - - let is_wide = area.width.saturating_sub(4) >= 100; - let popup_width = if is_wide { - 100.min(area.width.saturating_sub(4)) - } else { - 76.min(area.width.saturating_sub(4)) - }; - let extra_height: u16 = if is_wide { 8 } else { 9 }; - let popup_height = (body.len() as u16 + extra_height).min(area.height.saturating_sub(4)); - let x = (area.width.saturating_sub(popup_width)) / 2; - let y = (area.height.saturating_sub(popup_height)) / 2; - let popup_area = Rect::new(x, y, popup_width, popup_height); - - f.render_widget(Clear, popup_area); - - let mut lines = vec![Line::from("")]; - for text in body { - lines.push(Line::from(vec![Span::styled( - format!(" {}", text), - Style::default().fg(Theme::TEXT_WHITE), - )])); - } - - lines.push(Line::from("")); - if is_wide { - lines.push(Line::from(vec![ - Span::styled(" ", Style::default()), - Span::styled( - " [Y] / [Enter] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - format!(" {} ", request.confirm_label()), - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled( - " [N] / [Esc] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - format!(" {}", request.dismiss_label()), - Style::default().fg(Theme::TEXT_WHITE), - ), - ])); - } else { - lines.push(Line::from(vec![ - Span::styled(" ", Style::default()), - Span::styled( - " [Y] / [Enter] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - format!(" {}", request.confirm_label()), - Style::default().fg(Theme::TEXT_WHITE), - ), - ])); - lines.push(Line::from(vec![ - Span::styled(" ", Style::default()), - Span::styled( - " [N] / [Esc] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - format!(" {}", request.dismiss_label()), - Style::default().fg(Theme::TEXT_WHITE), - ), - ])); - } - - let block = Block::default() - .title(format!(" [!] {} ", request.title())) - .title_style( - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ) - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::AMBER)); - - let paragraph = Paragraph::new(lines) - .block(block) - .wrap(Wrap { trim: false }); - f.render_widget(paragraph, popup_area); -} diff --git a/src/ui/widgets/footer.rs b/src/ui/widgets/footer.rs deleted file mode 100644 index a3ad280..0000000 --- a/src/ui/widgets/footer.rs +++ /dev/null @@ -1,128 +0,0 @@ -use crate::app::{TAB_DASHBOARD, TAB_REPAIR, TAB_SCANNER, TAB_SETTINGS, TAB_TRIAGE}; -use crate::ui::theme::Theme; -use ratatui::Frame; -use ratatui::layout::Rect; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, Paragraph}; - -pub fn render_footer( - f: &mut Frame, - area: Rect, - active_tab_index: usize, - status_msg: Option<&str>, - is_busy: bool, - dry_run: bool, - // Which of the two lists on the Settings & Safety tab owns the arrow keys. - backups_focused: bool, -) { - // While something is running, Esc is the key that matters most. - let key_hints: Vec<(&str, &str)> = if is_busy { - vec![ - ("Esc", "Cancel"), - ("←/→", "Tabs"), - ("?", "Help"), - ("Q", "Quit"), - ] - } else { - match active_tab_index { - TAB_DASHBOARD => vec![ - ("←/→", "Tabs"), - ("D", "Simulate"), - ("?", "Help"), - ("Q", "Quit"), - ], - TAB_SCANNER => vec![ - ("←/→", "Tabs"), - ("PgUp/Dn", "Scroll"), - ("R", "Scan"), - ("?", "Help"), - ("Q", "Quit"), - ], - TAB_TRIAGE => vec![ - ("←/→", "Tabs"), - ("↑/↓", "Select"), - ("Space", "On/Off"), - ("C/W/I", "Filter"), - ("/", "Search"), - ("F", "Repair"), - ("E", "Report"), - ("?", "Help"), - ("Q", "Quit"), - ], - TAB_REPAIR => vec![ - ("←/→", "Tabs"), - ("F", "Start"), - ("PgUp/Dn", "Scroll"), - ("D", "Simulate"), - ("E", "Report"), - ("?", "Help"), - ("Q", "Quit"), - ], - // One tab, two lists: the hints follow whichever one has the arrows. - TAB_SETTINGS if backups_focused => vec![ - ("←/→", "Tabs"), - ("↑/↓", "Select Backup"), - ("U", "Rollback"), - ("R", "Refresh VSS"), - ("B/Esc", "Settings"), - ("?", "Help"), - ("Q", "Quit"), - ], - TAB_SETTINGS => vec![ - ("←/→", "Tabs"), - ("↑/↓", "Select"), - ("Space/Enter", "Toggle"), - ("+/-", "Value"), - ("B", "Backups"), - ("?", "Help"), - ("Q", "Quit"), - ], - _ => vec![("←/→", "Tabs"), ("?", "Help"), ("Q", "Quit")], - } - }; - - let mut spans = vec![Span::styled(" ", Style::default())]; - - if dry_run { - spans.push(Span::styled( - " SIMULATION ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - )); - spans.push(Span::styled(" ", Style::default())); - } - - for (key, desc) in key_hints { - spans.push(Span::styled( - format!(" [{}] ", key), - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - )); - spans.push(Span::styled( - format!("{} ", desc), - Style::default().fg(Theme::TEXT_WHITE), - )); - } - - if let Some(msg) = status_msg { - spans.push(Span::styled(" │ ", Style::default().fg(Theme::BORDER))); - spans.push(Span::styled( - msg, - Style::default() - .fg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - )); - } - - let footer = Paragraph::new(Line::from(spans)).block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::BORDER)), - ); - - f.render_widget(footer, area); -} diff --git a/src/ui/widgets/header.rs b/src/ui/widgets/header.rs deleted file mode 100644 index c82f9dc..0000000 --- a/src/ui/widgets/header.rs +++ /dev/null @@ -1,161 +0,0 @@ -use crate::ui::theme::Theme; -use crate::utils::hardware::SystemTelemetry; -use ratatui::Frame; -use ratatui::layout::{Alignment, Constraint, Direction, Layout, Rect}; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, Paragraph, Tabs}; - -// Ratatui render functions receive the slice of app state they draw. Passing -// `&App` instead would couple every widget to the whole application struct, so -// the long signature is the deliberate trade-off. -#[allow(clippy::too_many_arguments)] -pub fn render_header( - f: &mut Frame, - area: Rect, - active_tab_index: usize, - telemetry: Option<&SystemTelemetry>, - is_admin: bool, - issue_count: usize, - is_scanning: bool, - dry_run: bool, -) { - let chunks = Layout::default() - .direction(Direction::Vertical) - .constraints([Constraint::Length(3), Constraint::Length(3)]) - .split(area); - - // Top System Bar - let (cpu_str, ram_str, os_str) = if let Some(t) = telemetry { - ( - format!("CPU: {:.1}%", t.cpu_usage), - format!( - "RAM: {:.1}/{:.1}GB", - (t.ram_used_mb as f32 / 1024.0), - (t.ram_total_mb as f32 / 1024.0) - ), - format!("{} {}", t.os_name, t.os_version), - ) - } else { - ( - "CPU: --%".to_string(), - "RAM: --/--GB".to_string(), - "Windows".to_string(), - ) - }; - - let admin_badge = if is_admin { - Span::styled( - " [ADMIN: YES] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - ) - } else { - Span::styled( - " [ADMIN: NO] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CORAL) - .add_modifier(Modifier::BOLD), - ) - }; - - let mode_badge = if dry_run { - Span::styled( - " [SIMULATION] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ) - } else { - Span::styled("", Style::default()) - }; - - let top_line = Line::from(vec![ - Span::styled( - format!(" WinMedic v{} ", env!("CARGO_PKG_VERSION")), - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled("─ ", Style::default().fg(Theme::BORDER)), - Span::styled( - "Windows Self-Healing Engine ", - Style::default().fg(Theme::MUTED), - ), - mode_badge, - Span::styled("│ ", Style::default().fg(Theme::BORDER)), - Span::styled( - format!(" {} ", cpu_str), - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled("│ ", Style::default().fg(Theme::BORDER)), - Span::styled( - format!(" {} ", ram_str), - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled("│ ", Style::default().fg(Theme::BORDER)), - Span::styled( - format!(" {} ", os_str), - Style::default().fg(Theme::TEXT_WHITE), - ), - Span::styled("│ ", Style::default().fg(Theme::BORDER)), - Span::styled(" VSS: Ready ", Style::default().fg(Theme::EMERALD)), - Span::styled("│ ", Style::default().fg(Theme::BORDER)), - admin_badge, - ]); - - let top_bar = Paragraph::new(top_line) - .block( - Block::default() - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::BORDER)), - ) - .alignment(Alignment::Left); - - f.render_widget(top_bar, chunks[0]); - - // Navigation Tabs - let scan_indicator = if is_scanning { " (● Scan...)" } else { "" }; - let triage_badge = if issue_count > 0 { - format!(" [{}]", issue_count) - } else { - "".to_string() - }; - - let tab_titles = vec![ - " [1] Dashboard ".to_string(), - format!(" [2] Health Scan{} ", scan_indicator), - format!(" [3] Issue Triage{} ", triage_badge), - " [4] Repair Center ".to_string(), - " [5] Settings & Safety ".to_string(), - ]; - - let tabs = Tabs::new(tab_titles) - .block( - Block::default() - .title(" ◄ [←/→] Tabs ► ") - .title_alignment(Alignment::Right) - .title_style( - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ) - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::CYAN)), - ) - .select(active_tab_index) - .style(Style::default().fg(Theme::MUTED)) - .highlight_style( - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ) - .divider("│"); - - f.render_widget(tabs, chunks[1]); -} diff --git a/src/ui/widgets/help_popup.rs b/src/ui/widgets/help_popup.rs deleted file mode 100644 index 828723a..0000000 --- a/src/ui/widgets/help_popup.rs +++ /dev/null @@ -1,162 +0,0 @@ -use crate::ui::theme::Theme; -use ratatui::Frame; -use ratatui::layout::Rect; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, Clear, Paragraph}; - -/// A section heading followed by its `(key, description)` pairs. -type Section = (&'static str, &'static [(&'static str, &'static str)]); - -const SECTIONS: &[Section] = &[ - ( - "Navigation", - &[ - ("[←]/[→] or [h]/[l]", "Switch tab (BIOS-style navigation)"), - ( - "[1] - [5]", - "Jump directly to tab (Dashboard, Scan, Triage, Repair, Settings & Safety)", - ), - ( - "[Tab] / [Shift+Tab]", - "Cycle forwards / backwards through tabs", - ), - ("[↑]/[↓] or [j]/[k]", "Navigate lists / items"), - ( - "[U]", - "Show available update - download, verify and install it (outside tab 5)", - ), - ("[Esc]", "Back to dashboard"), - ], - ), - ( - "Scan & Repair", - &[ - ("[S] / [R]", "Start or repeat the system health scan"), - ("[F]", "Run the selected repairs"), - ("[D]", "Simulation mode - shows steps, changes nothing"), - ("[PgUp] / [PgDn]", "Scroll the live log up / down"), - ( - "[Home] / [End]", - "Jump to the top of the log / back to the live tail", - ), - ("[E]", "Export the diagnostic report as HTML"), - ("[Esc]", "Cancel a running scan or repair"), - ], - ), - ( - "Issue Triage & Filters (tab 3)", - &[ - ( - "[c] / [w] / [i]", - "Filter by severity (critical / warning / info)", - ), - ("[m]", "Filter by diagnostic module (cycles through)"), - ("[/]", "Search findings and details full-text"), - ("[x]", "Clear all active filters and the search"), - ("[Space]", "Select / deselect an issue for repair"), - ("[A] / [N]", "Select / deselect every visible issue"), - ], - ), - ( - "Settings & Safety (tab 5)", - &[ - ( - "[Enter]", - "Open custom value input dialog (or toggle switch)", - ), - ("[Space]", "Toggle a switch or step numeric value (+Step)"), - ( - "[+] / [-] or [[]/[]]", - "Increase / decrease a numeric value", - ), - ( - "[B]", - "Move [↑]/[↓] between the settings and the backup list", - ), - ("[U]", "Restore the selected .reg backup, after confirming"), - ("[R]", "Reload the restore points and registry backups"), - ], - ), -]; - -pub fn render_help_popup(f: &mut Frame, area: Rect) { - let mut text: Vec = vec![ - Line::from(vec![Span::styled( - format!( - " WinMedic v{} - Keyboard Shortcuts", - env!("CARGO_PKG_VERSION") - ), - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - )]), - Line::from(""), - ]; - - for (heading, entries) in SECTIONS { - text.push(Line::from(vec![ - Span::styled(" ", Style::default()), - Span::styled( - format!("{}:", heading), - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - ])); - for (key, desc) in *entries { - text.push(Line::from(vec![ - Span::styled( - format!(" {:<26} ", key), - Style::default() - .fg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled(*desc, Style::default().fg(Theme::TEXT_WHITE)), - ])); - } - text.push(Line::from("")); - } - - text.push(Line::from(vec![ - Span::styled(" ", Style::default()), - Span::styled( - "Safety:", - Style::default() - .fg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - " VSS restore points, registry backups and the rollback all live in tab [5].", - Style::default().fg(Theme::MUTED), - ), - ])); - text.push(Line::from("")); - text.push(Line::from(vec![Span::styled( - " Press [?] or [Esc] to close this help.", - Style::default() - .fg(Theme::MUTED) - .add_modifier(Modifier::ITALIC), - )])); - - let popup_width = 88.min(area.width.saturating_sub(4)); - let popup_height = (text.len() as u16 + 2).min(area.height.saturating_sub(2)); - let x = (area.width.saturating_sub(popup_width)) / 2; - let y = (area.height.saturating_sub(popup_height)) / 2; - let popup_area = Rect::new(x, y, popup_width, popup_height); - - f.render_widget(Clear, popup_area); - - let block = Block::default() - .title(" HELP & KEYBOARD SHORTCUTS ") - .title_style( - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ) - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::CYAN)); - - let paragraph = Paragraph::new(text).block(block); - f.render_widget(paragraph, popup_area); -} diff --git a/src/ui/widgets/mod.rs b/src/ui/widgets/mod.rs deleted file mode 100644 index a788dbb..0000000 --- a/src/ui/widgets/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub mod confirm_popup; -pub mod footer; -pub mod header; -pub mod help_popup; -pub mod safety_panel; -pub mod setting_input_popup; diff --git a/src/ui/widgets/safety_panel.rs b/src/ui/widgets/safety_panel.rs deleted file mode 100644 index 996d3f9..0000000 --- a/src/ui/widgets/safety_panel.rs +++ /dev/null @@ -1,259 +0,0 @@ -//! The safety surface: VSS restore points and registry snapshots. -//! -//! These panes used to be a tab of their own ("Backups & Logs"). They are -//! widgets rather than a view because the Settings & Safety tab composes them -//! next to the configuration list, and the dashboard renders its own one-line -//! summary of the audit trail from [`latest_action_line`]. - -use crate::safety::audit::AuditEntry; -use crate::safety::reg_backup::BackupRecord; -use crate::ui::theme::Theme; -use ratatui::Frame; -use ratatui::layout::Rect; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Paragraph, Wrap}; - -pub struct SafetyPanelState<'a> { - /// Backup records, newest first — the order shown and selected against. - pub backup_records: &'a [&'a BackupRecord], - pub selected_backup_index: usize, - pub vss_restore_points: &'a [String], - pub restore_points_loading: bool, - pub is_restoring: bool, - /// True while `↑`/`↓` drive the backup list rather than the settings list. - pub is_focused: bool, -} - -/// How many backup records fit in the pane before it starts scrolling. -const VISIBLE_BACKUPS: usize = 5; - -/// How many VSS restore points to list before collapsing the rest into a count. -const VISIBLE_RESTORE_POINTS: usize = 2; - -/// Restore points and registry snapshots, with the `[U]` rollback target marked. -pub fn render_safety_panel(f: &mut Frame, area: Rect, state: &SafetyPanelState) { - let mut lines = vec![Line::from(vec![Span::styled( - " System restore points (VSS):", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - )])]; - - if state.restore_points_loading { - lines.push(Line::from(vec![Span::styled( - " Querying Windows restore points...", - Style::default().fg(Theme::AMBER), - )])); - } else if state.vss_restore_points.is_empty() { - lines.push(Line::from(vec![Span::styled( - " (No restore points found - [R] refreshes)", - Style::default().fg(Theme::MUTED), - )])); - } else { - // Deliberately short. Restore points are read-only context; the - // snapshot list below is the part the user can act on, and on an 80 - // column terminal a long VSS list pushes it off the pane entirely. - for rp in state.vss_restore_points.iter().take(VISIBLE_RESTORE_POINTS) { - lines.push(Line::from(vec![ - Span::styled(" [OK] ", Style::default().fg(Theme::EMERALD)), - Span::styled(rp.as_str(), Style::default().fg(Theme::TEXT_WHITE)), - ])); - } - if let Some(hidden) = state - .vss_restore_points - .len() - .checked_sub(VISIBLE_RESTORE_POINTS) - .filter(|n| *n > 0) - { - lines.push(Line::from(vec![Span::styled( - format!(" + {} more restore point(s)", hidden), - Style::default().fg(Theme::MUTED), - )])); - } - } - - lines.push(Line::from("")); - lines.push(Line::from(vec![Span::styled( - " Saved registry snapshots (.reg):", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - )])); - - if state.backup_records.is_empty() { - lines.push(Line::from(vec![Span::styled( - " (No backed-up registry modifications yet)", - Style::default().fg(Theme::MUTED), - )])); - } else { - // Only a handful of entries fit; scroll the window so the selected - // backup stays visible even with a long backup history. - let offset = state - .selected_backup_index - .saturating_sub(VISIBLE_BACKUPS - 1) - .min(state.backup_records.len().saturating_sub(VISIBLE_BACKUPS)); - - if offset > 0 { - lines.push(Line::from(vec![Span::styled( - format!(" ↑ {} newer backup(s)", offset), - Style::default().fg(Theme::MUTED), - )])); - } - - for (idx, rec) in state - .backup_records - .iter() - .enumerate() - .skip(offset) - .take(VISIBLE_BACKUPS) - { - // The cursor is only highlighted while this pane owns the arrow - // keys. A reverse-video row on an unfocused list reads as "this is - // what [U] will restore right now", which is only true after [B]. - let is_current = idx == state.selected_backup_index; - let (marker, title_style) = match (is_current, state.is_focused) { - (true, true) => ( - " > ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - (true, false) => ( - " · ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - _ => (" ", Style::default().fg(Theme::TEXT_WHITE)), - }; - - lines.push(Line::from(vec![ - Span::styled(marker, Style::default().fg(Theme::CYAN)), - Span::styled("[REG] ", Style::default().fg(Theme::AMBER)), - Span::styled( - format!("[{}] ", rec.timestamp), - Style::default().fg(Theme::MUTED), - ), - Span::styled(rec.description.clone(), title_style), - ])); - lines.push(Line::from(vec![Span::styled( - format!(" {}", rec.key_path), - Style::default().fg(Theme::MUTED), - )])); - } - } - - // The full key list lives in the footer; the title only has to say which - // pane the arrows are pointed at. Spelling out [U]/[R] here too made the - // title longer than the pane at 120 columns, so it clipped mid-word. - let title = if state.is_restoring { - "BACKUPS & VSS - ROLLBACK RUNNING..." - } else if state.is_focused { - "BACKUPS & VSS ◄ [↑/↓]" - } else { - "BACKUPS & VSS ([B] to focus)" - }; - - // A cyan border marks which of the tab's two lists the arrow keys drive. - let border_color = if state.is_focused { - Theme::CYAN - } else { - Theme::BORDER - }; - - let panel = Paragraph::new(lines) - .block(Theme::card_block(title).border_style(Style::default().fg(border_color))) - // `trim: false` keeps the two-space indent that groups a snapshot's key - // path under its description; trimming flattens the whole pane. - .wrap(Wrap { trim: false }); - - f.render_widget(panel, area); -} - -/// One audit entry as `[time] [ACTION] [STATUS] title`. -fn audit_line(entry: &AuditEntry) -> Line<'static> { - let (status_icon, status_color) = match entry.status.as_str() { - "SUCCESS" => ("[OK]", Theme::EMERALD), - "FAILED" => ("[X]", Theme::CORAL), - "WARNING" => ("[WARN]", Theme::AMBER), - _ => ("[INFO]", Theme::CYAN), - }; - - Line::from(vec![ - Span::styled( - format!("[{}] ", entry.timestamp), - Style::default().fg(Theme::MUTED), - ), - Span::styled( - format!("[{}] ", entry.action_type), - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled( - format!("{} ", status_icon), - Style::default() - .fg(status_color) - .add_modifier(Modifier::BOLD), - ), - Span::styled(entry.title.clone(), Style::default().fg(Theme::TEXT_WHITE)), - ]) -} - -/// A single-line summary of the newest audit entry, for the dashboard. -/// -/// Returns `None` when nothing has been logged yet, so the caller can decide -/// whether an empty row is worth the vertical space. -pub fn latest_action_line(entries: &[AuditEntry]) -> Option> { - let entry = entries.last()?; - let mut spans = vec![Span::styled( - " Last action: ", - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - )]; - spans.extend(audit_line(entry).spans); - spans.push(Span::styled( - " │ [5] Full log, backups & rollback", - Style::default().fg(Theme::MUTED), - )); - Some(Line::from(spans)) -} - -#[cfg(test)] -mod tests { - use super::*; - - fn entry(status: &str, title: &str) -> AuditEntry { - AuditEntry { - timestamp: "2026-01-01 12:00:00".to_string(), - action_type: "REPAIR".to_string(), - module_id: "registry_startup".to_string(), - title: title.to_string(), - status: status.to_string(), - details: String::new(), - } - } - - #[test] - fn latest_action_line_reports_the_newest_entry() { - let entries = vec![entry("SUCCESS", "older"), entry("FAILED", "newest")]; - - let line = latest_action_line(&entries).expect("an entry exists"); - let rendered: String = line.spans.iter().map(|s| s.content.as_ref()).collect(); - - assert!(rendered.contains("newest"), "got: {rendered}"); - assert!(!rendered.contains("older"), "got: {rendered}"); - assert!( - rendered.contains("[X]"), - "failures stay visible: {rendered}" - ); - } - - #[test] - fn latest_action_line_is_absent_before_anything_is_logged() { - assert!(latest_action_line(&[]).is_none()); - } -} diff --git a/src/ui/widgets/setting_input_popup.rs b/src/ui/widgets/setting_input_popup.rs deleted file mode 100644 index 34baffb..0000000 --- a/src/ui/widgets/setting_input_popup.rs +++ /dev/null @@ -1,111 +0,0 @@ -use crate::app::state::SettingInput; -use crate::ui::theme::Theme; -use ratatui::Frame; -use ratatui::layout::Rect; -use ratatui::style::{Modifier, Style}; -use ratatui::text::{Line, Span}; -use ratatui::widgets::{Block, Borders, Clear, Paragraph}; - -/// Modal shown when editing a numeric setting threshold via direct input. -pub fn render_setting_input_popup(f: &mut Frame, area: Rect, input: &SettingInput) { - let popup_width = 68.min(area.width.saturating_sub(4)); - let popup_height = 11.min(area.height.saturating_sub(4)); - let x = (area.width.saturating_sub(popup_width)) / 2; - let y = (area.height.saturating_sub(popup_height)) / 2; - let popup_area = Rect::new(x, y, popup_width, popup_height); - - f.render_widget(Clear, popup_area); - - let display_buffer = format!("{}_", input.buffer); - - let mut lines = vec![ - Line::from(""), - Line::from(vec![ - Span::styled(" Setting: ", Style::default().fg(Theme::MUTED)), - Span::styled( - &input.setting_name, - Style::default() - .fg(Theme::TEXT_WHITE) - .add_modifier(Modifier::BOLD), - ), - ]), - Line::from(vec![ - Span::styled(" Unit: ", Style::default().fg(Theme::MUTED)), - Span::styled( - format!( - "{} (Range: {} - {})", - input.unit, input.min_value, input.max_value - ), - Style::default().fg(Theme::CYAN), - ), - ]), - Line::from(""), - Line::from(vec![ - Span::styled(" Value: [ ", Style::default().fg(Theme::MUTED)), - Span::styled( - format!("{:<16}", display_buffer), - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" ]", Style::default().fg(Theme::MUTED)), - ]), - ]; - - if let Some(err) = &input.error_msg { - lines.push(Line::from(vec![ - Span::styled( - " [!] ", - Style::default() - .fg(Theme::CORAL) - .add_modifier(Modifier::BOLD), - ), - Span::styled(err, Style::default().fg(Theme::CORAL)), - ])); - } else { - lines.push(Line::from("")); - } - - lines.push(Line::from("")); - lines.push(Line::from(vec![ - Span::styled(" ", Style::default()), - Span::styled( - " [Enter] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::EMERALD) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" Save ", Style::default().fg(Theme::TEXT_WHITE)), - Span::styled( - " [Esc] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::CORAL) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" Cancel ", Style::default().fg(Theme::TEXT_WHITE)), - Span::styled( - " [Bksp] ", - Style::default() - .fg(Theme::BG_DEEP) - .bg(Theme::AMBER) - .add_modifier(Modifier::BOLD), - ), - Span::styled(" Delete", Style::default().fg(Theme::TEXT_WHITE)), - ])); - - let block = Block::default() - .title(" EDIT SETTING VALUE ") - .title_style( - Style::default() - .fg(Theme::CYAN) - .add_modifier(Modifier::BOLD), - ) - .borders(Borders::ALL) - .border_style(Style::default().fg(Theme::CYAN)); - - let paragraph = Paragraph::new(lines).block(block); - f.render_widget(paragraph, popup_area); -} diff --git a/src/utils/console.rs b/src/utils/console.rs new file mode 100644 index 0000000..77201b5 --- /dev/null +++ b/src/utils/console.rs @@ -0,0 +1,55 @@ +//! Handing the console back when WinMedic starts as a desktop application. +//! +//! WinMedic is a single binary linked into the *console* subsystem, and that is +//! deliberate. The alternative — `#![windows_subsystem = "windows"]` — buys a +//! GUI that never flashes a console window, and pays for it by breaking every +//! headless guarantee the CLI help makes: a Windows-subsystem process does not +//! hold the shell, so `winmedic --json > report.json` returns before the file +//! is finished and the documented exit codes arrive after whatever ran next. +//! The release workflow depends on it too, capturing `winmedic.exe --version` +//! into a variable it compares against the tag. +//! +//! So the console stays and the GUI gives it back on the way up. The cost is a +//! console window visible for as long as it takes to reach `main`: a flicker +//! when WinMedic is launched from the desktop, and nothing at all when it is +//! launched from a shell — because then it was never ours to give back. + +/// Release the console, but only when this process is the one that owns it. +/// +/// Ownership is the whole question. A process started from Explorer gets a +/// console to itself, so closing it removes a window the user never asked for. +/// A process started from `cmd.exe`, PowerShell or Windows Terminal *shares* +/// the shell's console — freeing that one detaches WinMedic from the terminal +/// it was typed into and leaves the user at a prompt that prints nothing. +/// +/// `GetConsoleProcessList` answers it directly: it reports how many processes +/// are attached to this console, and one means us and nobody else. +/// +/// Returns whether the console was actually released. +#[cfg(windows)] +pub fn release_console_if_owned() -> bool { + use windows_sys::Win32::Foundation::FALSE; + use windows_sys::Win32::System::Console::{FreeConsole, GetConsoleProcessList}; + + // Two slots are enough to tell "exactly one" from "more than one": the call + // reports the number of attached processes even when the buffer is too + // small to list them all, and their identities are of no interest here. + let mut attached = [0u32; 2]; + + // SAFETY: the pointer and the length describe the same live array, which is + // what the call contracts for. It writes at most `len` process ids and + // returns the count — zero when there is no console attached at all. + let count = unsafe { GetConsoleProcessList(attached.as_mut_ptr(), attached.len() as u32) }; + + if count != 1 { + return false; + } + + // SAFETY: takes no arguments, and this process is attached to a console. + unsafe { FreeConsole() != FALSE } +} + +#[cfg(not(windows))] +pub fn release_console_if_owned() -> bool { + false +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 508f529..d931a13 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,5 +1,6 @@ pub mod admin; pub mod cmd; +pub mod console; pub mod debug_log; pub mod fs_stats; pub mod hardware; diff --git a/src/utils/self_update.rs b/src/utils/self_update.rs index deb7d8d..de80aca 100644 --- a/src/utils/self_update.rs +++ b/src/utils/self_update.rs @@ -645,7 +645,7 @@ pub fn clean_leftovers_beside_current_exe() -> usize { /// Same shape and same reason as /// [`crate::safety::restore_point::RestorePointService`]: [`Self::inert`] is the /// default, so an [`crate::app::App`] built in a test cannot download or install -/// anything, and only the TUI entry point installs the real one. +/// anything, and only the desktop front end installs the real one. pub type InstallFuture = Pin> + Send>>; From b92cada76925883978de693c0a49348991b04c66 Mon Sep 17 00:00:00 2001 From: SecretLUL <18047775+SecretLUL@users.noreply.github.com> Date: Sat, 5 Sep 2026 19:59:40 +0200 Subject: [PATCH 17/19] docs: describe WinMedic as a desktop application MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follows the front end from the terminal to a window. The badge, the title, the overview sentence and the MSRV all moved; so did the reason CONTRIBUTING gives for the MSRV, which named the `ratatui -> instability -> darling` chain that no longer exists. Two shortcut rows are deleted rather than reworded. `[PgUp]`/`[PgDn]` and `[Home]`/`[End]` scrolled the live log consoles, which are scroll areas now that the wheel and their own scrollbars drive; there is nothing left for those keys to move. `[Tab]` becomes `[Ctrl+Tab]` because bare Tab belongs to the window, where it walks the focus between controls. The headless section now says out loud what the console subsystem is there to guarantee — that exit codes, pipes and redirects behave the way a script expects — since that is the whole reason the GUI is not a Windows-subsystem binary. The prerequisites gain the MSVC build tools: `build.rs` needs the Windows SDK's `rc.exe` to embed the icon and version resources, and a machine with only rustup installed gets a link error rather than an explanation. Not covered here: `assets/banner.jpg` still shows the terminal interface. Co-Authored-By: Claude Opus 5 --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 ++-- CONTRIBUTING.md | 4 ++-- README.md | 21 ++++++++++----------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 6da0b49..2ade203 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -70,10 +70,10 @@ body: attributes: label: How was it running? options: - - Interactive TUI + - Desktop window (GUI) - Headless (--scan) - Headless with repairs (--auto-fix) - - Simulation (--dry-run, or [D] in the TUI) + - Simulation (--dry-run, or the simulation switch in the window) validations: required: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5f24cde..2588486 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,9 +10,9 @@ where the risky parts of the codebase are. - **Windows.** The crate is Windows-only and does not cross-compile for development — `winreg` refuses to build on other platforms with a `compile_error!`. A Windows VM works fine. -- **Rust 1.88 or newer.** This is the MSRV declared in `Cargo.toml` and +- **Rust 1.95 or newer.** This is the MSRV declared in `Cargo.toml` and enforced by the `msrv` CI job. Edition 2024 alone would only need 1.85; the - floor comes from `ratatui → instability → darling`. + floor comes from `egui`/`eframe`. - **Administrator rights** to exercise the repair paths by hand. The test suite itself does not need them. diff --git a/README.md b/README.md index 5dc0b02..ce1200c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# 🩺 WinMedic – Windows Self-Healing & Diagnostic TUI +# 🩺 WinMedic – Windows Self-Healing & Diagnostic GUI **A high-performance, modular Windows diagnostic and auto-repair utility written in 100% Rust.** @@ -8,9 +8,9 @@ [![CI](https://img.shields.io/github/actions/workflow/status/SecretLUL/WinMedic/ci.yml?branch=main&style=for-the-badge&logo=githubactions&logoColor=white&label=CI)](https://github.com/SecretLUL/WinMedic/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge)](LICENSE) [![Platform](https://img.shields.io/badge/Platform-Windows%2010%20%2F%2011%20(x64)-0078D6.svg?style=for-the-badge&logo=windows)](https://www.microsoft.com/windows) -[![Ratatui](https://img.shields.io/badge/TUI-Ratatui%200.29-00D2FF.svg?style=for-the-badge)](https://ratatui.rs/) +[![egui](https://img.shields.io/badge/GUI-egui%200.36-00D2FF.svg?style=for-the-badge)](https://www.egui.rs/) [![Release](https://img.shields.io/github/v/release/SecretLUL/WinMedic?style=for-the-badge&label=Version&color=10B981)](https://github.com/SecretLUL/WinMedic/releases/latest) -[![MSRV](https://img.shields.io/badge/MSRV-1.88-B7410E.svg?style=for-the-badge&logo=rust)](https://www.rust-lang.org/) +[![MSRV](https://img.shields.io/badge/MSRV-1.95-B7410E.svg?style=for-the-badge&logo=rust)](https://www.rust-lang.org/)
@@ -22,7 +22,7 @@ ## 🌟 Overview -**WinMedic** is a state-of-the-art terminal application (TUI) designed to autonomously diagnose, categorize, and safely repair Windows operating system errors, performance bottlenecks, update stalls, and broken configurations. +**WinMedic** is a state-of-the-art native desktop application designed to autonomously diagnose, categorize, and safely repair Windows operating system errors, performance bottlenecks, update stalls, and broken configurations. Unlike opaque one-click cleanup tools, **WinMedic** is built on five fundamental principles: 1. **Zero Runtime Dependencies**: Single, compact, portable native `.exe` binary without .NET, Python, or external runtime requirements. @@ -57,7 +57,7 @@ Before WinMedic touches your system: 1. **Windows System Restore Point (VSS)**: A checkpoint named `"WinMedic Auto-Restore Point (Vor Reparatur)"` is automatically triggered via WMI / PowerShell. WinMedic then **verifies** that a new restore point actually appeared instead of trusting the exit status — Windows silently declines to create one if another was made within the last 24 hours (`SystemRestorePointCreationFrequency`), and reports that refusal as a warning rather than an error. A throttled run is surfaced as a warning, never as success. 2. **Registry Snapshotting**: Every modified registry key is exported into `%APPDATA%\WinMedic\backups\reg_.reg` prior to modification. If the export fails, the fix is aborted instead of applied. The backup index is written atomically, and an index that cannot be parsed is moved aside as `index.json.corrupt-` rather than overwritten, so previously recorded backups are never lost. 3. **One-Key Rollback**: Any stored snapshot can be restored directly from the **`[5]` Settings & Safety** tab — `[B]` moves the arrow keys onto the snapshot list, `[U]` restores the highlighted one after an explicit confirmation prompt. -4. **Dry-Run First**: `[D]` in the TUI or `--dry-run` on the CLI lists every command a repair would execute, without executing any of it. +4. **Dry-Run First**: the simulation switch in the window or `--dry-run` on the CLI lists every command a repair would execute, without executing any of it. 5. **High-Performance Audit Logging**: Every scan, fix, simulation, rollback, and cancellation is appended in $O(1)$ to `%APPDATA%\WinMedic\logs\history.jsonl` (with automatic 5 MB log rotation) and formatted human-readable `%APPDATA%\WinMedic\logs\audit.log`. 6. **Self-Contained Report Export**: Complete diagnostic findings can be exported at any time with `[E]` or `--output ` as responsive, standalone HTML, Markdown, or JSON reports. @@ -111,7 +111,7 @@ If you installed WinMedic through WinGet, prefer `winget upgrade SecretLUL.WinMe | Shortcut | Action | | :--- | :--- | | **`[1]` - `[5]`** | Switch tabs (Dashboard, Health Scan, Issue Triage, Repair Center, Settings & Safety) | -| **`[Tab]` / `[Shift+Tab]`** | Cycle forward / backward through tabs | +| **`[Ctrl+Tab]` / `[Ctrl+Shift+Tab]`** | Cycle forward / backward through tabs (plain `[Tab]` moves focus between controls) | | **`[S]`** | Start full system health scan | | **`[R]`** | Re-run scan / refresh current view | | **`[Space]`** | Toggle checkbox selection for highlighted issue (toggles a switch in Settings) | @@ -126,11 +126,9 @@ If you installed WinMedic through WinGet, prefer `winget upgrade SecretLUL.WinMe | **`[E]`** | Export diagnostic & repair report as self-contained HTML | | **`[B]`** | Settings & Safety tab: move `[↑]`/`[↓]` between the settings list and the registry snapshot list | | **`[U]`** | Settings & Safety tab: restore the selected registry snapshot — elsewhere: open the pending "update available" notice, which can download, verify and install the new version | -| **`[PgUp]` / `[PgDn]`** | Scroll live log console (Scan and Repair tabs) | -| **`[Home]` / `[End]`** | Jump to earliest log line / return to live tail follow mode | | **`[←]` / `[→]` or `[h]` / `[l]`** | Switch tabs (BIOS-style, wraps around) | | **`[+]` / `[-]` or `[[` / `]]`** | Adjust the highlighted numeric setting (Settings & Safety tab) | -| **`[↑]` / `[↓]` or `[j]` / `[k]`** | Navigate list items and scroll logs | +| **`[↑]` / `[↓]` or `[j]` / `[k]`** | Navigate list items (the live log consoles scroll with the mouse wheel and their own scrollbars) | | **`[?]`** | Open interactive Help Modal overlay | | **`[Esc]`** | Clear filters / abort a running operation / close modal / return to Dashboard | | **`[Q]`** | Exit WinMedic safely | @@ -139,7 +137,7 @@ If you installed WinMedic through WinGet, prefer `winget upgrade SecretLUL.WinMe ## 🚀 CLI Headless Automation Mode -WinMedic can also run without the TUI for automated scripts, CI/CD, or batch IT deployments: +WinMedic can also run without opening its window, for automated scripts, CI/CD, or batch IT deployments. Every flag below keeps the console it was started from, so exit codes, pipes and redirects behave exactly as a script expects: ```bash # Run headless system scan and output styled summary @@ -232,7 +230,8 @@ The checksum is generated by the release workflow from the exact binary it publi ### Prerequisites * **Windows 10 / 11** (64-bit) -* **Rust 1.88+** (`cargo` and `rustc`) — the MSRV is declared as `rust-version` in `Cargo.toml` and enforced by CI +* **Rust 1.95+** (`cargo` and `rustc`) — the MSRV is declared as `rust-version` in `Cargo.toml` and enforced by CI +* **MSVC build tools** — the Windows SDK supplies the `rc.exe` that `build.rs` uses to embed the icon and version resources ### Build Steps From 2029bf4733476774326a4ecb2ccc5dfbbc346444 Mon Sep 17 00:00:00 2001 From: SecretLUL <18047775+SecretLUL@users.noreply.github.com> Date: Sat, 5 Sep 2026 19:59:40 +0200 Subject: [PATCH 18/19] ci: retire the ratatui advisory note the audit job no longer needs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The comment above `cargo audit` enumerated three informational warnings — RUSTSEC-2024-0436 `paste`, RUSTSEC-2026-0002 and RUSTSEC-2026-0253 `lru` — as things arriving through ratatui that could not be resolved here. All three left with ratatui, and `cargo audit` now reports nothing at all against the lock file. The policy the comment defends is unchanged and still worth stating, so only the list is replaced: a gate that goes red for reasons nobody can act on is a gate people learn to ignore. Co-Authored-By: Claude Opus 5 --- .github/workflows/ci.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c604559..bc03d85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -100,11 +100,14 @@ jobs: - uses: taiki-e/install-action@cargo-audit # Plain `cargo audit` fails on a vulnerability and passes on an - # informational warning, which is the policy we want: the three warnings - # open today (RUSTSEC-2024-0436 paste, RUSTSEC-2026-0002 and - # RUSTSEC-2026-0253 lru) all arrive through ratatui and cannot be - # resolved here. A gate that is red for reasons nobody can act on is a - # gate people learn to ignore. Warnings still show up in the job log. + # informational warning, which is the policy we want: a gate that goes red + # for reasons nobody can act on is a gate people learn to ignore, and the + # warnings still show up in the job log either way. + # + # The three this comment used to enumerate (RUSTSEC-2024-0436 `paste`, + # RUSTSEC-2026-0002 and RUSTSEC-2026-0253 `lru`) all arrived through + # ratatui and left with it when the terminal front end was replaced by + # egui. The tree audits clean as of that change. - name: Audit Dependencies run: cargo audit From 5b5d0fbe22d47c89b9229fdec81f564838826b1d Mon Sep 17 00:00:00 2001 From: SecretLUL <18047775+SecretLUL@users.noreply.github.com> Date: Sat, 5 Sep 2026 19:59:40 +0200 Subject: [PATCH 19/19] docs(assets): correct the two TUI labels baked into the hero banner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The banner is the one place the old front end survived as pixels: the tagline read "ADVANCED WINDOWS DIAGNOSTICS & REPAIR TUI" and the fourth feature box read "Blazing Fast Rust TUI". The previous commit noted both as uncovered. Only the leading letter differs between TUI and GUI, and the banner already contains a capital G in DIAGNOSTICS — same line, same face, same weight, same drop shadow — so the replacement is lifted from the image rather than typeset into it, which is what keeps it from reading as a patch. The feature box sets its text at 0.84 the size and sits on a card with a vertical gradient, so that copy is scaled and composited as a difference against the flat background it came from, which carries the ink and the shadow onto a differently coloured surface. Re-encoded at quality 100: at 95 the file dropped from 520 KB to 195 KB, which for a picture that is mostly soft glow around a shield is a lot of gradient to throw away for two letters. At 100 it lands on 523 KB, so the rest of the artwork is preserved. Co-Authored-By: Claude Opus 5 --- assets/banner.jpg | Bin 532615 -> 535244 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/banner.jpg b/assets/banner.jpg index 663c6ef9a2b45f8698a20945c526ec95089da1fd..d7e66c9d0843726f1148e93232ece7daa47e5296 100644 GIT binary patch literal 535244 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�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⁡vQdz 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

PbAF3MSwym;OxH8SC+4<(-Cy%7&6$rD{ckw{(= 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

LQ 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 literal 532615 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≪$uMi7ZZ!AuU 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%0AAy!zk*s{sV!J59 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

@LqE{lzabdz*H!mx^mEY$ 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�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 _$St=wVf`0^DSSyr&U|}%j@hMnjbQdK5z^is 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