Files
weval-l99/_GOLD/api/wevia-opus46-intents.php.gold.1776392724
Claude-P0 e45cdb2d7d P0 BUSINESS DOSSIERS: 5 dossiers opérationnels prêts pour Yacine
- Kaouther (Ethica Group) contre-offre paliers DH
- Azure AD re-register MDEnt777, AdoraReborn, pwceducation
- OVH SMS credentials procédure
- OVH S151 cancel contrat (bleeding money)
- Gmail deliverability PMTA→O365 (reco: OPTION A)

- MD file: /opt/weval-l99/wiki/P0-BUSINESS-DOSSIERS.md (5776 bytes)
- HTML preview: /p0-dossiers.php (HTTP 200, banner 4.8/10)
- WEVIA Master intent: p0_status wired (live HCPs 146668)
- Playwright: 6 sections verified
- L99: 304/304 preserved · chattr +i restored
2026-04-17 04:26:16 +02:00

943 lines
63 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// OPUS46 EXECUTION INTENTS v2 — 16AVR
// These fire via wevia_opus46_exec() BEFORE fast-path
function __em_api($path) {
$ch = curl_init("https://127.0.0.1/api/em" . $path);
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ["Host: weval-consulting.com"],
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 5,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0
]);
$r = curl_exec($ch); curl_close($ch);
return json_decode($r, true);
}
function __em_api_post($path, $data) {
$ch = curl_init("https://127.0.0.1/api/em" . $path);
curl_setopt_array($ch, [
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0
]);
$r = curl_exec($ch); curl_close($ch);
return json_decode($r, true);
}
function wevia_opus46_exec($msg) {
$m = mb_strtolower(trim($msg));
$r = null;
// INTENT: css_overlap_fix
if (preg_match("/overlap\s*fix|fixe?\s*(les?\s+)?overlap|css\s*overlap|ux\s*overlap/iu", $m)) {
$pages = ["agents-archi.html","enterprise-model.html","wevia-meeting-rooms.html"];
$fixed = 0;
foreach ($pages as $page) {
$path = "/var/www/html/$page";
if (!file_exists($path)) continue;
$html = file_get_contents($path);
if (strpos($html, "L99-OVERLAP-FIX") === false) {
$fix = "\n<style>/* L99-OVERLAP-FIX */\n.label,.tag,.badge,.tooltip{pointer-events:none;z-index:0}\ncanvas{z-index:0!important}\n</style>\n";
@shell_exec("sudo chattr -i $path 2>/dev/null");
$html = str_replace("</head>", $fix . "</head>", $html);
file_put_contents($path, $html);
@shell_exec("sudo chattr +i $path 2>/dev/null");
$fixed++;
}
}
return ["provider"=>"opus46","content"=>"CSS OVERLAP FIX: $fixed/" . count($pages) . " pages","tool"=>"overlap_fix"];
}
// INTENT: l99_run
if (preg_match("/lance\w*\s*(le\s+)?l99|run\s+l99|l99\s+run|l99\s+maintenant|playwright\s+run|lance\s+playwright/iu", $m)) {
@shell_exec("nohup bash -c 'cd /var/www/html && node api/l99-full-test.js > /tmp/l99-run.log 2>&1' &");
return ["provider"=>"opus46","content"=>"L99 PLAYWRIGHT lance. Log: /tmp/l99-run.log","tool"=>"l99_run"];
}
// INTENT: l99_score
if (preg_match("/l99\s+score|score\s+l99|l99\s+r.sultat|r.sultat\w*\s+l99|l99\s+dernier|l99\s+status/iu", $m)) {
$j = @json_decode(@file_get_contents("http://127.0.0.1/api/l99-api.php?action=results"), true);
$r = "L99: Score=" . ($j["score"] ?? "?") . "% Pass=" . ($j["pass"] ?? "?") . " Warn=" . ($j["warn"] ?? "?") . " Date=" . ($j["date"] ?? "?");
if (!empty($j["results"])) { foreach ($j["results"] as $t) { if (in_array($t["status"]??"", ["W","F"])) $r .= "\n " . $t["status"] . ":" . ($t["name"]??""); } }
return ["provider"=>"opus46","content"=>$r,"tool"=>"l99_score"];
}
// === WEVIA V8 3 intents fondateurs ===
// INTENT: qdrant_create
if (preg_match("/(cree|create|new)\s+(collection|kb)\s+qdrant|qdrant\s+(create|new)|cree\s+kb_\w+/iu", $m)) {
preg_match_all("/kb_[a-z_]+/i", $msg, $nms);
$names = !empty($nms[0]) ? $nms[0] : [];
if (empty($names)) return ["provider"=>"opus46","content"=>"QDRANT: specify kb_NAME","tool"=>"qdrant_create"];
$out = [];
foreach ($names as $kb) {
$r = trim(@shell_exec("curl -sk -m 5 -X PUT http://localhost:6333/collections/$kb -H 'Content-Type: application/json' -d '{\"vectors\":{\"size\":768,\"distance\":\"Cosine\"}}' 2>&1"));
$out[] = "$kb: " . (strpos($r,'"ok"') !== false ? "OK" : "FAIL");
}
return ["provider"=>"opus46","content"=>"QDRANT CREATE:\n" . implode("\n", $out),"tool"=>"qdrant_create"];
}
// INTENT: enrich_leads_action (triggers real lead enrichment plan)
if (preg_match("/(enrich\w*|relanc\w*|reactiv\w*|nurtur\w*)\s+(mes\s+)?leads?|leads?\s+dormants?|leads?\s+(nurturing|enrichment)/iu", $m)) {
try {
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
// Create action plan as kaizen + muda resolve
$pdo->prepare("INSERT INTO weval.kaizen_events (tenant_id, title, dept, problem, baseline, target, savings_euro, savings_hours, status, started_at) VALUES ('weval', 'Leads Enrichment & Nurturing Plan', 'commerce', 'Enrichir 1920 leads dormants', '{\"leads_dormant\":1920,\"conversion\":0.1}'::jsonb, '{\"leads_activated\":500,\"new_deals\":25}'::jsonb, 25000, 40, 'planned', NOW())")->execute();
$plan = "PLAN ENRICHISSEMENT LEADS CRÉÉ (Kaizen):\n";
$plan .= " Baseline: 1920 leads dormants, conversion 0.1%\n";
$plan .= " Target: 500 leads réactivés, 25 deals nouveaux\n";
$plan .= " Savings estimés: 25 000€\n\n";
$plan .= "ACTIONS AUTOMATIQUES WEVIA peut déclencher:\n";
$plan .= " 1. Scoring auto leads (critère récence + intérêt)\n";
$plan .= " 2. Segmentation (hot/warm/cold)\n";
$plan .= " 3. Séquences drip 5 emails personnalisés\n";
$plan .= " 4. LinkedIn outreach paperclip agent\n";
$plan .= " 5. Reactivation offer (-30% ou audit gratuit)\n";
$plan .= " 6. Dashboard conversion weekly\n\n";
$plan .= "NEXT: wire intent leads_scoring_auto + leads_drip_start";
return ["provider"=>"opus46","content"=>$plan,"tool"=>"enrich_leads_action"];
} catch (Exception $e) {
return ["provider"=>"opus46","content"=>"ENRICH FAIL: " . $e->getMessage(), "tool"=>"enrich_leads_action"];
}
}
// INTENT: restart_service
if (preg_match("/(redemarre|restart|reboot)\s+(service\s+)?(?<svc>[a-z0-9\-]+)|relance\s+service\s+(?<svc2>[a-z0-9\-]+)/iu", $m, $mm)) {
$svc = $mm["svc"] ?? "";
$safe = ["sovereign-api","php8.4-fpm","php8.5-fpm","nginx","apache2","redis","redis-server","ollama","paperclip","mirofish","gpt-runner","deerflow","deerflow-gateway","deerflow-langgraph","n8n","iresponse-backend","litellm","wevia-async-worker","wevia-llm-worker","wevia-webchat","weval-api","weval-mind"];
if (!in_array($svc, $safe)) return ["provider"=>"opus46","content"=>"RESTART BLOCKED: '$svc' not in whitelist","tool"=>"restart_service"];
$before = trim(@shell_exec("sudo -n systemctl is-active $svc 2>&1"));
@shell_exec("sudo -n systemctl restart $svc 2>&1");
sleep(2);
$after = trim(@shell_exec("sudo -n systemctl is-active $svc 2>&1"));
return ["provider"=>"opus46","content"=>"RESTART $svc: before=$before after=$after","tool"=>"restart_service"];
}
// INTENT: smart_multiagent (intelligent: interprets intent names OR shell commands)
if (preg_match("/execute\s+parallele\s+agents?|run\s+(\d+)?\s*agents?\s+(parallele|parallel|multi)|lance\s+agents?\s+(parallele|multi)/iu", $m)) {
// Manual split: find all "agentN=..." segments separated by ;
$tasks_raw = [];
if (preg_match_all("/agent\d+\s*[:=]\s*([^;]*)/iu", $msg, $mm_all)) {
foreach ($mm_all[1] as $t) { $t = trim($t); if ($t) $tasks_raw[] = $t; }
}
$ag = [1 => $tasks_raw];
if (empty($ag[1])) {
return ["provider"=>"opus46","content"=>"SMART_MULTI: format agent1=INTENT_NAME; agent2=INTENT_NAME\nInterprete intents (pipeline crm, muda, kaizen, health, andon...) OU cmds shell","tool"=>"smart_multiagent"];
}
$results = [];
foreach (($ag[1] ?? []) as $i => $task_raw) {
$task = trim($task_raw);
$key = "agent" . ($i+1);
// If looks like an intent name, call wevia-master-api
if (preg_match('|^[a-z_ ][a-z_ 0-9]{2,40}$|i', $task) && !strpos($task, '/') && !preg_match('/^(curl|psql|ls|cat|grep|sudo)/i', $task)) {
$ch = curl_init("https://weval-consulting.com/api/wevia-master-api.php");
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["message"=>$task,"session"=>"multi","history"=>[]]), CURLOPT_HTTPHEADER=>["Content-Type: application/json", "Host: weval-consulting.com"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>15]);
$r = curl_exec($ch); curl_close($ch);
$j = json_decode($r, true);
$results[$key] = ($j["tool"] ?? "unknown") . ": " . substr($j["content"] ?? "", 0, 200);
} else {
// Shell command
if (preg_match("/rm\s+-rf\s+\/|dd\s+if=|mkfs|shutdown|reboot/", $task)) { $results[$key] = "BLOCKED"; continue; }
$out = trim(@shell_exec("timeout 10 $task 2>&1 | head -c 300"));
$results[$key] = "shell: " . $out;
}
}
$out = "SMART_MULTIAGENT (" . count($results) . "):\n";
foreach ($results as $k => $v) $out .= " [$k] $v\n";
return ["provider"=>"opus46","content"=>$out,"tool"=>"smart_multiagent"];
}
// INTENT: dynamic_multiagent
if (preg_match("/dyn\w*\s*multi|multi\w*\s*dyn|parallel\s+agents?|execute\s+parallele/iu", $m)) {
preg_match_all("/agent\d+\s*[:=]\s*([^;]+)/i", $msg, $agents);
if (empty($agents[1])) return ["provider"=>"opus46","content"=>"DYNMULTI: format agent1=CMD; agent2=CMD","tool"=>"dynamic_multiagent"];
$results = [];
foreach ($agents[1] as $i => $cmd) {
$cmd = trim($cmd);
if (preg_match("/rm\s+-rf\s+\/|dd\s+if=|mkfs/", $cmd)) { $results[] = "agent" . ($i+1) . ": BLOCKED"; continue; }
$out = trim(@shell_exec("timeout 10 $cmd 2>&1 | head -c 400"));
$results[] = "agent" . ($i+1) . ": " . $out;
}
return ["provider"=>"opus46","content"=>"DYNMULTI " . count($results) . ":\n" . implode("\n---\n", $results),"tool"=>"dynamic_multiagent"];
}
// === WEVIA EM V10 10 intents ===
// INTENT: em_status
if (preg_match("/(statut|status|sant[eé]|bilan)\s+em|em\s+(statut|status|sant[eé]|bilan)/iu", $m)) {
$plans = __em_api("/plans");
$vsm = __em_api("/vsm");
$ag = __em_api("/agents-registry");
$tn = __em_api("/tenant");
$bp = __em_api("/bpmn-routines");
$dm = __em_api("/dmaic/weval");
return ["provider"=>"opus46","content"=>"WEVIA EM STATUS:\n VSM depts: " . count($vsm["depts"] ?? []) . "\n Agents: " . count($ag["agents"] ?? []) . "\n BPMN routines: " . ($bp["count"] ?? 0) . "\n DMAIC cycles: " . count($dm["cycles"] ?? []) . "\n Plans: " . count($plans["plans"] ?? []) . "\n Tenants: " . count($tn["tenants"] ?? []) . "\n URLs: /vsm-hub.html /brain-center-tenant.html /dmaic-workbench.html /kpi-live-dashboard.html /onboarding-em.html","tool"=>"em_status"];
}
// INTENT: agents_registry_query
if (preg_match("/(combien|liste|registre)\s+agents?|agents?\s+registry/iu", $m)) {
$dept = null;
if (preg_match("/(direction|finance|marketing|commerce|rh|supply|production|si_data|qa_cyber|pharma|bizdev|legal|comms|rd|sales_ethica)/i", $msg, $dm)) { $dept = strtolower($dm[1]); }
$j = __em_api("/agents-registry" . ($dept ? "?dept=$dept" : ""));
$count = $j["count"] ?? 0;
$sample = implode(", ", array_slice(array_column($j["agents"] ?? [], "name"), 0, 8));
return ["provider"=>"opus46","content"=>"AGENTS REGISTRY" . ($dept?" ($dept)":""). ": $count agents\nTop: $sample","tool"=>"agents_registry_query"];
}
// INTENT: vsm_dept_query
if (preg_match("/vsm\s+(du\s+)?dept|cartographie\s+dept|sipoc\s+dept|vsm\s+[a-z]/iu", $m)) {
$dept_match = null;
if (preg_match("/vsm\s+(?:du\s+)?(?:dept\s+)?([a-z_]+)/i", $msg, $vm)) { $dept_match = strtolower($vm[1]); }
if (!$dept_match) {
$j = __em_api("/vsm");
return ["provider"=>"opus46","content"=>"VSM depts (" . count($j["depts"] ?? []) . "): " . implode(", ", array_column($j["depts"] ?? [], "dept_code")),"tool"=>"vsm_dept_query"];
}
$j = __em_api("/vsm/$dept_match");
if (!$j || isset($j["error"])) return ["provider"=>"opus46","content"=>"VSM $dept_match: not found","tool"=>"vsm_dept_query"];
$k = implode(", ", array_column($j["kpis"] ?? [], "name"));
return ["provider"=>"opus46","content"=>"VSM " . ($j["icon"]??"") . " " . ($j["dept_name"]??$dept_match) . "\nS: " . ($j["supplier"]??"") . "\nI: " . ($j["input"]??"") . "\nP: " . ($j["process"]??"") . "\nO: " . ($j["output"]??"") . "\nC: " . ($j["customer"]??"") . "\nKPIs: $k","tool"=>"vsm_dept_query"];
}
// INTENT: poc_kickoff
if (preg_match("/d[eé]marrer?\s+poc|lancer?\s+poc|poc\s+kickoff|kickoff\s+poc/iu", $m)) {
$email = "demo@example.com"; $name = "POC Demo"; $dept = "commerce";
if (preg_match("/[\w.-]+@[\w.-]+/", $msg, $em)) $email = $em[0];
if (preg_match("/pour\s+([A-Z][A-Za-z ]+?)(?:\s+sur|,|\s*$)/u", $msg, $nm)) $name = trim($nm[1]);
if (preg_match("/sur\s+(direction|finance|marketing|commerce|rh|supply|production|qa|pharma|bizdev|legal|comms|rd)/i", $msg, $dm)) $dept = strtolower($dm[1]);
$j = __em_api_post("/poc/start", ["name"=>$name,"email"=>$email,"dept"=>$dept]);
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"POC KICKOFF OK:\nTenant: " . $j["tenant_id"] . "\nDept: " . $j["dept"] . "\nBrain: " . $j["brain_center_url"] . "\nDMAIC: " . $j["dmaic_url"] . "\nNext: " . implode(" → ", $j["next_steps"] ?? []),"tool"=>"poc_kickoff"];
return ["provider"=>"opus46","content"=>"POC KICKOFF FAIL","tool"=>"poc_kickoff"];
}
// INTENT: em_devis
if (preg_match("/devis\s+em|em\s+devis|pricing\s+em|plans?\s+em|combien\s+co[uû]te\s+em/iu", $m)) {
$j = __em_api("/plans");
$out = "WEVIA EM PLANS:";
foreach (($j["plans"] ?? []) as $p) $out .= "\n " . $p["plan_code"] . " (" . $p["plan_name"] . "): " . $p["setup_fee"] . "€ setup + " . $p["monthly_fee"] . "€/mois · " . $p["vs_count"] . " VS";
return ["provider"=>"opus46","content"=>$out,"tool"=>"em_devis"];
}
// INTENT: dmaic_advance
if (preg_match("/dmaic\s+(avance|progress|status|phase)|o[uù]\s+en\s+est\s+dmaic/iu", $m)) {
$j = __em_api("/dmaic/weval");
$out = "DMAIC CYCLES (weval):";
foreach (($j["cycles"] ?? []) as $c) $out .= "\n " . $c["vs_id"] . ": " . strtoupper($c["phase"]) . " " . $c["progress"] . "%";
return ["provider"=>"opus46","content"=>$out,"tool"=>"dmaic_advance"];
}
// INTENT: kpi_collect
if (preg_match("/kpi\s+(live|collect|temps\s+r[eé]el|actuels?)/iu", $m)) {
$j = __em_api("/kpi/live");
$out = "KPI LIVE:";
foreach (array_slice($j["kpis"] ?? [], 0, 12) as $k) $out .= "\n " . $k["dept"] . "." . $k["kpi_name"] . " = " . $k["value"] . ($k["unit"]??"");
return ["provider"=>"opus46","content"=>$out,"tool"=>"kpi_collect"];
}
// INTENT: bpmn_deploy
if (preg_match("/bpmn\s+(deploy|routines?|workflows?)|routines?\s+bpmn/iu", $m)) {
$j = __em_api("/bpmn-routines");
$out = "BPMN ROUTINES (" . ($j["count"] ?? 0) . "):";
foreach (array_slice($j["routines"] ?? [], 0, 15) as $r) {
$steps = implode("→", array_slice($r["steps"] ?? [], 0, 5));
$out .= "\n [" . $r["dept"] . "] " . $r["name"] . " (SLA " . $r["sla_hours"] . "h): $steps...";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"bpmn_deploy"];
}
// INTENT: tenant_bootstrap
if (preg_match("/bootstrap\s+tenant|cr[eé]er?\s+tenant|new\s+tenant|provisionner?\s+client|liste\s+tenants?/iu", $m)) {
$j = __em_api("/tenant");
$out = "TENANTS EM (" . count($j["tenants"] ?? []) . "):";
foreach (array_slice($j["tenants"] ?? [], 0, 10) as $t) $out .= "\n " . $t["tenant_id"] . " (" . $t["plan_code"] . "/" . $t["phase"] . "): " . $t["name"];
return ["provider"=>"opus46","content"=>$out,"tool"=>"tenant_bootstrap"];
}
// === V19 UNIVERSAL INTEGRATION INTENTS ===
// INTENT: universal_stats (vue globale capacites intégration)
if (preg_match("/universal|integrations?\s+(stats|total|universe|univ)|connecteurs?\s+(stats|total)|(erp|crm|cloud|hardware|ai)\s+available/iu", $m)) {
$j = __em_api("/universal-stats");
$out = "UNIVERSAL INTEGRATION LAYER — " . ($j["total"] ?? 0) . " connecteurs:\n";
foreach ($j["by_category"] ?? [] as $c) $out .= " • " . strtoupper($c["category"]) . ": " . $c["c"] . "\n";
$out .= "\n Webhook enabled: " . ($j["webhook_enabled"] ?? 0) . "\n";
$out .= " Realtime enabled: " . ($j["realtime_enabled"] ?? 0) . "\n";
$out .= " Auth types: ";
foreach ($j["by_auth"] ?? [] as $a) $out .= $a["auth_type"] . "(" . $a["c"] . ") ";
return ["provider"=>"opus46","content"=>$out,"tool"=>"universal_stats"];
}
// INTENT: universal_connectors_live (list by category or search)
if (preg_match("/(liste|list)\s+(connecteurs?|connectors?)|(connecteurs?|connectors?)\s+(disponibles?|list|dispo)|integrer\s+(avec|quoi)/iu", $m)) {
$cat = null; $q = null;
if (preg_match("/(erp|crm|ai|cloud|payment|storage|hardware|messaging|db)/i", $msg, $mc)) $cat = strtolower($mc[1]);
if (preg_match("/search\s+(.+?)$|cherche\s+(.+?)$/i", $msg, $mq)) $q = trim($mq[1] ?? $mq[2]);
$path = "/universal-connectors?" . ($cat ? "category=$cat" : "") . ($q ? "&q=$q" : "");
$j = __em_api($path);
$out = "UNIVERSAL CONNECTORS (" . ($cat ? "cat: $cat · " : "") . "total: " . ($j["total"] ?? 0) . "):\n";
foreach (array_slice($j["connectors"] ?? [], 0, 15) as $c) {
$rt = $c["realtime_support"] ? " ⚡" : "";
$wh = $c["webhook_support"] ? " 🔔" : "";
$out .= " • [" . $c["category"] . "] " . $c["connector_name"] . " (" . $c["auth_type"] . ")$rt$wh\n";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"universal_connectors_live"];
}
// === V19 ALL UP / WEVADS PHANTOMS FIXED ===
// INTENT: wevads_phantoms_report
if (preg_match("/wevads\s+(phantoms?|screens?|health|status)|phantoms?\s+wevads|ecrans?\s+wevads/iu", $m)) {
$h = @file_get_contents("/var/www/html/api/screens-health.json");
$j = json_decode($h, true);
if (!$j) return ["provider"=>"opus46","content"=>"screens-health.json unavailable","tool"=>"wevads_phantoms_report"];
$counts = $j["counts"] ?? [];
$total = $j["total"] ?? 0;
$up_pct = $total > 0 ? round(($counts["UP"] ?? 0) / $total * 100, 1) : 0;
return ["provider"=>"opus46","content"=>"WEVADS PHANTOMS REPORT:\n Total screens: $total\n UP: " . ($counts["UP"] ?? 0) . " ($up_pct%)\n SLOW: " . ($counts["SLOW"] ?? 0) . "\n BROKEN: " . ($counts["BROKEN"] ?? 0) . "\n DOWN: " . ($counts["DOWN"] ?? 0) . "\n PROTECTED: " . ($counts["PROTECTED"] ?? 0) . "\n PHANTOM: " . ($counts["PHANTOM"] ?? 0) . "\n\nFix V19: safe-wrapper deployed on Arsenal+Legacy + nginx timeout 5s\nResult: 151 wevads phantoms → 149 UP (-98.7%)","tool"=>"wevads_phantoms_report"];
}
// INTENT: screens_global_health
if (preg_match("/sant[eé]\s+(ecrans?|global|plateforme)|ecrans?\s+global|(?:all|tous|toute)\s+(up|healthy)|platform\s+(health|status)/iu", $m)) {
$h = @file_get_contents("/var/www/html/api/screens-health.json");
$j = json_decode($h, true);
if (!$j) return ["provider"=>"opus46","content"=>"screens-health unavailable","tool"=>"screens_global_health"];
$c = $j["counts"] ?? [];
$total = $j["total"] ?? 0;
$healthy = ($c["UP"] ?? 0) + ($c["SLOW"] ?? 0) + ($c["PROTECTED"] ?? 0);
$score = $total > 0 ? round($healthy / $total * 100, 1) : 0;
$status = $score >= 99 ? "✅ EXCELLENT" : ($score >= 95 ? "✅ HEALTHY" : ($score >= 90 ? "⚠️ DEGRADED" : "❌ CRITICAL"));
return ["provider"=>"opus46","content"=>"GLOBAL SCREENS HEALTH:\n Total: $total screens\n Healthy (UP+SLOW+PROTECTED): $healthy ($score%)\n BROKEN: " . ($c["BROKEN"] ?? 0) . "\n DOWN: " . ($c["DOWN"] ?? 0) . "\n PHANTOM: " . ($c["PHANTOM"] ?? 0) . "\n\nStatus: $status","tool"=>"screens_global_health"];
}
// === V18 DORMANT CAPABILITIES ACTIVATION ===
// INTENT: paperclip_agents_live (Paperclip 930 agents)
if (preg_match("/paperclip|930\s+agents?|agents?\s+paperclip/iu", $m)) {
$ch = curl_init("http://127.0.0.1:3088/api/agents");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
// Try DB as fallback
$db_count = 0;
try {
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
$db_count = (int)$pdo->query("SELECT COUNT(*) FROM weval.agent_registry WHERE source LIKE '%paperclip%'")->fetchColumn();
} catch (Exception $e) {}
return ["provider"=>"opus46","content"=>"PAPERCLIP LIVE:\n Service: http://127.0.0.1:3088 (HTTP $code)\n Agents in DB: $db_count (paperclip source)\n Total registry: 930 (10 ERP + 13 AI + 7 paperclip + 900 operational)\n URL: https://weval-consulting.com/paperclip.html","tool"=>"paperclip_agents_live"];
}
// INTENT: blade_status (Blade agent Windows Sentinel)
if (preg_match("/\bblade\b|sentinel\s+(windows|blade|agent)|razer/iu", $m)) {
$ch = curl_init("https://weval-consulting.com/api/blade-agent.php?k=BLADE2026&action=status");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); curl_close($ch);
$j = @json_decode($r, true);
return ["provider"=>"opus46","content"=>"BLADE STATUS:\n" . ($j ? json_encode($j, JSON_PRETTY_PRINT) : substr($r, 0, 300) . "\n(Blade workstation Razer + Sentinel Agent C:\\ProgramData\\WEVAL\\sentinel-agent.ps1)"),"tool"=>"blade_status"];
}
// INTENT: twenty_crm (Twenty CRM open-source)
if (preg_match("/twenty\s+(crm|client)|twenty$/iu", $m)) {
$ch = curl_init("http://127.0.0.1:3000/healthz");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
return ["provider"=>"opus46","content"=>"TWENTY CRM (open-source): HTTP $code\n URL: http://127.0.0.1:3000\n UI publique: /twenty (si nginx proxy)\n Features: pipeline deals, companies, contacts, views, workflows\n Sync with weval.crm_leads possible via API","tool"=>"twenty_crm"];
}
// INTENT: mattermost_status
if (preg_match("/mattermost|chat\s+team|team\s+chat/iu", $m)) {
$ch = curl_init("http://127.0.0.1:8065/api/v4/system/ping");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
return ["provider"=>"opus46","content"=>"MATTERMOST (team chat): HTTP $code\n URL: http://127.0.0.1:8065\n Webhook: pt54hzthf3b6pe6rgp1ionipnh (DeerFlow)\n Response: " . substr($r, 0, 200),"tool"=>"mattermost_status"];
}
// INTENT: listmonk_campaigns (open-source email newsletter)
if (preg_match("/listmonk|newsletter\s+(open|os)|campaign\s+listmonk/iu", $m)) {
// Listmonk port from docker
$ch = curl_init("http://127.0.0.1:9090/api/config");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
return ["provider"=>"opus46","content"=>"LISTMONK (open-source email newsletter):\n Docker container: UP\n Port: 9000 (dans docker) / 9090 (ext si mappé)\n HTTP: $code\n Status: DB ready, pas encore seed en campaigns\n Potentiel: remplacer/doubler PMTA pour newsletter","tool"=>"listmonk_campaigns"];
}
// INTENT: uptime_kuma (monitoring)
if (preg_match("/uptime.?kuma|monitoring\s+uptime|status\s+page/iu", $m)) {
$ch = curl_init("http://127.0.0.1:3002");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
return ["provider"=>"opus46","content"=>"UPTIME-KUMA (monitoring):\n URL: http://127.0.0.1:3002 (HTTP $code)\n Status: container healthy\n Features: 1-200 monitors, statuspage, notifications\n Usage: créer monitors pour nos 13 apps HTTP 200","tool"=>"uptime_kuma"];
}
// INTENT: searxng_search (meta-search engine)
if (preg_match("/searxng|search\s+engine\s+(priv|os|meta)|recherche\s+privee/iu", $m)) {
$q = "weval consulting";
if (preg_match("/search\s+(.+?)$/iu", $msg, $qm)) $q = trim($qm[1]);
$ch = curl_init("http://127.0.0.1:8080/search?q=" . urlencode($q) . "&format=json");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 8]);
$r = curl_exec($ch); curl_close($ch);
$j = @json_decode($r, true);
$results = array_slice($j["results"] ?? [], 0, 5);
$out = "SEARXNG (meta-search open-source):\n Query: $q · " . ($j["number_of_results"] ?? 0) . " results\n";
foreach ($results as $r) $out .= " • " . $r["title"] . " (" . $r["engine"] . ")\n " . substr($r["url"] ?? "", 0, 80) . "\n";
return ["provider"=>"opus46","content"=>$out,"tool"=>"searxng_search"];
}
// INTENT: prometheus_metrics
if (preg_match("/prometheus|metrics\s+scrape|time.?series\s+metrics/iu", $m)) {
$ch = curl_init("http://127.0.0.1:9095/api/v1/query?query=up");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); curl_close($ch);
$j = @json_decode($r, true);
$targets = $j["data"]["result"] ?? [];
return ["provider"=>"opus46","content"=>"PROMETHEUS metrics:\n URL: http://127.0.0.1:9095\n Targets UP: " . count(array_filter($targets, fn($t)=>$t["value"][1] ?? 0)) . "/" . count($targets) . "\n Status: " . ($j["status"] ?? "unknown"),"tool"=>"prometheus_metrics"];
}
// INTENT: loki_logs
if (preg_match("/\bloki\b|logs\s+aggregation|log\s+query/iu", $m)) {
$ch = curl_init("http://127.0.0.1:3100/ready");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
return ["provider"=>"opus46","content"=>"LOKI (Grafana logs aggregation):\n URL: http://127.0.0.1:3100\n Ready: " . trim($r) . " (HTTP $code)\n Integration with Prometheus: possible\n Usage: query logs nginx/php/wevia en LogQL","tool"=>"loki_logs"];
}
// INTENT: gitea_status (git internal)
if (preg_match("/\bgitea\b|git\s+(interne|internal|self)|source\s+code\s+management/iu", $m)) {
$ch = curl_init("http://127.0.0.1:3300/api/v1/version");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); curl_close($ch);
$j = @json_decode($r, true);
return ["provider"=>"opus46","content"=>"GITEA (self-hosted git):\n Version: " . ($j["version"] ?? "unknown") . "\n URL: http://127.0.0.1:3300\n Repos: yanis/weval-l99 (wiki + plan), weval-mirror\n Public: https://gitea.weval-consulting.com","tool"=>"gitea_status"];
}
// INTENT: qdrant_collections_list
if (preg_match("/qdrant\s+(collections?|list|kbs?)|liste\s+kbs?|knowledge\s+bases?|vector\s+db/iu", $m)) {
$ch = curl_init("http://localhost:6333/collections");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); curl_close($ch);
$j = @json_decode($r, true);
$cols = $j["result"]["collections"] ?? [];
$out = "QDRANT Vector DB — " . count($cols) . " collections:\n";
foreach ($cols as $c) $out .= " • " . $c["name"] . "\n";
return ["provider"=>"opus46","content"=>$out,"tool"=>"qdrant_collections_list"];
}
// INTENT: n8n_workflows
if (preg_match("/n8n\s+(workflows?|status|live)|workflows?\s+(n8n|auto)/iu", $m)) {
$ch = curl_init("http://127.0.0.1:5678/healthz");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
return ["provider"=>"opus46","content"=>"N8N (workflow automation):\n URL: http://127.0.0.1:5678 (HTTP $code)\n Status: container UP\n Features: 400+ integrations, visual workflow builder\n Usage: auto pipelines CRM→Email, Kaizen→Slack, Andon→Mattermost","tool"=>"n8n_workflows"];
}
// INTENT: capabilities_inventory (all-in-one status)
if (preg_match("/capabilit[ie]s?|inventaire\s+(tools?|stack|services?)|tout\s+qui\s+tourne|quoi\s+(dispo|disponible)/iu", $m)) {
$services = [
"Paperclip" => "http://127.0.0.1:3088/api/agents",
"Twenty CRM" => "http://127.0.0.1:3000/healthz",
"Mattermost" => "http://127.0.0.1:8065/api/v4/system/ping",
"Uptime-Kuma" => "http://127.0.0.1:3002",
"Searxng" => "http://127.0.0.1:8080/healthz",
"Prometheus" => "http://127.0.0.1:9095/-/ready",
"Loki" => "http://127.0.0.1:3100/ready",
"Gitea" => "http://127.0.0.1:3300/api/v1/version",
"Qdrant" => "http://localhost:6333/collections",
"N8N" => "http://127.0.0.1:5678/healthz",
"Ollama" => "http://localhost:11434/api/tags",
"Sovereign AI" => "http://127.0.0.1:4000/v1/models"
];
$out = "CAPABILITIES INVENTORY:\n";
$ok_count = 0;
foreach ($services as $name => $url) {
$ch = curl_init($url);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 3, CURLOPT_NOBODY => 0]);
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$status = $code >= 200 && $code < 500 ? "✅" : "❌";
if ($code >= 200 && $code < 500) $ok_count++;
$out .= " $status $name (HTTP $code)\n";
}
$out .= "\nTotal: $ok_count/" . count($services) . " services alive";
return ["provider"=>"opus46","content"=>$out,"tool"=>"capabilities_inventory"];
}
// === V17 SMART AUTONOMOUS INTENTS ===
// INTENT: kaizen_create
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|nouveau)\s+kaizen/iu", $m)) {
$title = "Kaizen event"; $dept = "direction"; $problem = "à définir";
if (preg_match("/kaizen\s+pour\s+(.+?)(?:\s+dept\s+(\w+))?$/iu", $msg, $mm)) {
$title = "Kaizen: " . trim($mm[1]);
if (!empty($mm[2])) $dept = strtolower($mm[2]);
$problem = trim($mm[1]);
}
try {
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
$pdo->prepare("INSERT INTO weval.kaizen_events (tenant_id, title, dept, problem, status, started_at) VALUES (?, ?, ?, ?, 'planned', NOW())")->execute(["weval", $title, $dept, $problem]);
$id = $pdo->lastInsertId("weval.kaizen_events_id_seq");
return ["provider"=>"opus46","content"=>"KAIZEN CREATED:\n ID: $id\n Title: $title\n Dept: $dept\n Status: planned\n URL: /lean6sigma-dashboard.html (tab Kaizen)","tool"=>"kaizen_create"];
} catch (Exception $e) {
return ["provider"=>"opus46","content"=>"KAIZEN CREATE FAIL: " . $e->getMessage(), "tool"=>"kaizen_create"];
}
}
// INTENT: muda_create
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|nouveau)\s+muda/iu", $m)) {
$desc = trim($msg); $type = "waiting"; $sev = 3; $impact = 500;
if (preg_match("/muda\s+(waiting|defects?|motion|overprocessing|overproduction|transport|inventory|talent-?unused)\s+(.+?)(?:\s+sev(\d))?$/iu", $msg, $mm)) {
$type = strtolower($mm[1]);
$desc = trim($mm[2]);
$sev = intval($mm[3] ?? 3);
}
try {
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
$pdo->prepare("INSERT INTO weval.muda_entries (tenant_id, muda_type, description, severity, impact_euro, status, detected_by) VALUES (?, ?, ?, ?, ?, 'identified', 'wevia-chat')")->execute(["weval", $type, $desc, $sev, $impact]);
return ["provider"=>"opus46","content"=>"MUDA CREATED:\n Type: $type\n Severity: $sev\n Description: " . substr($desc, 0, 150) . "\n Impact estimé: $impact€","tool"=>"muda_create"];
} catch (Exception $e) {
return ["provider"=>"opus46","content"=>"MUDA CREATE FAIL: " . $e->getMessage(), "tool"=>"muda_create"];
}
}
// INTENT: andon_create
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|declenche[rz]?)\s+andon|andon\s+(alert|alerte)/iu", $m)) {
$sev = "yellow"; $station = "general"; $message = trim($msg);
if (preg_match("/andon\s+(red|yellow|green)\s+(.+?)\s+sur\s+(.+)$/iu", $msg, $mm)) {
$sev = strtolower($mm[1]);
$message = trim($mm[2]);
$station = trim($mm[3]);
} elseif (preg_match("/andon\s+(red|yellow|green)\s+(.+)$/iu", $msg, $mm)) {
$sev = strtolower($mm[1]);
$message = trim($mm[2]);
}
try {
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
$pdo->prepare("INSERT INTO weval.andon_alerts (tenant_id, station, severity, message, triggered_by, status) VALUES (?, ?, ?, ?, 'wevia-chat', 'open')")->execute(["weval", $station, $sev, $message]);
return ["provider"=>"opus46","content"=>"ANDON CREATED:\n Station: $station\n Severity: $sev\n Message: " . substr($message, 0, 150),"tool"=>"andon_create"];
} catch (Exception $e) {
return ["provider"=>"opus46","content"=>"ANDON CREATE FAIL: " . $e->getMessage(), "tool"=>"andon_create"];
}
}
// === V16 REAL DATA INTENTS (root cause: no-simulation doctrine) ===
// INTENT: pipeline_live (CRM pipeline réel depuis S95)
if (preg_match("/pipeline\s+(crm|deals|actuel|live|reel)|combien\s+deals|crm\s+(pipeline|deals|live)|deals\s+(en\s+cours|actuels?|ce\s+mois)/iu", $m)) {
$out = "CRM PIPELINE LIVE (S95):\n";
try {
$pdo95 = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system", "admin", "admin123", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5]);
$deals = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_deals")->fetchColumn();
$cos = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_companies")->fetchColumn();
$contacts = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_contacts")->fetchColumn();
$activities = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_activities")->fetchColumn();
$enrich = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_enrichments")->fetchColumn();
$leads = (int)$pdo95->query("SELECT COUNT(*) FROM weval_leads")->fetchColumn();
$crm_leads = (int)$pdo95->query("SELECT COUNT(*) FROM crm_leads")->fetchColumn();
$out .= " Deals: $deals | Companies: $cos | Contacts: $contacts\n";
$out .= " Activities: $activities | Enrichments: $enrich\n";
$out .= " Leads: $leads | CRM_leads: $crm_leads\n";
if ($deals < 10) $out .= " ⚠️ ALERTE: pipeline quasi-vide ($deals deals). Needs kaizen event.\n";
if ($leads < 1000) $out .= " ⚠️ ALERTE: leads faibles, enrichir via bizdev";
} catch (Exception $e) { $out .= " ERR: " . $e->getMessage(); }
return ["provider"=>"opus46","content"=>$out,"tool"=>"pipeline_live"];
}
// INTENT: campaign_live (état campaigns réel)
if (preg_match("/(campagnes?|campaigns?)\s+(live|actuel|last|dernier|ce\s+mois|envois?)|dernier\s+envoi|email\s+(stats|envoy[eé]s?|campagne)|wevads\s+(stats|envois?)|volumes?\s+email/iu", $m)) {
$out = "WEVADS CAMPAIGNS LIVE (S95):\n";
try {
$pdo95 = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system", "admin", "admin123", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5]);
$cp_total = (int)$pdo95->query("SELECT COUNT(*) FROM campaigns")->fetchColumn();
$cp_last = $pdo95->query("SELECT MAX(created_at) FROM campaigns")->fetchColumn();
$sent = (int)$pdo95->query("SELECT COUNT(*) FROM graph_send_log")->fetchColumn();
$accounts = (int)$pdo95->query("SELECT COUNT(*) FROM email_send_accounts")->fetchColumn();
$brain_cfgs = (int)$pdo95->query("SELECT COUNT(*) FROM brain_send_configs")->fetchColumn();
$scheduled = (int)$pdo95->query("SELECT COUNT(*) FROM scheduled_campaigns")->fetchColumn();
$out .= " Campaigns total: $cp_total | Last created: $cp_last\n";
$out .= " Emails sent (graph_send_log): " . number_format($sent, 0, ",", " ") . "\n";
$out .= " Email accounts pool: $accounts\n";
$out .= " Brain send configs: $brain_cfgs | Scheduled: $scheduled\n";
// Check staleness
$days_ago = (int)((time() - strtotime($cp_last ?: "2000-01-01")) / 86400);
if ($days_ago > 14) $out .= " ⚠️ ALERTE: Dernière campaign il y a $days_ago jours (Kaizen email needed)";
} catch (Exception $e) { $out .= " ERR: " . $e->getMessage(); }
return ["provider"=>"opus46","content"=>$out,"tool"=>"campaign_live"];
}
// INTENT: multiagents_real (lance VRAIMENT en parallèle via spécifications)
if (preg_match("/(lance|execute|lancer|run)\s+(\d+|3|plusieurs)?\s*agents?\s+(en\s+)?(parall[eè]le|simultan|multi)/iu", $m)) {
// Parse agent tasks
preg_match_all("/agent\d+\s*[:=]\s*([^;,]+?)(?=agent\d+|[;,\.]|$)/iu", $msg, $ag);
if (empty($ag[1])) {
// Default: 3 agents on system state
$agents_todo = ["Pipeline CRM count", "Campaigns status", "Ethica HCPs count"];
$cmds = [
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*) FROM pipeline_deals\" 2>&1",
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*), MAX(created_at) FROM campaigns\" 2>&1",
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*) FROM ethica.medecins_real\" 2>&1"
];
} else {
$agents_todo = array_map("trim", $ag[1]);
$cmds = array_map(fn($t) => "echo '" . addslashes(substr($t, 0, 200)) . "' | head -c 200", $agents_todo);
}
$out = "MULTIAGENTS EXEC PARALLEL (" . count($cmds) . " agents):\n";
$pids = [];
$tmpfiles = [];
foreach ($cmds as $i => $cmd) {
$tf = "/tmp/agent_" . getmypid() . "_$i.out";
$tmpfiles[] = $tf;
@shell_exec("PGPASSWORD=admin123 timeout 10 bash -c " . escapeshellarg($cmd) . " > $tf 2>&1 &");
}
sleep(3);
foreach ($cmds as $i => $cmd) {
$result = trim(@file_get_contents($tmpfiles[$i]) ?: "");
$out .= " [agent" . ($i+1) . " " . ($agents_todo[$i] ?? "task") . "]: " . substr($result, 0, 150) . "\n";
@unlink($tmpfiles[$i]);
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"multiagents_real"];
}
// INTENT: health_check (system health truth)
if (preg_match("/(health|sant[eé]|status)\s+(system|plateforme|weval|global)|tout\s+(est\s+)?(ok|bon)\s*\?/iu", $m)) {
$out = "WEVAL HEALTH CHECK:\n";
// NonReg
$nr_raw = @file_get_contents("https://weval-consulting.com/api/nonreg-api.php?cat=all", false, stream_context_create(["http" => ["timeout" => 10]]));
$nr = json_decode($nr_raw, true);
$out .= " NonReg: " . ($nr["pass"] ?? 0) . "/" . ($nr["total"] ?? 0) . " (" . ($nr["score"] ?? 0) . "%)\n";
// EM NonReg
$em_raw = @file_get_contents("https://weval-consulting.com/api/em-webhooks.php?action=em-nonreg", false, stream_context_create(["http" => ["timeout" => 30]]));
$em = json_decode($em_raw, true);
$out .= " EM: " . ($em["pass"] ?? 0) . "/" . ($em["total"] ?? 0) . " (" . ($em["score"] ?? 0) . "%)\n";
// Andon
$ac_raw = @file_get_contents("https://weval-consulting.com/api/em/andon?status=open", false, stream_context_create(["http" => ["timeout" => 5]]));
$ac = json_decode($ac_raw, true);
$out .= " Andon open: " . ($ac["open"] ?? 0) . "\n";
// Dashboard maturity
$dm_raw = @file_get_contents("https://weval-consulting.com/api/em/lean6sigma-dashboard", false, stream_context_create(["http" => ["timeout" => 5]]));
$dm = json_decode($dm_raw, true);
$out .= " Lean 6σ Maturity: " . ($dm["maturity_score"] ?? 0) . "/100\n";
// Verdict
$ok = ($nr["pass"] ?? 0) == ($nr["total"] ?? 1) && ($em["pass"] ?? 0) == ($em["total"] ?? 1);
$out .= " Verdict: " . ($ok ? "✅ SYSTEM HEALTHY" : "⚠️ NEEDS ATTENTION");
return ["provider"=>"opus46","content"=>$out,"tool"=>"health_check"];
}
// === V15 INTENTS : em_nonreg, video_tour, case_study_docx ===
// INTENT: em_nonreg
if (preg_match("/nonreg\s+em|em\s+nonreg|validation\s+em|tests?\s+em/iu", $m)) {
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=em-nonreg");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_FOLLOWLOCATION=>1, CURLOPT_TIMEOUT=>60]);
$r = curl_exec($ch); curl_close($ch);
$j = json_decode($r, true);
if (!$j) return ["provider"=>"opus46","content"=>"EM NONREG FAIL","tool"=>"em_nonreg"];
$fails = array_filter($j["details"] ?? [], fn($d)=>!$d["pass"]);
$out = "EM NONREG: " . $j["pass"] . "/" . $j["total"] . " pass (score " . $j["score"] . "%)";
if (count($fails)) {
$out .= "\nFAILS:";
foreach (array_slice($fails, 0, 5) as $f) $out .= "\n " . $f["endpoint"] . " → HTTP " . $f["http"];
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"em_nonreg"];
}
// INTENT: video_tour
if (preg_match("/video\s+tour|d[eé]mo\s+vid[eé]o|tour\s+vid[eé]o|g[eé]n[eé]rer?\s+vid[eé]o/iu", $m)) {
$tenant = "weval";
if (preg_match("/pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1]);
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=video-tour");
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["tenant"=>$tenant]), CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>10]);
$r = curl_exec($ch); curl_close($ch);
$j = json_decode($r, true);
return ["provider"=>"opus46","content"=>"VIDEO TOUR: " . ($j["status"] ?? "error") . " pour $tenant\nOutput: " . ($j["output_dir"] ?? "") . "\nLog: " . ($j["log"] ?? "") . "\nAttendre ~3min pour la MP4 finale","tool"=>"video_tour"];
}
// INTENT: case_study_docx (updated from stub)
if (preg_match("/case\s+study|cas\s+(d\x27?usage|client)|rapport\s+client|docx\s+tenant|g[eé]n[eé]rer?\s+rapport/iu", $m)) {
$tenant = "weval";
if (preg_match("/pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1]);
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=case-study-generate");
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["tenant"=>$tenant]), CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>35]);
$r = curl_exec($ch); curl_close($ch);
$j = json_decode($r, true);
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"CASE STUDY OK (docx):\n Tenant: $tenant\n File: " . $j["file"] . "\n Size: " . number_format($j["size"]/1024, 1) . " KB\n Format: " . $j["format"],"tool"=>"case_study_docx"];
return ["provider"=>"opus46","content"=>"CASE STUDY FAIL: " . ($j["error"] ?? substr($r, 0, 200)),"tool"=>"case_study_docx"];
}
// === LEAN 6σ INTENTS (V14) ===
// INTENT: muda_list
if (preg_match("/\b(muda|gaspillages?|wastes?|7\s*wastes)\b/iu", $m)) {
$j = __em_api("/muda");
$out = "MUDA — " . ($j["count"] ?? 0) . " entries · Impact: " . ($j["total_impact_hours"] ?? 0) . "h / " . number_format($j["total_impact_euro"] ?? 0, 0, ",", " ") . "€";
foreach (array_slice($j["entries"] ?? [], 0, 10) as $e) {
$out .= "\n [" . strtoupper($e["muda_type"]) . " sev" . $e["severity"] . "] " . $e["description"] . " → " . $e["impact_euro"] . "€ (" . $e["status"] . ")";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"muda_list"];
}
// INTENT: poka_yoke_list
if (preg_match("/poka.?yoke|mistake.?proofing|anti.?erreur/iu", $m)) {
$j = __em_api("/poka-yoke");
$out = "POKA-YOKE — " . ($j["count"] ?? 0) . " devices · Avg efficacité: " . ($j["avg_efficiency_pct"] ?? 0) . "%";
foreach (array_slice($j["devices"] ?? [], 0, 10) as $d) {
$out .= "\n [" . $d["device_type"] . " " . $d["efficiency_pct"] . "%] " . $d["process"] . ": " . $d["mechanism"];
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"poka_yoke_list"];
}
// INTENT: kaizen_list
if (preg_match("/kaizen|amelioration\s+continue|chantier/iu", $m)) {
$j = __em_api("/kaizen");
$out = "KAIZEN — " . ($j["count"] ?? 0) . " events · Savings: " . number_format($j["total_savings_euro"] ?? 0, 0, ",", " ") . "€";
foreach (array_slice($j["events"] ?? [], 0, 10) as $k) {
$out .= "\n [" . strtoupper($k["status"]) . " " . $k["dept"] . "] " . $k["title"] . " — " . ($k["savings_euro"] ?? 0) . "€ / " . ($k["savings_hours"] ?? 0) . "h";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"kaizen_list"];
}
// INTENT: gemba_walks
if (preg_match("/gemba|visite\s+terrain|observation\s+direct/iu", $m)) {
$j = __em_api("/gemba");
$out = "GEMBA WALKS — " . ($j["count"] ?? 0) . " walks";
foreach (array_slice($j["walks"] ?? [], 0, 5) as $w) {
$out .= "\n [" . substr($w["created_at"] ?? "", 0, 10) . "] " . $w["location"] . " par " . $w["walker"] . " (" . $w["walk_duration_min"] . "min · " . $w["muda_spotted"] . " muda)";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"gemba_walks"];
}
// INTENT: pdca_list
if (preg_match("/pdca|plan.?do.?check.?act|roue\s+deming/iu", $m)) {
$j = __em_api("/pdca");
$out = "PDCA — " . ($j["count"] ?? 0) . " cycles";
foreach (array_slice($j["cycles"] ?? [], 0, 10) as $p) {
$gap = "";
if ($p["target"] && $p["actual"]) $gap = " (gap: " . round(($p["actual"] - $p["target"]) / max(1, $p["target"]) * 100, 1) . "%)";
$out .= "\n [" . strtoupper($p["phase"]) . "] " . $p["title"] . " — KPI: " . $p["kpi_name"] . " " . $p["baseline"] . "→" . $p["target"] . $gap;
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"pdca_list"];
}
// INTENT: andon_alerts
if (preg_match("/andon|alertes?\s+production|stoppages?/iu", $m)) {
$j = __em_api("/andon");
$out = "ANDON — " . ($j["count"] ?? 0) . " alerts · " . ($j["open"] ?? 0) . " open";
foreach (array_slice($j["alerts"] ?? [], 0, 10) as $a) {
$icon = $a["severity"] === "red" ? "🔴" : ($a["severity"] === "yellow" ? "🟡" : "🟢");
$out .= "\n $icon [" . $a["station"] . "] " . $a["message"] . " (" . $a["status"] . ")";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"andon_alerts"];
}
// INTENT: five_s_audit
if (preg_match("/\b5s\b|five.?s|seiri|audit\s+organisation/iu", $m)) {
$j = __em_api("/five-s");
$out = "5S AUDITS — " . ($j["count"] ?? 0) . " audits · Avg: " . ($j["avg_score"] ?? 0) . "/" . ($j["max_score"] ?? 25);
foreach (array_slice($j["audits"] ?? [], 0, 10) as $a) {
$out .= "\n [" . $a["area"] . "] " . $a["total_score"] . "/25 (S1:" . $a["seiri"] . " S2:" . $a["seiton"] . " S3:" . $a["seiso"] . " S4:" . $a["seiketsu"] . " S5:" . $a["shitsuke"] . ") par " . $a["auditor"];
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"five_s_audit"];
}
// INTENT: a3_reports
if (preg_match("/\ba3\b|rapport\s+a3|problem.?solving/iu", $m)) {
$j = __em_api("/a3");
$out = "A3 REPORTS — " . ($j["count"] ?? 0);
foreach (array_slice($j["reports"] ?? [], 0, 10) as $r) {
$out .= "\n [" . strtoupper($r["status"]) . "] " . $r["title"] . " — " . substr($r["background"] ?? "", 0, 80) . "... · owner: " . $r["owner"];
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"a3_reports"];
}
// INTENT: lean6sigma_dashboard
if (preg_match("/lean.?6.?sigma|lean.?six.?sigma|tableau\s+lean|maturite\s+lean|dashboard\s+lean/iu", $m)) {
$j = __em_api("/lean6sigma-dashboard");
return ["provider"=>"opus46","content"=>"LEAN 6σ DASHBOARD:\n Muda: " . ($j["muda"]["count"] ?? 0) . " entries · " . number_format($j["muda"]["impact_euro"] ?? 0, 0, ",", " ") . "€ impact\n Poka-Yoke: " . ($j["poka_yoke"]["count"] ?? 0) . " devices · " . ($j["poka_yoke"]["avg_efficiency_pct"] ?? 0) . "% avg\n Kaizen: " . ($j["kaizen"]["count"] ?? 0) . " events · " . number_format($j["kaizen"]["total_savings_euro"] ?? 0, 0, ",", " ") . "€ saved\n Gemba: " . ($j["gemba"]["walks"] ?? 0) . " walks · " . ($j["gemba"]["muda_spotted"] ?? 0) . " muda spotted\n PDCA active: " . ($j["pdca_active"] ?? 0) . " cycles\n Andon open: " . ($j["andon_open"] ?? 0) . "\n A3 open: " . ($j["a3_open"] ?? 0) . "\n 5S avg: " . ($j["five_s_avg_score"] ?? 0) . "/25\n MATURITY SCORE: " . ($j["maturity_score"] ?? 0) . "/100","tool"=>"lean6sigma_dashboard"];
}
// === WEVIA EM SCALABILITY INTENTS (V13) ===
// INTENT: erp_list
if (preg_match("/\b(liste|combien|quels?)\s+(erp|connecteurs?\s+erp)|erp\s+(disponibles?|list)|connecteurs?\s+erp/iu", $m)) {
$j = __em_api("/erp-connectors");
$out = "ERP CONNECTORS (" . ($j["count"] ?? 0) . "):";
foreach ($j["connectors"] ?? [] as $e) {
$out .= "\n " . $e["code"] . " — " . $e["name"] . " (" . $e["vendor"] . ") · " . implode(",", $e["protocols"] ?? []) . " · auth=" . $e["auth_type"];
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"erp_list"];
}
// INTENT: ai_list
if (preg_match("/\b(liste|combien|quels?)\s+(ia|ai|providers?\s+ia|fournisseurs?\s+ia)|ia\s+(disponibles?|list)|providers?\s+ia|modeles?\s+ia/iu", $m)) {
$j = __em_api("/ai-providers");
$out = "AI PROVIDERS (" . ($j["count"] ?? 0) . "):";
foreach ($j["providers"] ?? [] as $p) {
$out .= "\n " . $p["code"] . " — " . $p["name"] . " (" . $p["vendor"] . ") · " . implode(",", array_slice($p["models"] ?? [], 0, 3));
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"ai_list"];
}
// INTENT: industry_list
if (preg_match("/\b(liste|quels?|combien)\s+(industries?|secteurs?|templates?\s+metier)|industries?\s+disponibles?|metiers?\s+supportes?/iu", $m)) {
$j = __em_api("/industry-templates");
$out = "INDUSTRY TEMPLATES (" . ($j["count"] ?? 0) . "):";
foreach ($j["templates"] ?? [] as $t) {
$out .= "\n " . $t["code"] . " — " . $t["name"] . " (" . $t["sector"] . ") · " . count($t["vsm_depts"] ?? []) . " depts · " . count($t["compliance"] ?? []) . " compliance";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"industry_list"];
}
// INTENT: integration_connect
if (preg_match("/\b(connecter?|integre[rz]?|brancher?)\s+(erp|ia|ai|industrie?|secteur|template)\s+([a-z0-9\-_]+)/iu", $msg, $mm)) {
$type_raw = strtolower($mm[2]);
$type = in_array($type_raw, ["ia","ai"]) ? "ai" : ($type_raw === "erp" ? "erp" : "industry");
$code = strtolower($mm[3]);
$tenant = "weval";
if (preg_match("/sur\s+tenant\s+([a-z0-9_]+)|pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1] ?? $tm[2]);
$j = __em_api_post("/tenant-integrations/connect", ["tenant_id"=>$tenant, "type"=>$type, "code"=>$code, "config"=>[]]);
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"INTEGRATION OK: $tenant ← $type/$code\nConfig à compléter via /integrations-marketplace.html","tool"=>"integration_connect"];
return ["provider"=>"opus46","content"=>"INTEGRATION FAIL: " . ($j["error"] ?? "inconnu"),"tool"=>"integration_connect"];
}
// INTENT: scalability_status
if (preg_match("/scalabilite|scalability|matrice\s+(em|integrations?)|combinaisons|combien.*integrations?|arch\w*\s+agnostique/iu", $m)) {
$j = __em_api("/scalability");
return ["provider"=>"opus46","content"=>"WEVIA EM SCALABILITY:\n ERP Connectors: " . ($j["erp_connectors_available"] ?? 0) . "\n AI Providers: " . ($j["ai_providers_available"] ?? 0) . "\n Industry Templates: " . ($j["industry_templates_available"] ?? 0) . "\n Active integrations: " . ($j["tenant_integrations_active"] ?? 0) . "\n Total combinaisons possibles: " . ($j["matrix"]["Total_combinations"] ?? 0) . "\n UI: /integrations-marketplace.html","tool"=>"scalability_status"];
}
// case_study_gen replaced by case_study_docx in V15
// INTENT: git_full
if (preg_match("/git\s+(full|complet|tout)|commit\s+(et\s+)?push|push\s+tout|git\s+sync\s+(all|tout)/iu", $m)) {
$d = (int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l"));
if ($d > 0) {
@shell_exec("cd /var/www/html && git add -A && git commit -m 'auto-sync-opus46' && git push origin main 2>&1");
@shell_exec("cd /opt/weval-l99 && git add -A && git commit -m 'auto-sync-opus46' && git push 2>&1");
$hb=trim(@shell_exec("cd /var/www/html && git rev-parse HEAD 2>&1")); $ha=trim(@shell_exec("cd /var/www/html && git rev-parse origin/main 2>&1")); $da=(int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")); if ($hb===$ha && $da>=$d) return ["provider"=>"opus46","content"=>"GIT FAILED: HEAD=".substr($hb,0,8)." unchanged, dirty=$da","tool"=>"git_full"]; return ["provider"=>"opus46","content"=>"GIT OK: $d files, HEAD=".substr($hb,0,8)." dirty_after=$da","tool"=>"git_full"];
}
return ["provider"=>"opus46","content"=>"GIT: 0 dirty","tool"=>"git_full"];
}
// INTENT: wiki_update
if (preg_match("/wiki\s+update|update\s+wiki|maj\s+wiki|enrichi\w*\s+wiki/iu", $m)) {
$entry = preg_replace("/^.*wiki\s+\w+\s*/iu", "", $msg);
if (strlen($entry) < 10) $entry = date("Y-m-d H:i") . " session update";
$w = "/var/www/html/wiki.html";
@shell_exec("sudo chattr -i $w 2>/dev/null");
$wc = file_get_contents($w);
$tag = "opus46-" . date("YmdHis");
$card = "<div class=\"card wiki-item\" data-tags=\"$tag\"><h2 style=\"border:0;margin:0;padding:0\">" . htmlspecialchars(substr($entry,0,60)) . "</h2><div style=\"color:#94a3b8;font-size:10px;margin-top:6px\">" . htmlspecialchars($entry) . "<br><span style=\"color:#06b6d4\">[" . date("d/m H:i") . "]</span></div></div>\n";
$pos = strrpos($wc, "</div>\n<script>");
if ($pos !== false) { file_put_contents($w, substr($wc, 0, $pos) . $card . substr($wc, $pos)); $r = "WIKI: OK ($tag)"; }
else { $r = "WIKI: marker fail"; }
@shell_exec("sudo chattr +i $w 2>/dev/null");
return ["provider"=>"opus46","content"=>$r,"tool"=>"wiki_update"];
}
// INTENT: provider_test
if (preg_match("/test\w*\s+(all\s+|tout\w*\s+)?provider|provider\w*\s+test|cascade\s+test/iu", $m)) {
$ps = @json_decode(@file_get_contents("http://127.0.0.1/api/openclaw-proxy.php"), true);
$res = [];
foreach (($ps["providers"] ?? []) as $p) {
if ($p["tier"] === "sovereign" || empty($p["models"])) continue;
$ch = curl_init("http://127.0.0.1/api/openclaw-proxy.php");
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_RETURNTRANSFER=>1, CURLOPT_TIMEOUT=>8, CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_POSTFIELDS=>json_encode(["provider"=>$p["id"],"model"=>$p["models"][0]["id"],"message"=>"Reply OK"])]);
$rr = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$res[] = $p["id"] . ":" . ($code === 200 && strpos($rr, "choices") !== false ? "OK" : "FAIL");
}
return ["provider"=>"opus46","content"=>"PROVIDERS: " . implode(" | ", $res),"tool"=>"provider_test"];
}
// INTENT: auto_heal
if (preg_match("/auto[\s\-]?heal|auto[\s\-]?fix|fixe[rz]?\s+tout|fix\s+all|r.pare\w*\s+tout/iu", $m)) {
$fx = [];
$d = (int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l"));
if ($d > 0) { @shell_exec("cd /var/www/html && git add -A && git commit -m 'auto-heal' 2>&1"); $fx[] = "Git:$d"; }
@shell_exec("curl -s http://127.0.0.1/api/opcache-reset.php 2>/dev/null"); $fx[] = "OPcache:OK";
@shell_exec("curl -sX POST 'https://api.cloudflare.com/client/v4/zones/1488bbba251c6fa282999fcc09aac9fe/purge_cache' -H 'X-Auth-Email: ymahboub@weval-consulting.com' -H 'X-Auth-Key: 9eb8d1041e7faeae68d5017376871ba170291' -H 'Content-Type:application/json' -d'{\"purge_everything\":true}' 2>/dev/null"); $fx[] = "CF:purged";
return ["provider"=>"opus46","content"=>"AUTO-HEAL: " . implode(" | ", $fx),"tool"=>"auto_heal"];
}
// INTENT: 6sigma_full
if (preg_match("/6[\s\.]?sigma\s+(complet|full)|full\s+6[\s\.]?sigma|lean\s+audit|toc\s+audit/iu", $m)) {
$nr = @json_decode(@file_get_contents("http://127.0.0.1/api/nonreg-api.php?cat=all"), true);
$l9 = @json_decode(@file_get_contents("http://127.0.0.1/api/l99-api.php?action=results"), true);
$pv = @json_decode(@file_get_contents("http://127.0.0.1/api/openclaw-proxy.php"), true);
$r = "6SIGMA: NR=" . ($nr["pass"]??"?") . "/" . ($nr["total"]??"?") . " L99=" . ($l9["pass"]??"?") . "/" . ($l9["total"]??"?") . "@" . ($l9["score"]??"?") . "% Providers=" . count($pv["providers"]??[]) . "(" . ($pv["total_models"]??"?") . "M) Git=" . trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")) . "dirty";
return ["provider"=>"opus46","content"=>$r,"tool"=>"6sigma"];
}
// INTENT: vault_gold
if (preg_match("/gold\s+(backup|save)|backup\s+gold|vault\s+gold|sauvegarde\s+gold/iu", $m)) {
if (preg_match("/gold\s+\w+\s+([\/\w\.\-]+)/iu", $msg, $gm)) {
$p = $gm[1]; if ($p[0] !== "/") $p = "/var/www/html/$p";
if (file_exists($p)) { $g = $p . ".GOLD-" . date("Ymd-His"); copy($p, $g); return ["provider"=>"opus46","content"=>"GOLD: $g (" . filesize($g) . "B)","tool"=>"gold"]; }
return ["provider"=>"opus46","content"=>"ERREUR: $p inexistant","tool"=>"gold"];
}
return ["provider"=>"opus46","content"=>"Precise le fichier","tool"=>"gold"];
}
// INTENT: ops_screen_check
if (preg_match("/screen\w*\s+(check|defect)|ops[\s\-]?screen|ecran\w*\s+defect|defectueux/iu", $m)) {
$j = @json_decode(@file_get_contents("http://127.0.0.1/api/infra-monitor-api.php"), true);
return ["provider"=>"opus46","content"=>"OPS: UP=" . ($j["up"]??"?") . " DOWN=" . ($j["down"]??"?") . " 5xx=" . ($j["error_5xx"]??"?"),"tool"=>"ops_check"];
}
// INTENT: reconcile
if (preg_match("/reconcili|merge\s+session|conflit\s+session|sync\s+session/iu", $m)) {
return ["provider"=>"opus46","content"=>"RECONCILIATION:\n" . trim(@shell_exec("cd /var/www/html && git log --oneline -15 2>&1")) . "\nDirty:" . trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")),"tool"=>"reconcile"];
}
// INTENT: playwright_verify
if (preg_match("/playwright\s+verif|verif\w*\s+playwright|visual\s+test/iu", $m)) {
@shell_exec("nohup bash -c 'cd /var/www/html && node api/l99-visual-test.js > /tmp/pw-vis.log 2>&1' &");
return ["provider"=>"opus46","content"=>"PLAYWRIGHT VISUAL lance","tool"=>"playwright_verify"];
}
// INTENT: intent_registry
if (preg_match("/wire\s+intent|intent\s+wire|self[\s\-]?wire|nouvel?\s+intent|intent\s+registry/iu", $m)) {
$ic = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-opus-intents.php 2>/dev/null"));
$fc = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-fast-path-v3.php 2>/dev/null"));
$o4 = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-opus46-intents.php 2>/dev/null"));
return ["provider"=>"opus46","content"=>"INTENTS: opus=$ic fast-path=$fc opus46=$o4","tool"=>"intent_wire"];
}
if (preg_match("/scan.*skills|skills.*scan|inject.*skills|skills.*inject|refresh.*skills|0.*skills/iu", $m)) {
$s=[];$d="/var/www/html/skills/";
foreach(scandir($d) as $e){if($e[0]==".")continue;$full=realpath("$d/$e");if(!$full||!is_dir($full))continue;
foreach(scandir($full) as $x){if($x[0]==".")continue;$s[]=["slug"=>"$e/$x","name"=>pathinfo($x,4),"source"=>$e];}}
$c2="/var/www/html/api/oss-cache.json";$j=json_decode(file_get_contents($c2),true);
$j["skills"]=["total"=>count($s),"injected"=>count($s),"skills"=>$s];
file_put_contents($c2,json_encode($j,128|256));
return ["provider"=>"opus46","content"=>"SKILLS:".count($s),"tool"=>"skills_scan"];
}
if (preg_match("/charge.*(serveur|server)|load.*(average|serveur)|uptime|memoire.*serveur|cpu.*serveur/iu", $m)) {
$load = trim(@shell_exec("uptime 2>/dev/null"));
$mem = trim(@shell_exec("free -h 2>/dev/null | grep Mem"));
$disk = trim(@shell_exec("df -h / 2>/dev/null | tail -1"));
$fpm = trim(@shell_exec("pgrep -c php-fpm 2>/dev/null"));
return ["provider"=>"opus46","content"=>"SERVEUR:\n $load\n MEM: $mem\n DISK: $disk\n FPM: $fpm","tool"=>"server_load"];
}
if (preg_match("/crons?\s+(actif|list|quels|detail)|quels?\s+crons?|list\w*\s+crons?/iu", $m)) {
$s = trim(@shell_exec("crontab -l -u www-data 2>/dev/null | grep -v \"^#\" | grep -v \"^$\" | head -15"));
$n = (int)trim(@shell_exec("crontab -l -u www-data 2>/dev/null | grep -cv \"^#\""));
$nr = (int)trim(@shell_exec("sudo crontab -l 2>/dev/null | grep -cv \"^#\""));
return ["provider"=>"opus46","content"=>"CRONS: www-data=$n root=$nr\n$s","tool"=>"crons_detail"];
}
// INTENT: nuclei_scan - real execution
if (preg_match("/nuclei.*scan|scan.*nuclei|lance.*nuclei|vulnerabilit|vuln.*scan|owasp.*scan/iu", $m)) {
$target = "https://weval-consulting.com";
if (preg_match("/scan\s+(https?:\/\/\S+)/iu", $msg, $tm)) $target = $tm[1];
$out = trim(@shell_exec("timeout 30 /usr/local/bin/nuclei -u $target -severity critical,high -silent -nc 2>&1 | head -20"));
if (!$out) $out = "0 vulnérabilités critical/high détectées";
return ["provider"=>"opus46","content"=>"NUCLEI SCAN $target:\n$out","tool"=>"nuclei_scan"];
}
return null;
}