OmniMon v6.7.0: Zombie Killer & AI Safety Hardening
Version 6.7.0 introduces the Zombie Killer, a background engine that detects processes burning CPU or RAM for long stretches and offers them for user-confirmed termination, plus a second round of AI safety hardening (privacy mode, daily budget, frontend-confirmed automation tool calls, keyring delete-first) and a DPI transparency badge.
Zombie Killer
- Sustained-usage detection. A new engine watches processes whose CPU or RAM stays above a threshold for a configurable window (defaults: 50% CPU sustained 1h, uptime over 7 days) and surfaces them as candidates.
- PID-reuse safe. Every candidate is keyed by
(pid, start_time), so a recycled PID never gets mistaken for a still-running zombie. - Panic-safe tick. The per-tick body runs under
catch_unwind; a single bad process can never crash the background thread. - Modal with keyboard shortcut.
Cmd/Ctrl+Shift+ZopensZombieKiller.svelte, which lists candidates, lets you kill one or all, tune thresholds, and maintain anever_killblocklist, all in EN and ES.
AI Privacy Mode
When enabled (Settings.ai_privacy_mode, default false), everything sent to the LLM goes through stable pseudonymous redaction:
- Process names, paths, URLs, tab titles, hostnames. Replaced by 24-bit SipHash tokens so the model can still reason about identity across calls without ever seeing the raw strings.
- Private IPs collapse to
<lan>. RFC 1918, loopback, link-local,fc00::/7,fe80::/10, all flattened to a single bucket. - Visible controls. The toggle, a live usage counter, and the new budget input all live in a "AI Privacy & Budget" section inside Profile Settings.
Daily AI Budget
- Per-UTC-day cap.
Settings.ai_daily_limit(default200,0= unlimited) complements the existing burst token bucket: burst caps rate, daily caps spend. - Shared across providers. The bucket spans
ai_chat,analyze_processes,analyze_context, andvalidate_api_key. - Observability. New IPC
get_ai_daily_usagereturns(used, limit); the UI shows the counter with a refresh button.
Safer AI Tool Calls
- Automation rules now require confirmation.
add_automation_ruleandremove_automation_ruleno longer execute server-side insideai_chat; they return a plan andAIChat.svelteinvokes the real IPC only after the user confirms, same pattern askill_process,kill_by_name,close_tabs, andclose_connection. - Keyring delete-first.
get_api_key_with_fallbackwipes the legacy plaintext store before writing to the secure keyring. A crash mid-flight can no longer leave the API key readable on disk. - CSP allows local Ollama.
tauri.conf.jsonnow permitshttp://localhost:11434andhttp://127.0.0.1:11434without loosening the rest of the policy.
DPI Transparency Badge
A new status indicator in the StatusBar (Radar icon from lucide, aria-live="polite") appears whenever DPI telemetry is active. The tooltip makes clear OmniMon reads packet metadata only (never payload) and points to the setting that disables DPI.
Breaking: network_alerts::EvaluatorState
The alert evaluator used to hold its debounce counters and cooldown map in a process-global OnceLock<RwLock<EvaluatorState>>, which caused flaky tests when parallel threads contaminated each other's consecutive_matches map. The fix removes the global and plumbs &mut EvaluatorState through every call site:
// Before
let alerts = evaluate_network_alerts(&snap, prev, &rules, &history);
// After
let mut state = network_alerts::EvaluatorState::new();
let alerts = evaluate_network_alerts(&snap, prev, &rules, &history, &mut state);
// keep `state` alive for subsequent ticks to preserve debounce + cooldown. In-workspace callers were updated; out-of-tree consumers must instantiate their own state or wrap both functions.
Quality
- 458 Rust tests (288 core + 95 integration + 53 tauri + 18 + 4 tui) and 689 frontend tests with Vitest.
- Branch coverage 70.37-70.80% (stable range), statements / functions / lines at 86%.
- Clippy clean under Rust 1.95: ten pre-existing call sites fixed to satisfy the new
unnecessary_sort_byandcollapsible_matchlints.
Download
Always verify downloads against SHA256SUMS.txt published in the GitHub release.
Homebrew
brew tap chochy2001/omnimon
brew install --cask omnimon