diff --git a/cannaiq/src/pages/WorkersDashboard.tsx b/cannaiq/src/pages/WorkersDashboard.tsx index 9d100147..f198c5d8 100644 --- a/cannaiq/src/pages/WorkersDashboard.tsx +++ b/cannaiq/src/pages/WorkersDashboard.tsx @@ -334,67 +334,97 @@ function ResourceBadge({ worker }: { worker: Worker }) { ); } -// Preflight Summary - shows qualification status with geo region +// Preflight Summary - shows IP, fingerprint, antidetect status, and qualification function PreflightSummary({ worker }: { worker: Worker }) { const httpStatus = worker.preflight_http_status || 'pending'; const isQualified = worker.is_qualified || httpStatus === 'passed'; const httpIp = worker.http_ip; + const fingerprint = worker.fingerprint_data; const httpError = worker.preflight_http_error; + const httpMs = worker.preflight_http_ms; const geoState = worker.current_state; const geoCity = worker.current_city; - // Build tooltip + // Build detailed tooltip const tooltipLines: string[] = []; tooltipLines.push(`HTTP Preflight: ${httpStatus.toUpperCase()}`); if (httpIp) tooltipLines.push(`IP: ${httpIp}`); + if (httpMs) tooltipLines.push(`Response: ${httpMs}ms`); + if (fingerprint?.browser) tooltipLines.push(`Browser: ${fingerprint.browser}`); + if (fingerprint?.timezone) tooltipLines.push(`Timezone: ${fingerprint.timezone}`); + if (fingerprint?.productsReturned !== undefined) tooltipLines.push(`Products returned: ${fingerprint.productsReturned}`); + if (fingerprint?.botDetection) { + const bd = fingerprint.botDetection; + tooltipLines.push(`Bot detection - webdriver: ${bd.webdriver ? 'detected' : 'hidden'}`); + } if (geoState) tooltipLines.push(`Geo: ${geoCity ? `${geoCity}, ` : ''}${geoState}`); if (worker.session_task_count !== undefined) { tooltipLines.push(`Session: ${worker.session_task_count}/${worker.session_max_tasks || 7} tasks`); } if (httpError) tooltipLines.push(`Error: ${httpError}`); - // Qualified - show icon + geo + // Qualification styling - gold shield + geo for qualified if (isQualified) { return ( -