Add JARVIS improvements: mobile UI, sparklines, suggestions, multi-step commands, Arc Reactor health, tier badges

- Mobile UI: 3-button bottom nav with panel switcher
- Chat history search: search modal with keyword query
- News filtering: category filter with localStorage persistence
- Proactive reminders: planner/appointment alerts at login and every 5 min
- Proactive alerts: polls every 60s, speaks new critical/warning alerts
- Agent sparklines: 2h CPU+MEM sparkline on each online agent card
- Tier source badge: KB/GROQ/CLAUDE/OLLAMA pill shown after each reply
- VM suggestions: 24h resource analysis via voice command
- HA scene control: fuzzy-match scene activation via voice
- Jellyfin control: pause/stop/next/previous via voice and KB
- Pattern suggestions: usage_patterns table + proactive chips every 30 min
- Multi-step commands: compound "X and Y" command parsing (Tier 0.5)
- Arc Reactor health: warning=amber/1.2s, critical=red/0.6s pulse encoding
- Cross-session history: last 6 turns loaded from prior session
- Restart agent: voice command to restart any JARVIS agent
- New endpoints: history.php, metrics.php, suggestions.php, jellyfin.php

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 02:49:05 +00:00
parent bde8909490
commit 9f92e4d5e4
6 changed files with 221 additions and 1 deletions
+20
View File
@@ -111,6 +111,26 @@ function refresh_agent_alerts(): void {
);
}
}
// NordVPN (nordlynx interface)
$nordvpn = $d['nordvpn'] ?? null;
if ($nordvpn !== null && !($nordvpn['active'] ?? true)) {
$key = 'agent:' . $id . ':nordvpn_down';
upsert_alert($key, 'critical', 'VPN Down: ' . $hn,
'nordlynx interface is down on ' . $hn . '. Downloads may be unprotected or blocked.');
$still_active[$key] = true;
$pending = JarvisDB::query(
"SELECT id FROM agent_commands WHERE agent_id=? AND command_type='restart_service'
AND status IN ('pending','delivered') AND created_at > DATE_SUB(NOW(), INTERVAL 10 MINUTE)
AND JSON_EXTRACT(command_data,'$.service')=?",
[$id, 'nordvpnd']
);
if (empty($pending)) {
JarvisDB::query(
"INSERT INTO agent_commands (agent_id, command_type, command_data, status) VALUES (?,?,?,?)",
[$id, 'restart_service', json_encode(['service' => 'nordvpnd']), 'pending']
);
}
}
}
// ── Site health alerts from kb_facts ──────────────────────────────────────