Files
html/api/blade-brain.php
2026-04-12 22:57:03 +02:00

670 lines
40 KiB
PHP

<?php
require_once __DIR__.'/weval-brand-guard.php';
// === INPUT SANITIZATION ===
function weval_input($key, $type='string', $method='GET') {
$src = $method === 'POST' ? INPUT_POST : INPUT_GET;
$val = filter_input($src, $key, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($val === null || $val === false) {
$val = ($method === 'POST') ? ($_POST[$key] ?? '') : ($_GET[$key] ?? '');
$val = htmlspecialchars(strip_tags(trim($val)), ENT_QUOTES, 'UTF-8');
}
if ($type === 'int') return intval($val);
if ($type === 'email') return filter_var($val, FILTER_SANITIZE_EMAIL);
return $val;
}
header("Content-Type: application/json");
$msg = $_REQUEST["msg"] ?? "";
if (!$msg) { echo json_encode(["error"=>"no msg"]); exit; }
$greetings = ["hi","hello","salut","bonjour","hey","yo","coucou","bonsoir","slt","ca va","sup","hola"];
if (in_array(strtolower(trim($msg)), $greetings)) {
echo json_encode(["ok"=>true,"response"=>"Salut ! Je suis le Blade AI Controller. Dis-moi ce que tu veux faire sur le Blade Razer en langage naturel.","type"=>"greeting"]);
exit;
}
// === BLADE OPS ROUTING (v4) — Server commands bypass AI cascade ===
$msg_lower = strtolower(trim($msg));
$OPS_API = "https://weval-consulting.com/api/blade-ops-api.php?k=BLADE2026";
// SSO commands
if (preg_match('/sso|authentik|auth.*check|auth.*fix|login.*problem|cookie.*purge|purge.*cookie/', $msg_lower)) {
if (preg_match('/fix|restart|repair|repare/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=sso_fix", false, stream_context_create(["http"=>["timeout"=>30],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"SSO fix timeout"]);
} elseif (preg_match('/purge|cookie|clean/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=purge_cookies", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Purge timeout"]);
} else {
$r = @file_get_contents("$OPS_API&action=sso_check", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"SSO check timeout"]);
}
exit;
}
// Health / Status commands
if (preg_match('/^(health|status|sante|etat|infra|serveur|server)/', $msg_lower) || preg_match('/comment va|ca va|how.*server/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=health", false, stream_context_create(["http"=>["timeout"=>45],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Health check timeout"]);
exit;
}
// Docker commands
if (preg_match('/docker|container/', $msg_lower)) {
$sub = preg_match('/restart|redemarr/', $msg_lower) ? 'restart' : 'ps';
$svc = '';
if ($sub === 'restart' && preg_match('/restart\s+(\S+)|redemarr.*?(\S+)/', $msg_lower, $m)) {
$svc = $m[1] ?: $m[2];
}
$r = @file_get_contents("$OPS_API&action=docker&sub=$sub&service=$svc", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Docker timeout"]);
exit;
}
// NonReg commands
if (preg_match('/nonreg|non.reg|test.*complet|regression/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=nonreg", false, stream_context_create(["http"=>["timeout"=>150],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"NonReg timeout"]);
exit;
}
// Git commands
if (preg_match('/^git\s|git status|git log|git pull|dernier commit/', $msg_lower)) {
$sub = 'log --oneline -5';
if (preg_match('/status/', $msg_lower)) $sub = 'status';
if (preg_match('/pull/', $msg_lower)) $sub = 'pull origin main';
$r = @file_get_contents("$OPS_API&action=git&sub=" . urlencode($sub), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Git timeout"]);
exit;
}
// Disk commands
if (preg_match('/disk|espace|disque|stockage|storage/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=disk", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Disk timeout"]);
exit;
}
// Ethica commands
if (preg_match('/ethica|hcp|medecin|pharma/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=ethica", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Ethica timeout"]);
exit;
}
// Leads / B2B commands
if (preg_match('/leads|b2b|prospect/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=leads", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Leads timeout"]);
exit;
}
// Nginx commands
if (preg_match('/nginx|reload nginx|test nginx/', $msg_lower)) {
$sub = preg_match('/reload/', $msg_lower) ? 'reload' : 'test';
$r = @file_get_contents("$OPS_API&action=nginx&sub=$sub", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Nginx timeout"]);
exit;
}
// Cron commands
if (preg_match('/cron|tache.*planif|scheduled/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=crons", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Crons timeout"]);
exit;
}
// Direct exec on server (advanced)
if (preg_match('/exec\s+(s204|s95|s151)\s+(.+)/', $msg_lower, $m)) {
$target = $m[1];
$cmd = $m[2];
$r = @file_get_contents("$OPS_API&action=exec&target=$target&cmd=" . urlencode($cmd), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"Exec timeout"]);
exit;
}
// === WEB SEARCH ===
if (preg_match('/cherche|search|recherche|google|find|trouve/', $msg_lower) && !preg_match('/hcp|ethica|lead/', $msg_lower)) {
$q = preg_replace('/^(cherche|search|recherche|google|find|trouve)\s+/i', '', $msg);
$r = @file_get_contents("$OPS_API&action=search&q=" . urlencode($q), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"search timeout"]);
exit;
}
// === WEB FETCH ===
if (preg_match('/^(fetch|ouvre|lis|read)\s+(https?:\/\/\S+)/', $msg, $m)) {
$url = $m[2];
$r = @file_get_contents("$OPS_API&action=fetch&url=" . urlencode($url), false, stream_context_create(["http"=>["timeout"=>20],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"fetch timeout"]);
exit;
}
// === BROWSE + SCREENSHOT ===
if (preg_match('/browse|screenshot.*url|capture.*page|screenshot.*http/', $msg_lower)) {
$url = 'https://weval-consulting.com';
if (preg_match('/(https?:\/\/\S+)/', $msg, $m)) $url = $m[1];
$type = preg_match('/screenshot|capture/', $msg_lower) ? 'screenshot' : 'extract';
$r = @file_get_contents("$OPS_API&action=browse&url=" . urlencode($url) . "&type=$type", false, stream_context_create(["http"=>["timeout"=>40],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"browse timeout"]);
exit;
}
// === EMAIL ===
if (preg_match('/^(mail|email|inbox|boite|courrier)/', $msg_lower) || preg_match('/mes mails|mes emails|lire.*mail|check.*mail/', $msg_lower)) {
if (preg_match('/urgent|important|vip|priorit/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=email_urgent&limit=10", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
} elseif (preg_match('/vip|draft|brouillon|reponse.*pret/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=email_vip", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
} elseif (preg_match('/redige|repond|draft.*uid|reponse.*(\d+)/', $msg_lower, $m)) {
$uid = $m[1] ?? 0;
if (!$uid) { preg_match('/(\d{4,})/', $msg, $m2); $uid = $m2[1] ?? 0; }
if ($uid) {
$r = @file_get_contents("$OPS_API&action=email_draft&uid=$uid", false, stream_context_create(["http"=>["timeout"=>30],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
} else {
$r = json_encode(["error"=>"Quel email ? Donne le UID"]);
}
} else {
$r = @file_get_contents("$OPS_API&action=email_list&limit=10", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
}
echo $r ?: json_encode(["error"=>"email timeout"]);
exit;
}
// === AI LOCAL ===
if (preg_match('/^(ollama|ai|demande.*ollama|ask.*model)\s+(.+)/', $msg_lower, $m)) {
$prompt = $m[2];
$model = 'qwen3:8b';
if (preg_match('/mistral/', $msg_lower)) $model = 'mistral';
if (preg_match('/medllama|medical/', $msg_lower)) $model = 'medllama2';
if (preg_match('/meditron/', $msg_lower)) $model = 'meditron:7b';
$r = @file_get_contents("$OPS_API&action=ai&model=$model&prompt=" . urlencode($prompt), false, stream_context_create(["http"=>["timeout"=>60],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"AI timeout"]);
exit;
}
if (preg_match('/models|modeles|ollama.*list/', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=ai_models", false, stream_context_create(["http"=>["timeout"=>8],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"models timeout"]);
exit;
}
// === OPEN URL ON BLADE ===
if (preg_match('/ouvre.*(https?:\/\/\S+)/', $msg, $m) || preg_match('/open.*(https?:\/\/\S+)/', $msg, $m)) {
$url = $m[1];
$r = @file_get_contents("$OPS_API&action=blade_open&url=" . urlencode($url), false, stream_context_create(["http"=>["timeout"=>8],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"blade timeout"]);
exit;
}
// === OSINT ===
if (preg_match('/osint|holehe|sherlock|theharvester|recon/', $msg_lower)) {
$tool = 'holehe';
if (preg_match('/sherlock/', $msg_lower)) $tool = 'sherlock';
if (preg_match('/harvester/', $msg_lower)) $tool = 'theHarvester';
$target = preg_replace('/^.*?(osint|holehe|sherlock|theharvester|recon)\s+/i', '', $msg);
$r = @file_get_contents("$OPS_API&action=osint&tool=$tool&target=" . urlencode(trim($target)), false, stream_context_create(["http"=>["timeout"=>35],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"osint timeout"]);
exit;
}
// === FILES ===
if (preg_match('/^(cat|lire|read|affiche)\s+(.+)/', $msg, $m)) {
$path = trim($m[2]); $tgt = 'target=s204';
if (preg_match('/s95/', $path)) { $tgt = 'target=s95'; $path = preg_replace('/\s*s95\s*/', '', $path); }
if (preg_match('/s151/', $path)) { $tgt = 'target=s151'; $path = preg_replace('/\s*s151\s*/', '', $path); }
$r = @file_get_contents("$OPS_API&action=file_read&$tgt&path=" . urlencode(trim($path)), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
if (preg_match('/^ls\s+(.+)/', $msg, $m)) {
$path = trim($m[1]); $tgt = 'target=s204';
if (preg_match('/s95/', $path)) { $tgt = 'target=s95'; $path = preg_replace('/\s*s95\s*/', '', $path); }
$r = @file_get_contents("$OPS_API&action=file_list&$tgt&path=" . urlencode(trim($path)), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === LOGS ===
if (preg_match('/log[s]?\s+(.*)/i', $msg_lower, $m) && !preg_match('/git log/', $msg_lower)) {
$file = trim($m[1]) ?: 'syslog'; $tgt = 'target=s204';
if (preg_match('/s95/', $file)) { $tgt = 'target=s95'; $file = trim(preg_replace('/s95/', '', $file)); }
if (preg_match('/cherche|search|grep|erreur|error/', $msg_lower)) {
$grep = preg_match('/erreur|error/', $msg_lower) ? 'error' : $file;
$r = @file_get_contents("$OPS_API&action=logs_search&$tgt&file=syslog&grep=" . urlencode($grep), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
} else {
$r = @file_get_contents("$OPS_API&action=logs&$tgt&file=" . urlencode($file) . "&lines=30", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
}
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === SERVICES ===
if (preg_match('/service[s]?\s+(restart|stop|start|status)\s+(\S+)/i', $msg_lower, $m)) {
$act = $m[1]; $svc = $m[2]; $tgt = 'target=s204';
if (preg_match('/s95/', $svc)) { $tgt = 'target=s95'; $svc = trim(preg_replace('/s95/', '', $svc)); }
$r = @file_get_contents("$OPS_API&action=service_ctl&$tgt&do=$act&service=" . urlencode(trim($svc)), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
if (preg_match('/^services/i', $msg_lower)) {
$tgt = preg_match('/s95/', $msg_lower) ? 'target=s95' : 'target=s204';
$r = @file_get_contents("$OPS_API&action=services&$tgt", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === NETWORK ===
if (preg_match('/^ping\s+(\S+)/i', $msg, $m)) {
$r = @file_get_contents("$OPS_API&action=ping&host=" . urlencode($m[1]), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
if (preg_match('/port[s]?\s+(scan|check|test)/i', $msg_lower) || preg_match('/^ports\s/i', $msg_lower)) {
$host = '127.0.0.1'; if (preg_match('/(\d+\.\d+\.\d+\.\d+)/', $msg, $m)) $host = $m[1];
$r = @file_get_contents("$OPS_API&action=ports&host=" . urlencode($host), false, stream_context_create(["http"=>["timeout"=>20],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
if (preg_match('/ssl|certificat|cert\s+check/i', $msg_lower)) {
$domain = 'weval-consulting.com'; if (preg_match('/([\w.-]+\.\w{2,})/', $msg, $m)) $domain = $m[1];
$r = @file_get_contents("$OPS_API&action=ssl_check&domain=" . urlencode($domain), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === MTA ===
if (preg_match('/mta|pmta|kumo|postfix|smtp|mail.*queue/i', $msg_lower)) {
$act = preg_match('/queue|file/', $msg_lower) ? 'mta_queue' : 'mta_status';
$r = @file_get_contents("$OPS_API&action=$act", false, stream_context_create(["http"=>["timeout"=>20],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === TELEGRAM ===
if (preg_match('/telegram\s+(.+)/i', $msg, $m) || preg_match('/envoie.*telegram\s+(.+)/i', $msg, $m)) {
$r = @file_get_contents("$OPS_API&action=telegram&msg=" . urlencode(trim($m[1])), false, stream_context_create(["http"=>["timeout"=>8],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === CLOUDFLARE ===
if (preg_match('/cloudflare|cf\s+dns|dns\s+record/i', $msg_lower)) {
$act = preg_match('/purge|cache|clear/', $msg_lower) ? 'cf_purge' : 'cf_dns';
$r = @file_get_contents("$OPS_API&action=$act", false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === PROCESS ===
if (preg_match('/^(ps|process|htop)/i', $msg_lower)) {
$filter = preg_replace('/^(ps|process|htop)\s*/i', '', $msg);
$tgt = preg_match('/s95/', $msg_lower) ? 'target=s95' : 'target=s204';
$r = @file_get_contents("$OPS_API&action=ps&$tgt&filter=" . urlencode(trim($filter)), false, stream_context_create(["http"=>["timeout"=>15],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
if (preg_match('/kill\s+(\d+)/i', $msg, $m)) {
$r = @file_get_contents("$OPS_API&action=kill&pid=" . $m[1], false, stream_context_create(["http"=>["timeout"=>8],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === BACKUP ===
if (preg_match('/backup|sauvegarde/i', $msg_lower)) {
$what = 'html';
if (preg_match('/ethica/', $msg_lower)) $what = 'ethica';
if (preg_match('/nginx/', $msg_lower)) $what = 'nginx';
if (preg_match('/db|base|postgres/', $msg_lower)) $what = 'db';
$r = @file_get_contents("$OPS_API&action=backup&what=$what", false, stream_context_create(["http"=>["timeout"=>60],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === TEST PAGE ===
if (preg_match('/test\s+(https?:\/\/\S+)/i', $msg, $m) || preg_match('/teste?\s+la?\s+page\s+(https?:\/\/\S+)/i', $msg, $m)) {
$r = @file_get_contents("$OPS_API&action=test_page&url=" . urlencode($m[1]), false, stream_context_create(["http"=>["timeout"=>35],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === SSO NONREG ===
if (preg_match('/sso.*nonreg|nonreg.*sso|test.*auth.*complet/i', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=sso_nonreg", false, stream_context_create(["http"=>["timeout"=>200],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === SELF UPDATE ===
if (preg_match('/update|mise.*jour|git pull|self.update/i', $msg_lower)) {
$r = @file_get_contents("$OPS_API&action=self_update", false, stream_context_create(["http"=>["timeout"=>20],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === CRON ADD/REMOVE ===
if (preg_match('/cron\s+add\s+(.+)/i', $msg, $m)) {
$r = @file_get_contents("$OPS_API&action=cron_add&entry=" . urlencode(trim($m[1])), false, stream_context_create(["http"=>["timeout"=>10],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
if (preg_match('/cron\s+(remove|delete|supprime)\s+(.+)/i', $msg, $m)) {
$r = @file_get_contents("$OPS_API&action=cron_remove&pattern=" . urlencode(trim($m[2])), false, stream_context_create(["http"=>["timeout"=>10],"ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]));
echo $r ?: json_encode(["error"=>"timeout"]); exit;
}
// === END OPS ROUTING — continue to AI cascade for other commands ===
$SYSTEM = <<<SYS
'.WEVAL_BRAND_CONTEXT.'Tu es le Blade Brain v3 de WEVAL — controle TOTAL du PC Windows de Yacine via PowerShell.
TYPES DE TACHES:
- powershell: Execute un script PowerShell (cmd= le script complet)
- open_url: Ouvre une URL dans le navigateur (cmd= URL)
- open_app: Ouvre une application (cmd= chemin ou nom: code, chrome, outlook, explorer, terminal, discord, spotify, teams, zoom, slack, notion, obsidian, figma)
- download: Telecharge un fichier (cmd= URL)
- screenshot: Capture ecran complet
- file_write: Ecrit un fichier (cmd= chemin, extra.content= contenu)
- file_read: Lit un fichier (cmd= chemin)
- git_pull: Git pull dans le repo WEVAL
- git_push: Git commit+push (cmd= message de commit)
- git_status: Git status du repo
- sysinfo: Info systeme (CPU, RAM, disque, batterie, reseau)
- list_dir: Liste un dossier (cmd= chemin)
- clipboard_get: Lit le presse-papier
- clipboard_set: Ecrit dans le presse-papier (cmd= texte)
- kill_process: Tue un processus (cmd= nom du processus)
- install_app: Installe un logiciel via winget (cmd= nom package)
- search_files: Recherche des fichiers (cmd= pattern, extra.path= dossier)
- compress: Compresse un dossier en ZIP (cmd= source, extra.dest= destination)
- disk_cleanup: Nettoie les fichiers temporaires et caches
- wifi_scan: Scan les reseaux WiFi disponibles
- battery_report: Rapport batterie detaille
- network_info: Info reseau (IP, DNS, passerelle)
- schedule_task: Cree une tache planifiee Windows (cmd= commande, extra.trigger= daily/hourly/startup)
- close_app: Ferme une application (cmd= nom processus)
- notify: Envoie une notification systeme (cmd= message)
URLS CONNUES:
weval=https://weval-consulting.com, arsenal=https://weval-consulting.com/arsenal-proxy/ceo-dashboard.html, crm=https://crm.weval-consulting.com, wevia=https://weval-consulting.com/wevia, analytics=https://analytics.weval-consulting.com, n8n=https://n8n.weval-consulting.com, deerflow=https://deerflow.weval-consulting.com, wevads=https://weval-consulting.com/wevads-ia/, mm=https://mm.weval-consulting.com, github=https://github.com/Yacineutt, kuma=https://kuma.weval-consulting.com, plausible=https://analytics.weval-consulting.com, blade=https://weval-consulting.com/blade-ai.html, life=https://weval-consulting.com/products/wevialife-app.html, nonreg=https://weval-consulting.com/api/nonreg-report.html, linkedin=https://linkedin.com, gmail=https://mail.google.com, drive=https://drive.google.com, claude=https://claude.ai, chatgpt=https://chat.openai.com, booking=https://weval-consulting.com/booking.html.
APPS CONNUES: code=Visual Studio Code, chrome=Google Chrome, outlook=Outlook, explorer=Explorer, terminal=Windows Terminal, discord=Discord, spotify=Spotify, teams=Teams, zoom=Zoom, slack=Slack, notion=Notion, obsidian=Obsidian, figma=Figma, excel=Excel, word=Word, powerpoint=PowerPoint, onenote=OneNote, paint=Paint, notepad=Notepad, calc=Calculator.
CHEMINS:
CLAUDE=C:\\Users\\Yace\\Desktop\\CLAUDE
Git=C:\\Users\\Yace\\Desktop\\CLAUDE\\weval-consulting
Downloads=C:\\Users\\Yace\\Downloads
Documents=C:\\Users\\Yace\\Documents
Desktop=C:\\Users\\Yace\\Desktop
REGLES:
1. TOUJOURS repondre en JSON strict: {"type":"...","cmd":"...","label":"..."} ou array [...]
2. Pour multi-etapes, retourne un array de taches
3. Pour PowerShell: cmd contient le script complet executable
4. Pour open_url: resous les alias (weval, arsenal, crm, etc)
5. Pour open_app: resous les noms courts (code, chrome, etc)
6. label = description courte en francais de ce que fait la tache
7. Si la demande est un salut/greeting, retourne {"type":"notify","cmd":"greeting","label":"Salut"}
=== CLAUDE CODE PATTERNS (17 SKILLS AUTONOMES) ===
PATTERN 1 - CONTEXT COLLAPSE: Decompose les demandes complexes en sous-taches simples.
"Deploie le site et teste tout" -> [{deploy},{test_nonreg},{notify_result}]
PATTERN 2 - SMART ROUTING: Route vers le bon outil automatiquement.
Web task -> Playwright | File task -> PowerShell | Server task -> SSH | Code -> Python
PATTERN 3 - CIRCUIT BREAKER: Si une commande echoue 2x, change d'approche.
SSH echoue -> essaie SCP | Playwright echoue -> essaie curl | pip echoue -> essaie conda
PATTERN 4 - AUTO-CONTINUE: Si une tache est incomplete, genere la suite automatiquement.
"Training started" -> attendre GGUF -> SCP -> deploy -> test
PATTERN 5 - EFFORT CLASSIFICATION: Evalue la complexite avant d'agir.
Simple (grep, ls) -> exec direct | Moyen (deploy) -> plan + exec | Expert (migration) -> plan + confirm + exec
PATTERN 6 - TOOL DISCOVERY: Decouvre les outils disponibles.
Playwright (browser) | SSH (serveurs) | Python (scripts) | PowerShell (Windows) | curl (APIs)
SCP (transferts) | Git (code) | ollama (AI models) | docker (containers)
PATTERN 7 - MULTI-STEP AGENT: Planifie et execute des workflows complets.
Exemple: "Fine-tune et deploie" -> [install, download_data, train, export, scp, create_model, patch_brain, test]
PATTERN 8 - SELF-HEALING: Si erreur, diagnostique et corrige automatiquement.
"Module not found" -> pip install | "Permission denied" -> sudo/chattr | "Connection refused" -> restart service
PATTERN 9 - WEB AUTOMATION (Playwright):
Peut ouvrir Chrome, naviguer, cliquer, remplir formulaires, telecharger fichiers.
TOUJOURS utiliser le profil Chrome existant (logged into Google).
Code: from playwright.sync_api import sync_playwright; p.chromium.launch_persistent_context(user_data_dir=CHROME_PROFILE)
PATTERN 10 - FILE OPERATIONS:
Lire: Get-Content | Ecrire: Set-Content | Copier: Copy-Item | Deplacer: Move-Item
Chercher: Get-ChildItem -Recurse | Ouvrir: Start-Process | Supprimer: Remove-Item
PATTERN 11 - SERVER OPERATIONS (SSH):
S204: ssh -p 49222 root@204.168.152.13 (pwd: FLVhtCX47w3e)
S95: curl 10.1.0.3:5890/api/sentinel-brain.php?action=exec&cmd=CMD
S151: ssh ubuntu@151.80.235.110 (pwd: REDACTED_SSH)
PATTERN 12 - BROWSER-USE COMPLET:
Ouvrir URL: Start-Process 'https://...' ou playwright goto
Screenshot: playwright page.screenshot()
Fill form: playwright page.fill('selector', 'value')
Click: playwright page.click('text=Button')
Download: playwright page.wait_for_download()
PATTERN 13 - SELF-MOA (Multi-Output Aggregation):
Pour les decisions critiques, genere 3 approches et prend la meilleure.
PATTERN 14 - SOVEREIGN ROUTING: Privilegier les outils locaux avant cloud.
Local Python > API cloud | Local Ollama > Groq API | Local git > GitHub API
PATTERN 15 - MONITORING CONTINU:
Peut verifier l'etat des serveurs, services, sites, et alerter si probleme.
curl -s https://weval-consulting.com/api/blade-api.php?k=BLADE2026&action=status
PATTERN 16 - DEPLOYMENT PIPELINE:
git pull -> test -> build -> deploy -> verify -> notify
Sequence complete avec rollback si echec.
PATTERN 17 - AUTONOMOUS DECISION:
Si la tache est claire et sans risque, execute directement.
Si la tache est risquee (delete, format, drop), demande confirmation.
CAPABILITIES DU BLADE:
- Python 3.14.2 installe
- Playwright + Chromium installe
- pip disponible
- Git disponible
- SSH/SCP disponible
- PowerShell complet
- Acces reseau complet (Groq API, GitHub, serveurs WEVAL)
- Chrome avec profil Google connecte
- Dossier de travail: C:\Users\Yace\Desktop\CLAUDE
EXEMPLES AVANCES MULTI-STEP:
- "Deploie la derniere version du site" -> [{"type":"powershell","cmd":"cd C:\\Users\\Yace\\Desktop\\CLAUDE\\weval-consulting; git pull; git status","label":"Git Pull"},{"type":"powershell","cmd":"ssh -p 49222 root@204.168.152.13 'cd /var/www/weval && git pull'","label":"Deploy S204"}]
- "Teste WEVIA et dis-moi si tout marche" -> [{"type":"powershell","cmd":"python -c \\\"import urllib.request,json; tests=[('Bonjour','wevia'),('Fibonacci','def')]; [print(f'{t[0]}: {len(urllib.request.urlopen(urllib.request.Request(chr(39)https://weval-consulting.com/wevia-ia/weval-chatbot-api.php'+chr(39),json.dumps({chr(39)message'+chr(39):t[0],'+chr(39)mode'+chr(39):'+chr(39)fast'+chr(39)}).encode(),headers={'+chr(39)Content-Type'+chr(39):'+chr(39)application/json'+chr(39)})).read())}ch') for t in tests]\\\"","label":"NonReg WEVIA"}]
- "Sauvegarde tout et eteins" -> [{"type":"powershell","cmd":"cd C:\\Users\\Yace\\Desktop\\CLAUDE\\wevia-brain; git add -A; git commit -m 'backup'; git push","label":"Git Push"},{"type":"powershell","cmd":"Stop-Computer -Force","label":"Eteindre"}]
- "Ouvre Colab et lance le fine-tuning" -> [{"type":"powershell","cmd":"python C:\\Users\\Yace\\Desktop\\CLAUDE\\colab-auto.py","label":"Colab Fine-tune Auto"}]
- "Genere du training data avec Groq" -> [{"type":"powershell","cmd":"python -c \\\"import urllib.request,json; r=urllib.request.urlopen(urllib.request.Request('https://api.groq.com/openai/v1/chat/completions',json.dumps({'model':'llama-3.3-70b-versatile','messages':[{'role':'user','content':'SAP modules pharma'}],'max_tokens':2000}).encode(),headers={'Content-Type':'application/json','Authorization':'Bearer REDACTED'})); print(json.loads(r.read())['choices'][0]['message']['content'][:500])\\\"","label":"Groq Training Gen"}]
EXEMPLES AVANCES:
- "Ouvre le fichier train.jsonl" -> {"type":"powershell","cmd":"Start-Process 'C:\\Users\\Yace\\Desktop\\CLAUDE\\train.jsonl'","label":"Ouvrir train.jsonl"}
- "Liste les fichiers du dossier CLAUDE" -> {"type":"powershell","cmd":"Get-ChildItem 'C:\\Users\\Yace\\Desktop\\CLAUDE' | Select Name,Length,LastWriteTime | Format-Table","label":"Lister dossier CLAUDE"}
- "Ouvre Chrome sur google.com" -> [{"type":"open_url","cmd":"https://google.com","label":"Ouvrir Google"}]
- "Cherche les fichiers .py" -> {"type":"powershell","cmd":"Get-ChildItem -Recurse -Filter '*.py' 'C:\\Users\\Yace\\Desktop\\CLAUDE' | Select FullName","label":"Chercher fichiers Python"}
- "Cree un fichier test.txt avec Hello World" -> {"type":"powershell","cmd":"Set-Content -Path 'C:\\Users\\Yace\\Desktop\\CLAUDE\\test.txt' -Value 'Hello World'","label":"Creer test.txt"}
- "Copie train.jsonl vers Documents" -> {"type":"powershell","cmd":"Copy-Item 'C:\\Users\\Yace\\Desktop\\CLAUDE\\train.jsonl' 'C:\\Users\\Yace\\Documents\\train.jsonl'","label":"Copier train.jsonl"}
- "Ouvre VS Code dans le dossier wevia-brain" -> {"type":"powershell","cmd":"code 'C:\\Users\\Yace\\Desktop\\CLAUDE\\wevia-brain'","label":"VS Code wevia-brain"}
- "Ouvre le Word" -> {"type":"powershell","cmd":"Start-Process winword","label":"Ouvrir Word"}
- "Ouvre PowerPoint" -> {"type":"powershell","cmd":"Start-Process powerpnt","label":"Ouvrir PowerPoint"}
- "Screenshot et envoie" -> {"type":"screenshot","cmd":"desktop","label":"Capture ecran"}
- "Execute python script.py" -> {"type":"powershell","cmd":"python 'C:\\Users\\Yace\\Desktop\\CLAUDE\\script.py'","label":"Executer script.py"}
- "SSH vers S204" -> {"type":"powershell","cmd":"ssh -p 49222 root@204.168.152.13","label":"SSH S204"}
- "SCP fichier vers S151" -> {"type":"powershell","cmd":"scp -o StrictHostKeyChecking=no 'C:\\Users\\Yace\\Desktop\\CLAUDE\\train.jsonl' ubuntu@151.80.235.110:/tmp/","label":"SCP vers S151"}
- "Git pull" -> {"type":"powershell","cmd":"cd 'C:\\Users\\Yace\\Desktop\\CLAUDE\\wevia-brain'; git pull","label":"Git Pull wevia-brain"}
- "Espace disque" -> {"type":"powershell","cmd":"Get-PSDrive C,D,E -EA 0|Select Name,@{N='Free(GB)';E={[math]::Round(\$_.Free/1GB)}},@{N='Used(GB)';E={[math]::Round(\$_.Used/1GB)}}|FT","label":"Espace disque"}
- "Processus gourmands" -> {"type":"powershell","cmd":"Get-Process | Sort-Object WorkingSet -Descending | Select -First 15 Name,@{N='RAM(MB)';E={[math]::Round(\$_.WorkingSet/1MB)}} | FT","label":"Top processus RAM"}
SYS;
// Detect complexity: long msg or multi-step = complex
$is_complex = (mb_strlen($msg) > 150 || preg_match('/puis|ensuite|apres|et aussi|et en plus|multi|analyse|rapport|compare/i', $msg));
$ai_result = null;
$provider_used = "none";
function callProvider($url, $key, $model, $system, $msg, $timeout=10, $extra=[]) {
$body = array_merge([
"model" => $model, "temperature" => 0.1, "max_tokens" => 400,
"messages" => [["role"=>"system","content"=>$system],["role"=>"user","content"=>$msg]], "stream" => false
], $extra);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_TIMEOUT => $timeout,
CURLOPT_HTTPHEADER => ["Content-Type: application/json", "Authorization: Bearer $key"],
CURLOPT_POSTFIELDS => json_encode($body)
]);
$resp = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
if ($code !== 200 || !$resp) return null;
$d = json_decode($resp, true);
$text = trim($d["choices"][0]["message"]["content"] ?? "");
// === ROBUST JSON PARSER v4 ===
// Step 1: Strip ALL markdown code blocks (```json ... ``` or ``` ... ```)
$text = preg_replace('/```(?:json|javascript|js)?\s*\n?/i', '', $text);
$text = preg_replace('/\n?```\s*$/m', '', $text);
$text = trim($text);
// Step 2: Direct JSON decode
$parsed = json_decode($text, true);
if ($parsed && (isset($parsed['type']) || (isset($parsed[0]) && isset($parsed[0]['type'])))) return $parsed;
// Step 3: Extract JSON from surrounding text (LLM often adds explanation before/after)
// Try array first
if (preg_match('/\[\s*\{[^\[]*?"type"\s*:.*?\}\s*\]/s', $text, $m)) {
$parsed = json_decode($m[0], true);
if ($parsed) return $parsed;
}
// Try object
if (preg_match('/\{[^{]*?"type"\s*:.*?\}/s', $text, $m)) {
$parsed = json_decode($m[0], true);
if ($parsed) return ['type' => $parsed['type'] ?? 'info', ...$parsed];
}
// Step 4: Find JSON between first { or [ and matching closer
foreach (['{', '['] as $opener) {
$pos = strpos($text, $opener);
if ($pos !== false) {
$candidate = substr($text, $pos);
// Try progressively shorter substrings (trim trailing garbage)
for ($end = strlen($candidate); $end > 10; $end--) {
$try = substr($candidate, 0, $end);
$last = $try[strlen($try)-1];
if (($opener === '{' && $last === '}') || ($opener === '[' && $last === ']')) {
$parsed = json_decode($try, true);
if ($parsed) return is_array($parsed) && !isset($parsed['type']) && isset($parsed[0]) ? $parsed : $parsed;
}
}
}
}
// Step 5: Keyword fallback - extract action from natural language
if (preg_match('/(?:je vais|I will|executing|running|commande|command)\s*[:.]?\s*[`"]?([^`"\n]+)/i', $text, $m)) {
return [["type" => "powershell", "cmd" => trim($m[1], " `\""), "label" => "parsed_from_text"]];
}
return null;
}
// ===== CASCADE: GLM-5 > WEVIA > Alibaba > Claude(complex) > Keyword =====
$nvidia_key = trim(@file_get_contents("/var/www/html/api/blade-tasks/nvidia-key.txt"));
// === L1: NVIDIA GLM-5 (744B, gratuit, souverain first) ===
if ($nvidia_key) {
$r = callProvider(
"https://integrate.api.nvidia.com/v1/chat/completions",
$nvidia_key, "z-ai/glm5", $SYSTEM, $msg, 12
);
if ($r) { $ai_result = $r; $provider_used = "GLM-5 (744B)"; }
}
// === L2: WEVIA ENGINE (sovereign: Cerebras>Groq>SambaNova>Ollama) ===
if (!$ai_result) {
$ch = curl_init("http://127.0.0.1/api/weval-chatbot-api.php");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_TIMEOUT => 12,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["message"=>$SYSTEM."\n\nCommande: ".$msg,"language"=>"fr","mode"=>"quick"])
]);
$resp = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
if ($code === 200 && $resp) {
$d = json_decode($resp, true);
$text = $d["response"] ?? $d["message"] ?? "";
if (preg_match('/(\[.*?"type".*?\]|\{.*?"type".*?\})/s', $text, $m)) {
$parsed = json_decode($m[1], true);
if ($parsed) { $ai_result = $parsed; $provider_used = "WEVIA Engine"; }
}
}
}
// === L3: ALIBABA QWEN (gratuit, illimite) ===
if (!$ai_result) {
$r = callProvider(
"https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions",
"sk-34db1ad3152443cd86563d1bfc576c30", "qwen-plus", $SYSTEM, $msg, 10
);
if ($r) { $ai_result = $r; $provider_used = "Alibaba Qwen"; }
}
// === L4: CLAUDE OPUS (requetes tres complexes uniquement) ===
if (!$ai_result && $is_complex) {
$r = callProvider(
"https://api.anthropic.com/v1/messages",
"", "claude-sonnet-4-20250514", $SYSTEM, $msg, 15
);
// Anthropic API format different — try direct call
$ch = curl_init("https://api.anthropic.com/v1/messages");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: " . trim(@file_get_contents("/var/www/html/api/blade-tasks/anthropic-key.txt")),
"anthropic-version: 2023-06-01"
],
CURLOPT_POSTFIELDS => json_encode([
"model" => "claude-sonnet-4-20250514", "max_tokens" => 400,
"system" => $SYSTEM,
"messages" => [["role"=>"user","content"=>$msg]]
])
]);
$resp = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
if ($code === 200 && $resp) {
$d = json_decode($resp, true);
$text = trim($d["content"][0]["text"] ?? "");
$text = preg_replace('/^```json\s*/i', '', $text);
$text = preg_replace('/\s*```$/i', '', $text);
$parsed = json_decode($text, true);
if ($parsed) { $ai_result = $parsed; $provider_used = "Claude (complex)"; }
}
}
// === L5: KEYWORD FALLBACK (toujours dispo, meme offline) ===
if (!$ai_result) {
$m = mb_strtolower($msg);
if (preg_match('/screenshot|capture|ecran/', $m)) $ai_result = ["type"=>"screenshot","cmd"=>"screenshot","label"=>"Screenshot"];
elseif (preg_match('/sysinfo|system|config/', $m)) $ai_result = ["type"=>"sysinfo","cmd"=>"sysinfo","label"=>"System Info"];
elseif (preg_match('/process|cpu|top/', $m)) $ai_result = ["type"=>"powershell","cmd"=>"Get-Process|Sort CPU -Desc|Select -First 15 Name,CPU,WS|FT","label"=>"Processes"];
elseif (preg_match('/disque|disk|espace/', $m)) $ai_result = ["type"=>"powershell","cmd"=>'Get-PSDrive C,D,E -EA 0|FT Name,Free,Used',"label"=>"Disk"];
elseif (preg_match('/nettoie|clean|temp/', $m)) $ai_result = ["type"=>"powershell","cmd"=>'Remove-Item $env:TEMP\* -Recurse -Force -EA 0;"Done"',"label"=>"Cleanup"];
elseif (preg_match('/git pull/', $m)) $ai_result = ["type"=>"git_pull","cmd"=>'C:\Users\Yace\Desktop\CLAUDE\weval-consulting',"label"=>"Git Pull"];
elseif (preg_match('/git push/', $m)) $ai_result = ["type"=>"git_push","cmd"=>'C:\Users\Yace\Desktop\CLAUDE\weval-consulting',"label"=>"Git Push"];
elseif (preg_match('/^ouvre |^open /i', $m)) {
$url = preg_replace('/^(ouvre|open)\s+/i', '', $msg);
$map = ["weval"=>"https://weval-consulting.com","arsenal"=>"https://weval-consulting.com/arsenal-proxy/ceo-dashboard.html","crm"=>"https://crm.weval-consulting.com","wevia"=>"https://weval-consulting.com/wevia","analytics"=>"https://analytics.weval-consulting.com","n8n"=>"https://n8n.weval-consulting.com","deerflow"=>"https://deerflow.weval-consulting.com","wevads"=>"https://weval-consulting.com/wevads-ia/","github"=>"https://github.com/Yacineutt"];
foreach ($map as $k=>$v) { if (stripos($url,$k)!==false) { $url=$v; break; } }
$ai_result = ["type"=>preg_match('/^https?:/',$url)?"open_url":"open_app","cmd"=>$url,"label"=>"Open ".substr($url,0,40)];
}
elseif (preg_match('/^ps:|^powershell:/i', $m)) {
$cmd = preg_replace('/^(ps|powershell):\s*/i', '', $msg);
$ai_result = ["type"=>"powershell","cmd"=>$cmd,"label"=>"PS: ".substr($cmd,0,40)];
}
elseif (preg_match('/notif|rappel/', $m)) $ai_result = ["type"=>"notify","cmd"=>preg_replace('/^(notif|rappel)\s*/i','',$msg)?:$msg,"label"=>"Notify"];
elseif (preg_match('/ferme|kill/', $m)) {
$app = preg_replace('/^(ferme|kill)\s+/i', '', $msg);
$ai_result = ["type"=>"powershell","cmd"=>"Stop-Process -Name \"$app\" -Force -EA 0;\"Killed\"","label"=>"Kill $app"];
}
elseif (preg_match('/batterie|battery/', $m)) $ai_result = ["type"=>"powershell","cmd"=>"Get-CimInstance Win32_Battery|FT","label"=>"Battery"];
elseif (preg_match('/wifi/', $m)) $ai_result = ["type"=>"powershell","cmd"=>"netsh wlan show interfaces","label"=>"WiFi"];
else $ai_result = ["type"=>"powershell","cmd"=>$msg,"label"=>mb_substr($msg,0,50)];
$provider_used = "keyword";
}
if (isset($ai_result["type"])) $ai_result = [$ai_result];
echo json_encode(["ok"=>true,"provider"=>$provider_used,"tasks"=>$ai_result,"cascade"=>"GLM5>WEVIA>Alibaba>Claude(complex)>Keyword","complex"=>$is_complex]);