Files
wevia-brain/wevia-bridge-intents.php
2026-04-12 23:01:36 +02:00

144 lines
10 KiB
PHP

<?php
// BRIDGE INTENTS v3 — Comble les gaps de wave200 vers execution reelle
function wevia_bridge_intents($msg, $base) {
// ETHICA: specialites
if (preg_match('/segmente.*medecin|specialite.*medecin|top.*specialite|repartition.*hcp|combien.*specialite/iu', $msg)) {
$s = trim((string)@shell_exec("PGPASSWORD=admin123 psql -h localhost -U admin -d adx_system -t -c \"SELECT spec_list, COUNT(*) as total FROM ethica.hcp_summary WHERE spec_list IS NOT NULL GROUP BY spec_list ORDER BY total DESC LIMIT 15\" 2>&1"));
if ($s && strpos($s, 'ERROR') === false) return array_merge($base, ['content' => "TOP SPECIALITES HCP ETHICA:\n" . $s, 'source' => 'ethica-query']);
}
// ETHICA: par pays
if (preg_match('/medecin.*par.*pays|hcp.*par.*pays|repartition.*pays/iu', $msg)) {
$s = trim((string)@shell_exec("PGPASSWORD=admin123 psql -h localhost -U admin -d adx_system -t -c \"SELECT pays, COUNT(*) as total FROM ethica.hcp_summary GROUP BY pays ORDER BY total DESC\" 2>&1"));
if ($s && strpos($s, 'ERROR') === false) return array_merge($base, ['content' => "HCP PAR PAYS:\n" . $s, 'source' => 'ethica-query']);
}
// ETHICA: par ville
if (preg_match('/medecin.*par.*ville|hcp.*par.*ville|medecin.*casablanca|medecin.*rabat|medecin.*tunis/iu', $msg)) {
$s = trim((string)@shell_exec("PGPASSWORD=admin123 psql -h localhost -U admin -d adx_system -t -c \"SELECT ville, COUNT(*) as total FROM ethica.hcp_summary WHERE ville IS NOT NULL GROUP BY ville ORDER BY total DESC LIMIT 15\" 2>&1"));
if ($s && strpos($s, 'ERROR') === false) return array_merge($base, ['content' => "HCP PAR VILLE:\n" . $s, 'source' => 'ethica-query']);
}
// ETHICA: stats generales
if (preg_match('/ethica.*(combien|stat|pays)|combien.*(medecin|hcp|docteur)/iu', $msg)) {
$s = trim((string)@shell_exec("curl -s https://weval-consulting.com/api/ethica-stats.php --max-time 10 2>/dev/null"));
if ($s) return array_merge($base, ['content' => "ETHICA STATS:\n" . $s, 'source' => 'ethica-db']);
}
// Cron status
if (preg_match('/cron.*(status|actif|liste)|combien.*cron/iu', $msg)) {
$n = trim((string)@shell_exec("crontab -l -u www-data 2>/dev/null | grep -cv '^#\|^$'"));
$d = trim((string)@shell_exec("crontab -l -u www-data 2>/dev/null | grep -v '^#\|^$' | tail -15"));
return array_merge($base, ['content' => "CRONS ACTIFS: $n\n\n$d", 'source' => 'cron-check']);
}
// Restart service
if (preg_match('/restart\s+(\w+)|relance\s+(\w+)/iu', $msg, $m)) {
$svc = !empty($m[1]) ? $m[1] : $m[2];
$s = trim((string)@shell_exec("docker restart " . escapeshellarg($svc) . " 2>&1 || systemctl restart " . escapeshellarg($svc) . " 2>&1"));
return array_merge($base, ['content' => "RESTART $svc: $s", 'source' => 'service-action']);
}
// Cleanup
if (preg_match('/(clean|nettoi|purge|libere)/iu', $msg)) {
$s = trim((string)@shell_exec("docker system prune -f 2>/dev/null; journalctl --vacuum-size=100M 2>/dev/null; df -h / | tail -1"));
return array_merge($base, ['content' => "CLEANUP:\n$s", 'source' => 'cleanup-action']);
}
// Ollama models
if (preg_match('/ollama.*(model|status)|model.*ollama|quels.*model/iu', $msg)) {
$s = trim((string)@shell_exec("curl -s http://localhost:11435/api/tags 2>/dev/null | python3 -c \"import sys,json;d=json.load(sys.stdin);[print(m['name'],round(m.get('size',0)/1e9,1),'GB') for m in d.get('models',[])]\" 2>&1"));
return array_merge($base, ['content' => "OLLAMA MODELS:\n$s", 'source' => 'ollama-check']);
}
// Architecture pages
if (preg_match('/combien.*(page|ecran)|architecture.*(page|ecran)/iu', $msg)) {
$html = trim((string)@shell_exec("find /var/www/html -maxdepth 2 -name '*.html' 2>/dev/null | wc -l"));
$apis = trim((string)@shell_exec("find /var/www/html/api -name '*.php' 2>/dev/null | wc -l"));
$products = trim((string)@shell_exec("find /var/www/html/products -name '*.html' 2>/dev/null | wc -l"));
return array_merge($base, ['content' => "ARCHITECTURE: $html pages HTML, $apis APIs PHP, $products products", 'source' => 'arch-count']);
}
// Gitea/Wiki
if (preg_match('/wiki|gitea.*(status|repo)|combien.*(repo)/iu', $msg)) {
$s = trim((string)@shell_exec("curl -s 'http://localhost:3300/api/v1/repos/search?limit=50' -H 'Authorization: token c49e696bfbf2dfd41dc3e0f37e7e35ac1ec06d22' 2>/dev/null | python3 -c \"import sys,json;d=json.load(sys.stdin);print(len(d.get('data',[])),'repos')\" 2>&1"));
return array_merge($base, ['content' => "GITEA: $s", 'source' => 'gitea-check']);
}
// Qdrant
if (preg_match('/qdrant.*(detail|vector|point)|combien.*(point|embedding)/iu', $msg)) {
$s = trim((string)@shell_exec("curl -s http://localhost:6333/collections 2>/dev/null | python3 -c \"import sys,json;d=json.load(sys.stdin);[print(c['name'],':',c.get('points_count','?'),'points') for c in d.get('result',{}).get('collections',[])]\" 2>&1"));
return array_merge($base, ['content' => "QDRANT COLLECTIONS:\n$s", 'source' => 'qdrant-detail']);
}
// n8n
if (preg_match('/n8n/iu', $msg)) {
$s = trim((string)@shell_exec("docker ps --format 'table {{.Names}}\t{{.Status}}' 2>/dev/null | grep -i n8n || echo 'n8n NOT FOUND'"));
return array_merge($base, ['content' => "N8N: $s", 'source' => 'n8n-check']);
}
// Git operations
if (preg_match('/^git\b/iu', $msg)) {
$op = 'status';
if (preg_match('/push/i', $msg)) $op = 'push gitea main 2>&1';
elseif (preg_match('/pull/i', $msg)) $op = 'pull';
elseif (preg_match('/log/i', $msg)) $op = 'log --oneline -10';
$s = trim((string)@shell_exec("cd /var/www/html && git $op 2>&1 | head -20"));
return array_merge($base, ['content' => "GIT $op:\n$s", 'source' => 'git-action']);
}
// Scan complet
if (preg_match('/scan.*complet|audit.*complet|scan.*serveur|inventaire.*complet/iu', $msg)) {
$disk = trim((string)@shell_exec("df -h / | tail -1"));
$docker_n = trim((string)@shell_exec("docker ps -q 2>/dev/null | wc -l"));
$docker_l = trim((string)@shell_exec("docker ps --format 'table {{.Names}}\t{{.Status}}' 2>/dev/null | head -20"));
$crons = trim((string)@shell_exec("crontab -l -u www-data 2>/dev/null | grep -cv '^#\|^$'"));
$pages = trim((string)@shell_exec("find /var/www/html -maxdepth 2 -name '*.html' 2>/dev/null | wc -l"));
$apis = trim((string)@shell_exec("find /var/www/html/api -name '*.php' 2>/dev/null | wc -l"));
$ollama_n = trim((string)@shell_exec("curl -s http://localhost:11435/api/tags 2>/dev/null | python3 -c \"import sys,json;print(len(json.load(sys.stdin).get('models',[])))\" 2>&1"));
$ssl = trim((string)@shell_exec("echo|openssl s_client -servername weval-consulting.com -connect 127.0.0.1:443 2>/dev/null|openssl x509 -noout -enddate 2>/dev/null"));
$nginx = trim((string)@shell_exec("nginx -t 2>&1 | tail -1"));
$rep = "SCAN COMPLET S204:\nDisk: $disk\nDocker: $docker_n containers\n$docker_l\nCrons: $crons (www-data)\nPages: $pages HTML | APIs: $apis PHP\nOllama: $ollama_n models\nSSL: $ssl\nNginx: $nginx";
return array_merge($base, ['content' => $rep, 'source' => 'full-scan']);
}
// L99 coverage
if (preg_match('/l99.*(test|check|couverture|coverage|detecte)/iu', $msg)) {
$r = trim((string)@shell_exec("ls -t /opt/weval-l99/logs/l99-*.json 2>/dev/null | head -1 | xargs python3 -c \"import sys,json;d=json.load(open(sys.argv[1]));print('PASS:',d.get('pass','?'),'TOTAL:',d.get('total','?'))\" 2>&1"));
$growth = trim((string)@shell_exec("ls -t /opt/weval-l99/logs/l99-*.json 2>/dev/null | head -1 | xargs grep -c 'growth' 2>/dev/null || echo 0"));
return array_merge($base, ['content' => "L99 COVERAGE: $r\nGrowth Engine: " . ($growth > 0 ? "OUI ($growth tests)" : "NON detecte"), 'source' => 'l99-coverage']);
}
// Growth Engine
if (preg_match('/growth|revenue.*engine|pipeline.*commercial/iu', $msg)) {
$pages = trim((string)@shell_exec("find /var/www/html -maxdepth 2 -name '*.html' 2>/dev/null | wc -l"));
$apis = trim((string)@shell_exec("find /var/www/html/api -name '*.php' 2>/dev/null | wc -l"));
$products = trim((string)@shell_exec("ls /var/www/html/products/*.html 2>/dev/null | wc -l"));
return array_merge($base, ['content' => "GROWTH ENGINE:\nPages: $pages | APIs: $apis | Products: $products\nDashboard: /growth-engine.html\n6 opportunites: Ethica Pharma (600K) | API HCP (300K) | WeviaAI SaaS (200K) | Consulting (150K) | White-label (80K) | Formation (60K)", 'source' => 'growth-engine']);
}
// Blade AI browser command
if (preg_match('/^blade\s+(claude|deepseek|chatgpt|gemini|perplexity)\s*(.*)/iu', $msg, $bm)) {
$ai = strtolower($bm[1]);
$query = trim($bm[2]);
$urls = ['deepseek'=>'https://chat.deepseek.com','chatgpt'=>'https://chat.openai.com',
'claude'=>'https://claude.ai','gemini'=>'https://gemini.google.com',
'perplexity'=>'https://perplexity.ai'];
$url = $urls[$ai] ?? 'https://claude.ai';
$ts = time();
$task = ['id'=>$ai.'_'.$ts,'type'=>'powershell','name'=>ucfirst($ai).' Web',
'status'=>'pending','created'=>date('c'),'created_by'=>'wevia-bridge',
'command'=>'Start-Process chrome -ArgumentList "'.$url.'" -WindowStyle Normal'];
if ($query) {
$task['query'] = $query;
$task['command'] = 'Start-Process chrome -ArgumentList "'.$url.'" -WindowStyle Normal; Start-Sleep 5; Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait("'.$query.'{ENTER}")';
}
@file_put_contents("/var/www/html/api/blade-tasks/task_{$ai}_{$ts}.json", json_encode($task, JSON_PRETTY_PRINT));
return array_merge($base, ['content' => "BLADE: Task creee pour $ai. Chrome va ouvrir $url" . ($query ? " avec le message: $query" : "") . "\nTask ID: {$ai}_{$ts}", 'source' => 'blade-action']);
}
return null;
}