OmniMon v6.7.0: Zombie Killer y Endurecimiento de IA

Nuevo release

La version 6.7.0 estrena el Zombie Killer, un motor en segundo plano que detecta procesos consumiendo CPU o RAM de forma sostenida y los ofrece para terminar con confirmacion del usuario, mas una segunda ronda de endurecimiento de la superficie de IA (modo de privacidad, presupuesto diario, confirmacion frontend de herramientas destructivas, borrado previo del keyring legacy) y un badge de transparencia DPI.

Zombie Killer

  • Deteccion de uso sostenido. Un nuevo motor vigila procesos cuyo CPU o RAM se mantiene por encima de un umbral durante una ventana configurable (defaults: 50% de CPU sostenido 1h, uptime mayor a 7 dias) y los ofrece como candidatos.
  • A salvo de reuso de PID. Cada candidato se identifica por (pid, start_time), asi que un PID reciclado nunca se confunde con un zombie todavia vivo.
  • Tick a prueba de panic. El cuerpo del tick corre bajo catch_unwind; un proceso problematico no puede tumbar el hilo de fondo.
  • Modal con atajo de teclado. Cmd/Ctrl+Shift+Z abre ZombieKiller.svelte, que lista candidatos, permite matar uno o todos, ajustar los umbrales y mantener una blocklist never_kill, todo con i18n EN y ES.

Modo de Privacidad de IA

Cuando se activa (Settings.ai_privacy_mode, default false), todo lo que se envia al LLM pasa por redaccion seudonima estable:

  • Nombres de proceso, paths, URLs, titulos de pestana, hostnames. Se reemplazan por tokens SipHash de 24 bits para que el modelo pueda seguir razonando sobre identidad entre llamadas sin ver los strings reales.
  • IPs privadas colapsan a <lan>. RFC 1918, loopback, link-local, fc00::/7, fe80::/10, todas se aplanan a un solo bucket.
  • Controles visibles. El toggle, un contador de uso vivo y el input del presupuesto diario viven en la nueva seccion "AI Privacy & Budget" de Profile Settings.

Presupuesto Diario de IA

  • Tope por dia UTC. Settings.ai_daily_limit (default 200, 0 = ilimitado) complementa el token bucket existente: el burst limita la tasa, el diario limita el gasto.
  • Compartido entre proveedores. La cubeta cubre ai_chat, analyze_processes, analyze_context y validate_api_key.
  • Observabilidad. Nuevo IPC get_ai_daily_usage que devuelve (usado, limite); la UI muestra el contador con un boton de refresh.

Llamadas de IA Mas Seguras

  • Las reglas de automatizacion requieren confirmacion. add_automation_rule y remove_automation_rule ya no se ejecutan server-side dentro de ai_chat; devuelven un plan y AIChat.svelte invoca el IPC real solo tras confirmacion explicita, mismo patron que kill_process, kill_by_name, close_tabs y close_connection.
  • Keyring con borrado previo. get_api_key_with_fallback borra el almacen legacy en texto plano antes de escribir al keyring seguro. Una interrupcion a mitad del flujo ya no puede dejar la API key legible en disco.
  • CSP con Ollama local. tauri.conf.json permite http://localhost:11434 y http://127.0.0.1:11434 sin relajar el resto de la politica.

Badge DPI de Transparencia

Nuevo indicador en el StatusBar (icono Radar de lucide, aria-live="polite") que aparece siempre que la telemetria DPI esta activa. El tooltip deja claro que OmniMon lee metadatos de paquete unicamente (nunca payload) y apunta al ajuste que desactiva DPI.

Breaking: network_alerts::EvaluatorState

El evaluador de alertas tenia sus contadores de debounce y el mapa de cooldown en un singleton de proceso OnceLock<RwLock<EvaluatorState>>, lo que causaba tests flaky cuando hilos paralelos se contaminaban el mapa consecutive_matches. El arreglo elimina el global y plumea &mut EvaluatorState a traves de cada call site:

// Antes
let alerts = evaluate_network_alerts(&snap, prev, &rules, &history);

// Ahora
let mut state = network_alerts::EvaluatorState::new();
let alerts = evaluate_network_alerts(&snap, prev, &rules, &history, &mut state);
// conservar `state` vivo entre ticks para preservar debounce + cooldown.

Los call sites internos del workspace ya estan actualizados; los consumidores fuera del arbol deben instanciar su propio estado o envolver ambas funciones.

Calidad

  • 458 tests Rust (288 core + 95 integration + 53 tauri + 18 + 4 tui) y 689 tests frontend con Vitest.
  • Branch coverage 70.37-70.80% (rango estable), statements / functions / lines al 86%.
  • Clippy limpio bajo Rust 1.95: diez call sites preexistentes arreglados para los nuevos lints unnecessary_sort_by y collapsible_match.

Descarga

Siempre verifica las descargas contra el SHA256SUMS.txt publicado en el release de GitHub.

Homebrew

brew tap chochy2001/omnimon
brew install --cask omnimon
← Todos los posts