/**
* Application Constants
* Centralized configuration values
*/
// Analysis interval - how often to capture and analyze frames
export const ANALYSIS_INTERVAL_MS = 4000; // 4 seconds
// Gemini system instruction for threat detection
export const SYSTEM_INSTRUCTION = `
You are AegisAI, an elite autonomous security agent.
Your mission is to analyze visual feeds for security threats, human behavior patterns, and safety anomalies.
Analyze the image provided and return a STRICT JSON object.
Do not use Markdown formatting. Return ONLY the raw JSON.
Structure:
{
"incident": boolean, // true if a threat or suspicious activity is detected
"type": "theft" | "intrusion" | "violence" | "stalking" | "loitering" | "vandalism" | "suspicious_behavior" | "normal",
"severity": "low" | "medium" | "high" | "critical",
"confidence": number, // 0-100
"reasoning": "Brief, tactical explanation of why this conclusion was reached based on body language, objects, or context.",
"subjects": ["List of people/objects identified in the scene"],
"recommended_actions": ["action1", "action2", "action3"]
}
Detection Rules:
- Normal behavior (working, sitting, walking) -> incident: false
- Weapons visible, aggressive posture, sneaking, masking faces -> incident: true
- "Gun" hand gestures or simulated threats -> incident: true (Treat as drill/threat)
- Loitering >5min without authorization -> incident: true
- Property damage, theft behaviors -> incident: true
- Unauthorized access to restricted areas -> incident: true
Thresholds:
- Normal activity (walking, working, sitting) -> incident: false
- Suspicious loitering, nervous behavior -> incident: true, severity: low-medium
- Weapons, aggressive actions, violence -> incident: true, severity: high-critical
Be analytical and precise. Focus on behavioral cues and context.
`;
// Mock events for testing (optional)
export const MOCK_EVENTS = [
{
id: 'mock-1',
timestamp: Date.now() - 100000,
incident: true,
type: 'loitering',
severity: 'low',
confidence: 85,
reasoning: 'Individual standing in restricted area for >5 minutes without badge.',
subjects: ['Person in dark clothing'],
recommended_actions: ['Log event', 'Monitor for 5 more minutes', 'Send alert if continues']
}
];
// API Configuration
export const API_CONFIG = {
BASE_URL: (import.meta as any).env?.VITE_API_URL || 'http://localhost:8000',
TIMEOUT: 30000, // 30 seconds
RETRY_ATTEMPTS: 3
};
// Gemini Configuration
export const GEMINI_CONFIG = {
MODEL: 'gemini-2.0-flash-exp', // Latest available model
TEMPERATURE: 0.4,
MAX_OUTPUT_TOKENS: 300,
RESPONSE_MIME_TYPE: 'application/json'
};
// Video Configuration
export const VIDEO_CONFIG = {
WIDTH: { ideal: 1280 },
HEIGHT: { ideal: 720 },
FACING_MODE: 'user',
FRAME_RATE: 30
};
// Severity Colors (Tailwind classes)
export const SEVERITY_COLORS = {
low: 'text-blue-400',
medium: 'text-orange-400',
high: 'text-red-500',
critical: 'text-red-600'
} as const;
export const SEVERITY_BG_COLORS = {
low: 'bg-blue-500/20 border-blue-500',
medium: 'bg-orange-500/20 border-orange-500',
high: 'bg-red-500/20 border-red-500',
critical: 'bg-red-600/20 border-red-600'
} as const;
// Chart Configuration
export const CHART_CONFIG = {
MAX_POINTS: 10, // Show last 10 data points
COLORS: {
primary: '#38bdf8',
grid: '#334155',
axis: '#94a3b8'
}
};
// Local Storage Keys
export const STORAGE_KEYS = {
EVENTS: 'aegisai_events',
STATS: 'aegisai_stats',
SETTINGS: 'aegisai_settings'
} as const;
// Feature Flags
export const FEATURES = {
ENABLE_PERSISTENCE: true, // Save events to localStorage
ENABLE_NOTIFICATIONS: true, // Browser notifications
ENABLE_SOUND_ALERTS: true, // Audio alerts
ENABLE_BACKEND_API: true // Use backend API vs client-side (toggle this!)
} as const;