feat(kon): add first-run hardware probe and model recommendation wizard
- New probe_system command: returns RAM, CPU, OS info - New rank_models command: scores models against detected hardware - FirstRunPage.svelte: hardware summary, ranked model list with "Recommended" badge on top pick, download progress bar, skip option - First-run detection in layout: checks list_models + list_parakeet_models, shows wizard if both empty - Sidebar hidden during first-run for clean wizard experience - clippy clean Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
69
src-tauri/src/commands/hardware.rs
Normal file
69
src-tauri/src/commands/hardware.rs
Normal file
@@ -0,0 +1,69 @@
|
||||
use serde::Serialize;
|
||||
|
||||
use kon_core::hardware::{self, Os};
|
||||
use kon_core::recommendation;
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct SystemInfo {
|
||||
pub ram_mb: u64,
|
||||
pub cpu_brand: String,
|
||||
pub cpu_cores: usize,
|
||||
pub os: String,
|
||||
pub gpu: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct ModelRecommendation {
|
||||
pub id: String,
|
||||
pub display_name: &'static str,
|
||||
pub disk_size_mb: u64,
|
||||
pub ram_required_mb: u64,
|
||||
pub description: &'static str,
|
||||
pub score: f64,
|
||||
pub reason: String,
|
||||
pub is_downloaded: bool,
|
||||
}
|
||||
|
||||
/// Probe system hardware and return a summary.
|
||||
#[tauri::command]
|
||||
pub fn probe_system() -> Result<SystemInfo, String> {
|
||||
let profile = hardware::probe_system();
|
||||
Ok(SystemInfo {
|
||||
ram_mb: profile.ram.0,
|
||||
cpu_brand: profile.cpu.brand,
|
||||
cpu_cores: profile.cpu.core_count,
|
||||
os: match profile.os {
|
||||
Os::Windows => "Windows",
|
||||
Os::Linux => "Linux",
|
||||
Os::MacOs => "macOS",
|
||||
Os::Ios => "iOS",
|
||||
Os::Android => "Android",
|
||||
}
|
||||
.to_string(),
|
||||
gpu: profile.gpu.map(|g| format!("{:?}", g.vendor)),
|
||||
})
|
||||
}
|
||||
|
||||
/// Rank models for the current system and return recommendations.
|
||||
#[tauri::command]
|
||||
pub fn rank_models() -> Result<Vec<ModelRecommendation>, String> {
|
||||
let profile = hardware::probe_system();
|
||||
let ranked = recommendation::rank_recommendations(&profile);
|
||||
|
||||
Ok(ranked
|
||||
.into_iter()
|
||||
.map(|scored| {
|
||||
let downloaded = kon_transcription::is_downloaded(&scored.entry.id);
|
||||
ModelRecommendation {
|
||||
id: scored.entry.id.as_str().to_string(),
|
||||
display_name: scored.entry.display_name,
|
||||
disk_size_mb: scored.entry.disk_size.0,
|
||||
ram_required_mb: scored.entry.ram_required.0,
|
||||
description: scored.entry.description,
|
||||
score: scored.score,
|
||||
reason: scored.reason,
|
||||
is_downloaded: downloaded,
|
||||
}
|
||||
})
|
||||
.collect())
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
pub mod audio;
|
||||
pub mod clipboard;
|
||||
pub mod hardware;
|
||||
pub mod llm;
|
||||
pub mod models;
|
||||
pub mod transcription;
|
||||
|
||||
@@ -70,6 +70,9 @@ pub fn run() {
|
||||
commands::windows::open_viewer_window,
|
||||
// Clipboard
|
||||
commands::clipboard::copy_to_clipboard,
|
||||
// Hardware
|
||||
commands::hardware::probe_system,
|
||||
commands::hardware::rank_models,
|
||||
// LLM stubs
|
||||
commands::llm::download_llm_model,
|
||||
commands::llm::check_llm_model,
|
||||
|
||||
Reference in New Issue
Block a user