@vite(['resources/css/app.css', 'resources/js/app.js'])
@if(session('success'))
{{ session('success') }}
@endif

βš™οΈ Global Admin Proctoring & System Settings

Master control panel for candidate assessment rules, system screen capturing, and module toggles
πŸ›‘οΈ ADMIN CONTROL PANEL
@csrf
πŸ“Έ Candidate System Screenshot Capture
Captures candidate system desktop screen automatically on call start & tab switches. Admin can stop taking screenshots anytime across all candidates.
{{ \App\Models\Setting::get('enable_candidate_screenshots', '1') === '1' ? '🟒 ENABLED (Active)' : 'πŸ”΄ STOPPED / DISABLED' }} @if(Auth::user() && Auth::user()->isAdmin()) @endif
@csrf
πŸš€ Candidate Provisioning & Onboarding Module
Master toggle to enable/disable automated candidate provisioning, onboarding checklists, and 1-click revocation.
{{ \App\Models\Setting::get('onboarding_enabled', '1') === '1' ? '🟒 ENABLED' : 'πŸ”΄ DISABLED' }} @if(Auth::user() && Auth::user()->isAdmin()) @endif

Live Interview Assessments

Temporary Candidate Access, Real-Time Proctored IDE, and Unique Code Records
@forelse($interviews as $inv) @php $logs = $inv->proctor_logs ?? []; $tabSwitches = count(array_filter($logs, fn($l) => ($l['type'] ?? '') === 'tab_switch')); $focusLost = count(array_filter($logs, fn($l) => ($l['type'] ?? '') === 'focus_lost')); $gazeAlerts = count(array_filter($logs, fn($l) => in_array($l['type'] ?? '', ['gaze_anomaly', 'gaze_fixed_staring']))); $lowerGaze = count(array_filter($logs, fn($l) => ($l['type'] ?? '') === 'gaze_lower_device')); $questionRepeat = count(array_filter($logs, fn($l) => in_array($l['type'] ?? '', ['question_repeat_lower', 'question_repetition']))); $externalAi = count(array_filter($logs, fn($l) => ($l['type'] ?? '') === 'external_ai_detected')); @endphp @empty @endforelse
Candidate & Temp Pass Unique Submission ID Status & Validity Language Proctoring Alerts Review & Actions
{{ $inv->candidate_name }}
{{ $inv->candidate_email }} • {{ $inv->candidate_phone }}
πŸ”‘ Temp Pass: {{ $inv->temp_password }}
{{ $inv->submission_unique_id }} @if($inv->isExpired()) EXPIRED @elseif($inv->status === 'completed') COMPLETED @elseif($inv->call_status === 'active') 🟒 πŸ“ž CALL IN PROGRESS @elseif($inv->isActiveTimeline()) ⚑ TIMELINE LIVE @else SCHEDULED @endif
Timeline: {{ ($inv->scheduled_at ?? $inv->created_at)->format('M d, H:i') }} – {{ $inv->expires_at->format('H:i') }}
{{ $inv->language }}
πŸ”΄ Tab Switches: {{ $tabSwitches }} 🟑 Focus Loss / Overlay: {{ $focusLost }} πŸ‘οΈ Eye Gaze Anomaly: {{ $gazeAlerts }} @if($lowerGaze > 0) πŸ“± Lower Gaze (>10s): {{ $lowerGaze }} @endif @if($questionRepeat > 0) πŸ—£οΈ Question Repetition: {{ $questionRepeat }} @endif @if($externalAi > 0) πŸ€– Parakeet / External AI: {{ $externalAi }} @endif
πŸ“„ Report @if($inv->call_status === 'active') @else @endif
No candidate interview sessions found. Click "+ Schedule Candidate Interview" above to create one.

Schedule Candidate Assessment

@csrf
@foreach($interviewers as $usr) @endforeach
πŸ“ž Real-Time 2-Way Interview Call & Candidate Screen DISCONNECTED
Candidate Camera
Click 'Start / Join 2-Way Call' to connect
πŸ‘€ Candidate Video (100%)
πŸ–₯️
Candidate Live Screen
Waiting for candidate to share screen...
πŸ–₯️ Shared Screen (100%)
@php $usrWords = preg_split('/\s+/', trim(Auth::user()->name)); if (count($usrWords) >= 2) { $usrInitials = strtoupper(substr($usrWords[0], 0, 1) . substr(end($usrWords), 0, 1)); } else { $uStr = trim(Auth::user()->name); $usrInitials = strtoupper(substr($uStr, 0, 1) . (strlen($uStr) > 1 ? substr($uStr, -1) : '')); } @endphp
{{ $usrInitials }}
{{ Auth::user()->name }}
Panelist (Self)
πŸŽ™οΈ Panelist Self
πŸ’» Candidate Live IDE & Workspace Inspector PYTHON ● Live Synced
Current Code Solution (Visible even if candidate does not share screen):
Execution Stdout / Stderr Output:
Proctoring Audit:
πŸ’¬ 2-Way Live Chat History:
No chat history. Send a message below.
🚨

candidate might cheating

Proctoring engine flagged candidate cheating activity!
Violation details loading...
πŸ“ž
⚑ INCOMING INTERVIEW CALL

Candidate Name

Initiated by Panelist
Another interviewer has started calling the candidate. Click Accept Call to join live, or Decline if busy (you can join later anytime from the dashboard table).