/** * Spaxel Dashboard - Security Mode Panel * * Security mode controls, status display, learning progress, * and anomaly timeline UI. */ (function() { 'use strict'; // ── module state ────────────────────────────────────────────────────────── let _securityMode = 'disarmed'; // 'disarmed', 'learning', 'armed', 'alert' let _armedAt = null; let _learningUntil = null; let _learningProgress = 0; // 0.0 - 1.0 let _anomalyCount24h = 0; let _lastAnomaly = null; let _modelReady = false; // API endpoints const API = { status: '/api/security/status', arm: '/api/security/arm', disarm: '/api/security/disarm', anomalies: '/api/anomalies', activeAnomalies: '/api/anomalies/active', anomalyHistory: '/api/anomalies/history', learning: '/api/anomalies/learning' }; // DOM elements (lazy-initialized) let _statusIndicator = null; let _alertBanner = null; // Callbacks let _onModeChange = null; // ── initialization ──────────────────────────────────────────────────────── function init() { // Create security status indicator in status bar ensureStatusIndicator(); // Start polling for security status startPolling(); // Listen for WebSocket messages if (window.SpaxelApp) { SpaxelApp.registerMessageHandler(handleWebSocketMessage); } // Subscribe to state changes if (window.SpaxelState) { SpaxelState.subscribe('system.security_mode', handleSecurityModeChange); SpaxelState.subscribe('alerts', handleAlertsChange); } console.log('[SecurityPanel] Module initialized'); } function ensureStatusIndicator() { // Check if indicator already exists _statusIndicator = document.getElementById('security-status-indicator'); if (_statusIndicator) return; // Find the security status container const container = document.getElementById('security-status-container'); if (!container) return; const indicator = document.createElement('div'); indicator.id = 'security-status-indicator'; indicator.className = 'security-status-indicator mode-disarmed'; indicator.innerHTML = `
${isArmed ? 'Disarming security mode will disable automatic intrusion detection.' : 'Arming security mode will enable automatic intrusion detection. Any motion detected will trigger an alert.' }
${!_modelReady ? `⚠️ Warning: The system is still learning normal patterns.
Accuracy will improve over the next ${Math.ceil((1 - _learningProgress) * 7)} days.