date('c'), 'actions'=>[], 'done'=>0, 'pending'=>0]; $LOG = '/tmp/opus5-pending.log'; function logp($msg) { global $LOG; @file_put_contents($LOG, date('c')." $msg\n", FILE_APPEND); } logp("START opus5-pending-runner"); // === P1-1: ETHICA_COUNT DIAGNOSTIC (auto-check + report) === // Le vrai fix router nécessite root chattr. Ici on rapporte l'état try { $pg_count = @shell_exec("timeout 5 env PGPASSWORD=admin123 psql -h 10.1.0.3 -U admin -d adx_system -tAc 'SELECT COUNT(*) FROM ethica.medecins_real' 2>&1"); $pg_count = trim($pg_count); $router_file = '/opt/wevia-brain/wevia-master-router.php'; $router_line = @shell_exec("grep -A 2 'MASTER-WIRED INTENT: ethica_count' $router_file 2>/dev/null | head -4"); $has_hostname_bug = strpos($router_line, '/etc/hostname') !== false; $R['actions'][] = [ 'id' => 'ethica_count_diag', 'status' => $has_hostname_bug ? 'BUG_CONFIRMED (router stub hostname)' : 'OK', 'db_count_live' => is_numeric($pg_count) ? (int)$pg_count : $pg_count, 'action_needed' => $has_hostname_bug ? 'sudo chattr -i + php patch-ethica + chattr +i' : 'NONE' ]; $has_hostname_bug ? $R['pending']++ : $R['done']++; } catch (Exception $e) { $R['actions'][] = ['id'=>'ethica_count_diag','err'=>$e->getMessage()]; } // === P1-2: WEVADS ACCOUNTS WITHOUT TENANT (scan + report) === try { $sql = "SELECT COUNT(*) FROM office_accounts WHERE tenant_id IS NULL OR tenant_id = '' OR tenant_id = '0'"; $no_tenant = @shell_exec("timeout 5 env PGPASSWORD=admin123 psql -h 10.1.0.3 -U admin -d adx_system -tAc \"$sql\" 2>&1"); $no_tenant = trim($no_tenant); $total = @shell_exec("timeout 5 env PGPASSWORD=admin123 psql -h 10.1.0.3 -U admin -d adx_system -tAc 'SELECT COUNT(*) FROM office_accounts' 2>&1"); $total = trim($total); $R['actions'][] = [ 'id' => 'wevads_no_tenant', 'accounts_without_tenant' => is_numeric($no_tenant) ? (int)$no_tenant : $no_tenant, 'accounts_total' => is_numeric($total) ? (int)$total : $total, 'action_needed' => (is_numeric($no_tenant) && (int)$no_tenant > 0) ? 'tenant assignment script to write (P1 action, needs tenant list)' : 'NONE' ]; if (is_numeric($no_tenant) && (int)$no_tenant > 0) $R['pending']++; else $R['done']++; } catch (Exception $e) { $R['actions'][] = ['id'=>'wevads_no_tenant','err'=>$e->getMessage()]; } // === P1-4: TIMEOUTS CHECK === $timeout_apis = ['api-key-hub.php', 'fixall.php', 'l99-chatbot-deep.php']; $timeout_report = []; foreach ($timeout_apis as $api) { $start = microtime(true); $ch = curl_init("http://127.0.0.1/api/$api"); curl_setopt_array($ch, [CURLOPT_TIMEOUT=>8, CURLOPT_RETURNTRANSFER=>true, CURLOPT_NOBODY=>true]); curl_exec($ch); $http = curl_getinfo($ch, CURLINFO_HTTP_CODE); $time = round((microtime(true) - $start) * 1000); curl_close($ch); $timeout_report[$api] = ['http'=>$http, 'ms'=>$time]; } $R['actions'][] = ['id'=>'timeouts_check', 'apis'=>$timeout_report]; $R['done']++; // === STUBS opus4 PENDING count === $stubs = glob('/var/www/html/api/wired-pending/intent-opus4-*.php') ?: []; $stub_sum = []; foreach ($stubs as $s) { $info = @include $s; if (is_array($info)) $stub_sum[] = ['name'=>$info['name'], 'status'=>$info['status']]; } $R['actions'][] = ['id'=>'opus4_stubs_pending', 'count'=>count($stubs), 'list'=>$stub_sum]; // === P2 SCREENS 404 count === $screens_health = @json_decode(@file_get_contents('/var/www/html/api/screens-health.json'), true) ?: []; $n_404 = 0; $n_total = 0; if (isset($screens_health['screens'])) { foreach ($screens_health['screens'] as $sc) { $n_total++; if (($sc['status'] ?? '') === 'TRULY_404' || ($sc['http'] ?? 0) == 404) $n_404++; } } $R['actions'][] = ['id'=>'p2_screens_404', 'truly_404'=>$n_404, 'total'=>$n_total]; // === BLADE QUEUE STATUS === $blade_q = @json_decode(@file_get_contents('/var/www/html/api/blade-queue.json'), true) ?: []; $R['actions'][] = ['id'=>'blade_queue', 'count'=>count($blade_q)]; // === NonReg + L99 === $nr = @json_decode(@file_get_contents('http://127.0.0.1/api/nonreg-api.php?cat=all'), true) ?: []; $R['actions'][] = ['id'=>'nonreg', 'pass'=>$nr['pass'] ?? '?', 'total'=>$nr['total'] ?? '?']; logp("END done=".$R['done']." pending=".$R['pending']); echo json_encode($R, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);