Phase 5: Guardian Mode — continuous awareness + proactive AI alerts

- reactor.py: v5.0.0; guardian_loop() background task scans all agents every
  120s; checks CPU/mem/disk thresholds + agent offline transitions + failed
  services; 10min cooldown per metric to debounce repeat alerts; AI analysis
  of critical findings via Claude; proactive chat injection into conversations
  table; handle_sitrep() generates Iron Man-style full/brief situation reports;
  handle_guardian_config() reads/writes guardian_config table; FastAPI endpoints:
  /guardian/status, /guardian/events, /guardian/events/{id}/ack, /guardian/chat
- arc.php: guardian_status, guardian_events, guardian_ack, guardian_chat actions
- chat.php: Tier 0.9d detects sitrep/situation report/how are things commands
- index.html: GUARDIAN tab in right panel; guardian event list with severity
  badges + AI analysis; ACK / ACK ALL buttons; Guardian badge in bottom bar
  (green/amber/red pulse based on unread critical events); proactive chat
  polling every 30s surfacing guardian-injected messages as JARVIS speech
- admin/index.php: GUARDIAN MODE tab; status bar + events table + config modal;
  inline SITREP runner with result modal; threshold configuration
This commit is contained in:
2026-06-11 04:52:08 +00:00
parent 56c9e2d914
commit f15225994a
4 changed files with 501 additions and 1 deletions
+34
View File
@@ -179,6 +179,40 @@ switch ($action) {
echo json_encode(arc_request('DELETE', "/screenshots/{$id}"));
break;
// ── GUARDIAN MODE ─────────────────────────────────────────────────────────
case 'guardian_status':
echo json_encode(arc_request('GET', '/guardian/status'));
break;
case 'guardian_events':
$limit = (int)($_GET['limit'] ?? 30);
$unread = !empty($_GET['unread']) ? 'true' : '';
$severity = $_GET['severity'] ?? '';
$since = $_GET['since'] ?? '';
$qs = http_build_query(array_filter([
'limit' => $limit,
'unread' => $unread,
'severity' => $severity,
'since' => $since,
]));
echo json_encode(arc_request('GET', '/guardian/events' . ($qs ? "?{$qs}" : '')));
break;
case 'guardian_ack':
$id = (int)($_GET['id'] ?? $data['id'] ?? 0);
if ($id) {
echo json_encode(arc_request('POST', "/guardian/events/{$id}/ack"));
} else {
echo json_encode(arc_request('POST', '/guardian/events/ack_all'));
}
break;
case 'guardian_chat':
$since = $_GET['since'] ?? '';
$qs = $since ? '?since=' . urlencode($since) : '';
echo json_encode(arc_request('GET', '/guardian/chat' . $qs));
break;
default:
http_response_code(404);
echo json_encode(['error' => "Unknown arc action: {$action}"]);