670 lines
40 KiB
PHP
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]); |