diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 84d1304..dbcc873 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -834,6 +834,42 @@ pub async fn map_speaker_to_participant( Ok(()) } +// ---- App metadata (About page) ---- + +/// Version + build commit for the About page. Version comes from Cargo; the +/// short commit hash is baked in at build time by `build.rs` (`WA_GIT_HASH`). +#[tauri::command] +pub async fn app_info() -> WaResult { + Ok(serde_json::json!({ + "version": env!("CARGO_PKG_VERSION"), + "commit": env!("WA_GIT_HASH"), + })) +} + +/// Opens an http(s) URL in the user's default browser (About page source link). +/// Windows-only (WA is Windows-native, ADR-0001). The scheme is validated so +/// this can't be coerced into launching a local path or program, and `explorer` +/// receives the URL as a single argv (no shell), so there's no injection surface. +#[tauri::command] +pub async fn open_url(url: String) -> WaResult<()> { + if !(url.starts_with("https://") || url.starts_with("http://")) { + return Err(WaError::new("app", "only http(s) URLs may be opened")); + } + #[cfg(windows)] + { + std::process::Command::new("explorer") + .arg(&url) + .spawn() + .map_err(|e| WaError::new("app", e.to_string()))?; + Ok(()) + } + #[cfg(not(windows))] + { + let _ = url; + Err(WaError::new("app", "unsupported platform")) + } +} + // ---- Hardware + models (Phase 3) ---- #[tauri::command]