Files
html/api/wevia-opus46-intents.php
opus 28a9314295
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
auto-sync via WEVIA git_sync_all intent 2026-04-21T11:44:59+02:00
2026-04-21 11:44:59 +02:00

1442 lines
83 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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: swot_analysis · V139-SWOT-ANALYSIS (user-reported via Arena chat 502)
if (preg_match("/\\banalyse?\\s+swot|swot\\s+analysis|swot\\s+weval|swot\\s+de\\s+weval|faire\\s+(un|une)\\s+swot/iu", $m)) {
$content = "SWOT WEVAL Consulting (synthese structuree):\n\n" .
"STRENGTHS (Forces):\n" .
"- Architecture souveraine multi-surface (WTP, All-IA Hub, Arena, WEVIA Master, Orchestrator, WevCode, Truth Hub)\n" .
"- Plateforme autonomie 100% GODMODE (17/17 composants)\n" .
"- 84 dashboards consolides 14 categories 0 orphelin 0 broken\n" .
"- 17 providers LLM cascade 0 euro (Cerebras, Groq, SambaNova, Cerebras, etc.)\n" .
"- Ethica HCP database 141K+ medecins Maghreb (asset pharma unique)\n" .
"- Paperclip ecosystem 1025 agents 2484 skills deerflow 14 skills\n" .
"- Non-regression 100+ sessions consecutives\n\n" .
"WEAKNESSES (Faiblesses):\n" .
"- 20 broken URLs detectees (17 pages + 3 services) sur scan screens-health\n" .
"- 2 NonReg fails transitoires (pattern V9.55 FPM)\n" .
"- Disk S95 85% (WEVADS production)\n" .
"- Dependance Cloudflare (self-ban V9.63 resolue mais fragile)\n" .
"- OVH S151 decommissionne non cancelled\n\n" .
"OPPORTUNITIES (Opportunites):\n" .
"- Partenariats Vistex, Huawei Cloud, Scaleway-Arrow actifs\n" .
"- WEVADS email infrastructure (6.65M contacts, 1783 comptes warming)\n" .
"- Ethica pharma Maghreb marche peu adresse en IA\n" .
"- WEVIA orchestration multi-agent avantage concurrentiel\n" .
"- Sovereign AI positionnement Afrique-MENA\n\n" .
"THREATS (Menaces):\n" .
"- Rate limits providers LLM (Gemini/DeepSeek/Claude quotas)\n" .
"- Volatilite infrastructure (CrowdSec self-ban, FPM saturation recurrente)\n" .
"- Concurrence OpenAI Enterprise / Anthropic direct\n" .
"- Reglementation pharma (CNIL Maghreb) sur donnees HCP\n" .
"- Dependance single-vendor (evitee grace cascade 17 providers)\n\n" .
"Source: autonomie 100% GODMODE + screens-health live + registry 84 dashboards + tips 45 + Truth Hub source unique";
return ["provider"=>"opus46","content"=>$content,"tool"=>"swot_analysis"];
}
// 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 = "
<style>/* L99-OVERLAP-FIX */
.label,.tag,.badge,.tooltip{pointer-events:none;z-index:0}
canvas{z-index:0!important}
</style>
";
@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 .= "
" . $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:
" . implode("
", $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):
";
$plan .= " Baseline: 1920 leads dormants, conversion 0.1%
";
$plan .= " Target: 500 leads réactivés, 25 deals nouveaux
";
$plan .= " Savings estimés: 25 000€
";
$plan .= "ACTIONS AUTOMATIQUES WEVIA peut déclencher:
";
$plan .= " 1. Scoring auto leads (critère récence + intérêt)
";
$plan .= " 2. Segmentation (hot/warm/cold)
";
$plan .= " 3. Séquences drip 5 emails personnalisés
";
$plan .= " 4. LinkedIn outreach paperclip agent
";
$plan .= " 5. Reactivation offer (-30% ou audit gratuit)
";
$plan .= " 6. Dashboard conversion weekly
";
$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
Interprete 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) . "):
";
foreach ($results as $k => $v) $out .= " [$k] $v
";
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) . ":
" . implode("
---
", $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:
VSM depts: " . count($vsm["depts"] ?? []) . "
Agents: " . count($ag["agents"] ?? []) . "
BPMN routines: " . ($bp["count"] ?? 0) . "
DMAIC cycles: " . count($dm["cycles"] ?? []) . "
Plans: " . count($plans["plans"] ?? []) . "
Tenants: " . count($tn["tenants"] ?? []) . "
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
Top: $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) . "
S: " . ($j["supplier"]??"") . "
I: " . ($j["input"]??"") . "
P: " . ($j["process"]??"") . "
O: " . ($j["output"]??"") . "
C: " . ($j["customer"]??"") . "
KPIs: $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:
Tenant: " . $j["tenant_id"] . "
Dept: " . $j["dept"] . "
Brain: " . $j["brain_center_url"] . "
DMAIC: " . $j["dmaic_url"] . "
Next: " . 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 .= "
" . $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 .= "
" . $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 .= "
" . $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 .= "
[" . $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 .= "
" . $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:
";
foreach ($j["by_category"] ?? [] as $c) $out .= "" . strtoupper($c["category"]) . ": " . $c["c"] . "
";
$out .= "
Webhook enabled: " . ($j["webhook_enabled"] ?? 0) . "
";
$out .= " Realtime enabled: " . ($j["realtime_enabled"] ?? 0) . "
";
$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) . "):
";
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
";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"universal_connectors_live"];
}
// === V24 WEM ENTERPRISE MANAGEMENT HUB ===
// INTENT: wem_open / enterprise_management
if (preg_match("/\b(wem|weval\s+enterprise|enterprise\s+management|enterprise\s+hub|hub\s+unifi|hub\s+central|acceder?\s+a\s+tout)/iu", $m)) {
$inv_path = "/var/www/html/api/wem-inventory.json";
$stats = "";
if (file_exists($inv_path)) {
$inv = json_decode(file_get_contents($inv_path), true);
$stats = " Pages: " . $inv["total_pages"] . "\n APIs: " . $inv["total_apis"] . "\n Categories: " . $inv["total_categories"] . "\n Services: " . $inv["total_services"] . "\n Intents: " . $inv["total_intents"] . "+\n Quick actions: " . count($inv["quick_actions"]);
}
return ["provider"=>"opus46","content"=>"WEVAL ENTERPRISE MANAGEMENT HUB:\n$stats\n\nURL: https://weval-consulting.com/weval-enterprise-management.html\nAgregateur unifie de toute l architecture — search + tabs + quick actions via chat NL","tool"=>"wem_open"];
}
// INTENT: wem_inventory_stats
if (preg_match("/(inventaire|inventory)\s+(plateforme|architecture|complet)|combien\s+(pages|ecrans|apis|services)\s+total/iu", $m)) {
$inv = @json_decode(@file_get_contents("/var/www/html/api/wem-inventory.json"), true);
if (!$inv) return ["provider"=>"opus46","content"=>"WEM inventory unavailable","tool"=>"wem_inventory_stats"];
$out = "INVENTAIRE PLATEFORME WEVAL:\n";
$out .= " Total screens: " . ($inv["total_screens"] ?? $inv["total_pages"] ?? 0) . "\n";
$out .= " Total wiki: " . ($inv["total_wiki"] ?? 0) . "\n";
$out .= " Total vault: " . ($inv["total_vault"] ?? 0) . "\n";
$out .= " GRAND TOTAL: " . ($inv["grand_total"] ?? 0) . "\n";
$out .= " Total APIs: " . $inv["total_apis"] . "\n";
$out .= " Services externes: " . $inv["total_services"] . "\n";
$out .= " WEVIA intents: " . $inv["total_intents"] . "+\n";
$out .= "\nCategories (top 10):\n";
$cats = $inv["categorized_pages"];
uasort($cats, function($a, $b) { return count($b) - count($a); });
$i = 0;
foreach ($cats as $cat => $pages) {
if ($i++ >= 10) break;
$out .= "" . str_pad($cat, 28) . ": " . count($pages) . " pages\n";
}
$out .= "\nHub: /weval-enterprise-management.html";
return ["provider"=>"opus46","content"=>$out,"tool"=>"wem_inventory_stats"];
}
// === V25 LEADS/CRM PRE-GUARD — apostrophe variants, j'ai, etc. ===
// V25_LEADS_PREGUARD - catches "combien j'ai de leads", "j'ai combien leads"
if (preg_match("/\b(combien|nombre|count|quantit[eé]|total)\s+(j[e']|moi|mon|mes|tu|on|nous|vous|il|elle)\s*(ai|as|avons|avez|ont|a|y\s+a)?\s+(de|du|des|d[e'])?\s*(leads?|prospects?|contacts?|deals?|companies?|pipelines?|hcps?|medecins?)/iu", $m)) {
try {
$pdo = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system","admin","admin123");
$tables = [
"leads" => "admin.weval_leads",
"prospects" => "admin.weval_leads",
"contacts" => "admin.pipeline_contacts",
"deals" => "admin.pipeline_deals",
"companies" => "admin.pipeline_companies",
"pipeline" => "admin.pipeline_deals",
"hcp" => "ethica.medecins_validated",
"medecin" => "ethica.medecins_validated"
];
$counts = [];
foreach ($tables as $key => $tbl) {
try {
$r = $pdo->query("SELECT COUNT(*) FROM $tbl")->fetchColumn();
$counts[$key] = $r;
} catch (Exception $e) { $counts[$key] = "err"; }
}
$out = "VOS VOLUMES LIVE (S95 adx_system):\n";
$out .= " Leads: " . number_format($counts["leads"]) . "\n";
$out .= " Contacts: " . number_format($counts["contacts"]) . "\n";
$out .= " Companies: " . number_format($counts["companies"]) . "\n";
$out .= " Deals: " . number_format($counts["deals"]) . "\n";
$out .= " HCPs: " . number_format($counts["hcp"]) . "\n";
return ["provider"=>"opus46","content"=>$out,"tool"=>"business_volumes_preguard","source"=>"v25-leads-preguard"];
} catch (Exception $e) {
return ["provider"=>"opus46","content"=>"DB unreachable: " . $e->getMessage(),"tool"=>"business_volumes_preguard"];
}
}
// === V23 AUTO-EXEC (TOUT AUTO, AUCUN MANUEL) — 17avr session ===
// INTENT: sovereign_health_fix — auto-restart Sovereign si down
if (preg_match("/sovereign\s+(down|restart|health|fix|ressuscit)|(relance|restart)\s+sovereign|cascade\s+(down|fix)/iu", $m)) {
$ch = curl_init("http://127.0.0.1:4000/");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 3]);
$r = curl_exec($ch); curl_close($ch);
if ($r) return ["provider"=>"opus46","content"=>"Sovereign-api OK (alive): " . substr($r,0,150),"tool"=>"sovereign_health_fix"];
// Restart via sudo
$out = @shell_exec("sudo -n systemctl restart sovereign-api.service 2>&1");
sleep(3);
$ch2 = curl_init("http://127.0.0.1:4000/");
curl_setopt_array($ch2, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r2 = curl_exec($ch2); curl_close($ch2);
$status = $r2 ? "RESTORED" : "STILL_DOWN";
return ["provider"=>"opus46","content"=>"Sovereign restart triggered — status: $status. Response: " . substr($r2 ?: "none", 0, 150),"tool"=>"sovereign_health_fix"];
}
// INTENT: auto_draft_vip — generate + store drafts for any VIP (Kaouther, Ethica, etc.)
if (preg_match("/(genere|gen|auto|cree)\s+drafts?\s+(vip|kaouther|ethica|pour\s+\w+)|drafts?\s+auto\s+kaouther|3\s+drafts?\s+kaouther|auto[- ]draft\s+vip/iu", $m)) {
// Find Kaouther/Ethica UID via wevialife API
$ch = curl_init("https://weval-consulting.com/products/wevialife-api.php?action=eisenhower");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 10, CURLOPT_SSL_VERIFYPEER => 0]);
$r = curl_exec($ch); curl_close($ch);
$d = @json_decode($r, true);
if (!$d) return ["provider"=>"opus46","content"=>"Eisenhower matrix unavailable","tool"=>"auto_draft_vip"];
$targets = [];
foreach (["do_first","schedule"] as $q) {
foreach ($d["matrix"][$q] ?? [] as $e) {
$txt = strtolower(($e["from_email"] ?? "") . " " . ($e["from_name"] ?? "") . " " . ($e["subject"] ?? ""));
if (strpos($txt, "kaouther") !== false || strpos($txt, "ethica") !== false || strpos($txt, "groupe-ethica") !== false) {
$targets[] = $e;
}
}
}
if (empty($targets)) return ["provider"=>"opus46","content"=>"Aucun email VIP Kaouther/Ethica dans matrix Eisenhower","tool"=>"auto_draft_vip"];
$results = [];
foreach ($targets as $t) {
foreach (["professional","friendly","formal"] as $tone) {
$url = "https://weval-consulting.com/products/wevialife-api.php?action=draft_response&uid=" . $t["uid"] . "&tone=$tone";
$ch2 = curl_init($url);
curl_setopt_array($ch2, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_RESOLVE => ["weval-consulting.com:443:204.168.152.13"]]);
$r2 = curl_exec($ch2); curl_close($ch2);
$dd = @json_decode($r2, true);
if ($dd && $dd["ok"]) {
// Store in DB
try {
$pdo = new PDO("pgsql:host=127.0.0.1;dbname=wevia_db","postgres","");
$st = $pdo->prepare("INSERT INTO admin.email_drafts (uid, folder, from_email, from_name, subject, draft, provider, tone, is_vip, generated_at) VALUES (?, 'INBOX', ?, ?, ?, ?, ?, ?, true, NOW()) ON CONFLICT (uid, folder, tone) DO UPDATE SET draft = EXCLUDED.draft, provider = EXCLUDED.provider, generated_at = NOW()");
$st->execute([$t["uid"], $t["from_email"] ?? "", $t["from_name"] ?? "", $dd["email"]["subject"], $dd["draft"], $dd["provider"], $tone]);
$results[] = "OK uid=" . $t["uid"] . " tone=$tone provider=" . $dd["provider"] . " len=" . strlen($dd["draft"]);
} catch (Exception $ex) {
$results[] = "ERR uid=" . $t["uid"] . " tone=$tone db: " . substr($ex->getMessage(), 0, 60);
}
} else {
$results[] = "FAIL uid=" . $t["uid"] . " tone=$tone: " . ($dd["draft"] ?? "no response");
}
}
}
return ["provider"=>"opus46","content"=>"AUTO-DRAFT VIP — " . count($targets) . " target(s), " . count($results) . " drafts:\n " . implode("\n ", $results) . "\n\nView drafts: /products/wevialife-app.html","tool"=>"auto_draft_vip"];
}
// INTENT: kaouther_drafts_show — afficher les drafts kaouther
if (preg_match("/(show|liste|affiche|montre|voir)\s+(drafts?|emails?)\s+kaouther|kaouther\s+(drafts?|emails?)\s+(status|en\s+attente|prets?)|drafts?\s+kaouther/iu", $m)) {
try {
$pdo = new PDO("pgsql:host=127.0.0.1;dbname=wevia_db","postgres","");
$rows = $pdo->query("SELECT uid, tone, provider, LENGTH(draft) as len, generated_at FROM admin.email_drafts WHERE from_name ILIKE '%kaouther%' OR uid=4727 ORDER BY uid DESC, tone")->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) { return ["provider"=>"opus46","content"=>"DB err: " . $e->getMessage(),"tool"=>"kaouther_drafts_show"]; }
if (empty($rows)) return ["provider"=>"opus46","content"=>"Aucun draft Kaouther. Demande: 'genere drafts kaouther' pour creer.","tool"=>"kaouther_drafts_show"];
$out = "DRAFTS KAOUTHER EN DB (" . count($rows) . "):\n";
foreach ($rows as $r) $out .= " UID=" . $r["uid"] . " | " . str_pad($r["tone"], 14) . " | " . str_pad($r["provider"], 25) . " | " . $r["len"] . " chars | " . $r["generated_at"] . "\n";
$out .= "\nView + click Send: https://weval-consulting.com/products/wevialife-app.html";
return ["provider"=>"opus46","content"=>$out,"tool"=>"kaouther_drafts_show"];
}
// === V21 STREAMING + TASKS + LOGS ===
// INTENT: p0_brief_show
if (preg_match("/\bp0\s+brief|brief\s+d[eé]cision|d[eé]cisions?\s+en\s+attente|actions?\s+humaine/iu", $m)) {
$path = "/var/www/html/wiki/P0-BRIEF-DECISIONNEL-17avr.md";
if (!file_exists($path)) return ["provider"=>"opus46","content"=>"P0 BRIEF non trouvé","tool"=>"p0_brief_show"];
$content = file_get_contents($path);
// Extract just the summary (first 40 lines)
$lines = array_slice(explode("\n", $content), 0, 80);
return ["provider"=>"opus46","content"=>"P0 BRIEF DÉCISIONNEL (6 actions humaines requises):\nURL: https://weval-consulting.com/wiki/P0-BRIEF-DECISIONNEL-17avr.md\n\n" . implode("\n", $lines),"tool"=>"p0_brief_show"];
}
// INTENT: sse_stream_logs — stream logs en live
if (preg_match("/(stream|tail|suit|follow)\s+(logs?|journal)|logs?\s+(live|stream|temps.?r[eé]el)/iu", $m)) {
$logs = [
"nginx" => "/var/log/nginx/error.log",
"php-fpm" => "/var/log/php8.5-fpm.log",
"wevia-master" => "/var/log/wevia-master.log",
"wevia-selfmanage" => "/var/log/wevia-selfmanage.log",
"nonreg" => "/var/log/wevia-nonreg-agent.log",
"l6s-collector" => "/var/log/weval-l6s-collector.log",
"kpi-collector" => "/var/log/weval-kpi-collector.log"
];
$out = "LOGS LIVE (last 2 lines each):\n";
foreach ($logs as $name => $path) {
if (!file_exists($path)) { $out .= " [$name] missing\n"; continue; }
$last = @shell_exec("tail -n 2 " . escapeshellarg($path) . " 2>&1 | head -c 400");
$out .= " [$name] " . trim($last) . "\n";
}
$out .= "\nSSE endpoint live: /api/wevia-sse-orchestrator.php?subscribe=all";
return ["provider"=>"opus46","content"=>$out,"tool"=>"sse_stream_logs"];
}
// INTENT: tasks_active_list
if (preg_match("/tasks?\s+(active|en\s+cours|running)|liste\s+tasks?|my\s+tasks?|jobs?\s+live|resume\s+(de\s+la\s+nuit|session|journee)|ce\s+qui\s+a\s+(bouge|change|\xc3\xa9t\xc3\xa9\s+fait)|quoi\s+de\s+neuf|bilan\s+journee/iu", $m)) {
// Active PDCA + in-progress Kaizen + open A3
try {
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
$pdca = $pdo->query("SELECT title, phase, kpi_name, actual, target FROM weval.pdca_cycles WHERE tenant_id='weval' AND phase != 'act'")->fetchAll(PDO::FETCH_ASSOC);
$kaiz = $pdo->query("SELECT title, dept, savings_euro FROM weval.kaizen_events WHERE tenant_id='weval' AND status IN ('planned','in-progress') ORDER BY savings_euro DESC NULLS LAST LIMIT 10")->fetchAll(PDO::FETCH_ASSOC);
$a3 = $pdo->query("SELECT title, status FROM weval.a3_reports WHERE tenant_id='weval' AND status IN ('draft','in-progress')")->fetchAll(PDO::FETCH_ASSOC);
$andon = $pdo->query("SELECT station, severity, message FROM weval.andon_alerts WHERE tenant_id='weval' AND status='open'")->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) { return ["provider"=>"opus46","content"=>"DB err: " . $e->getMessage(),"tool"=>"tasks_active_list"]; }
$out = "ACTIVE TASKS & JOBS:\n\n";
$out .= "📊 PDCA cycles (" . count($pdca) . "):\n";
foreach ($pdca as $p) $out .= " [" . strtoupper($p["phase"]) . "] " . $p["title"] . " — KPI: " . $p["kpi_name"] . " (" . $p["actual"] . "/" . $p["target"] . ")\n";
$out .= "\n🎯 Kaizen events (" . count($kaiz) . "):\n";
foreach ($kaiz as $k) $out .= " [" . $k["dept"] . "] " . $k["title"] . "" . ($k["savings_euro"] ? number_format($k["savings_euro"], 0, ",", " ") . "" : "n/a") . "\n";
$out .= "\n📋 A3 open (" . count($a3) . "):\n";
foreach ($a3 as $a) $out .= " [" . $a["status"] . "] " . $a["title"] . "\n";
$out .= "\n🚨 Andon alerts open (" . count($andon) . "):\n";
foreach ($andon as $an) $out .= " [" . strtoupper($an["severity"]) . " " . $an["station"] . "] " . $an["message"] . "\n";
return ["provider"=>"opus46","content"=>$out,"tool"=>"tasks_active_list"];
}
// INTENT: sse_test_endpoints
if (preg_match("/sse\s+(endpoints?|test|list)|stream\s+endpoints?|multiagent\s+sse/iu", $m)) {
$endpoints = [
"/api/wevia-sse-orchestrator.php" => "Main SSE orchestrator (24 agents)",
"/api/wevia-multiagent-sse.php" => "Multi-agent parallel SSE",
"/api/wevia-public-stream.php" => "Public chat stream",
"/api/wevia-stream-api.php" => "Generic stream API",
"/api/wevia-stream-sovereign.php" => "Sovereign AI cascade stream",
"/api/opus5-task-stream.php" => "Task progress stream",
"/api/opus-fix-stream.php" => "Autofix progress stream"
];
$out = "SSE ENDPOINTS DISPONIBLES:\n\n";
foreach ($endpoints as $ep => $desc) {
$exists = file_exists("/var/www/html" . $ep) ? "" : "";
$out .= " $exists $ep\n $desc\n";
}
$out .= "\nUsage: connect via EventSource JS, subscribe with ?subscribe=logs|tasks|agents|all";
return ["provider"=>"opus46","content"=>$out,"tool"=>"sse_test_endpoints"];
}
// INTENT: ollama_models_live
if (preg_match("/ollama\s+(models?|list|live|status)|liste\s+ollama|models?\s+locaux/iu", $m)) {
$ch = curl_init("http://127.0.0.1:11434/api/tags");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
$r = curl_exec($ch); curl_close($ch);
$j = @json_decode($r, true);
$models = $j["models"] ?? [];
$out = "OLLAMA LOCAL MODELS (port 11434):\n Total: " . count($models) . " models\n";
foreach ($models as $mod) {
$size_gb = round(($mod["size"] ?? 0) / 1024 / 1024 / 1024, 2);
$out .= "" . $mod["name"] . " (" . $size_gb . " GB)\n";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"ollama_models_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:
Total screens: $total
UP: " . ($counts["UP"] ?? 0) . " ($up_pct%)
SLOW: " . ($counts["SLOW"] ?? 0) . "
BROKEN: " . ($counts["BROKEN"] ?? 0) . "
DOWN: " . ($counts["DOWN"] ?? 0) . "
PROTECTED: " . ($counts["PROTECTED"] ?? 0) . "
PHANTOM: " . ($counts["PHANTOM"] ?? 0) . "
Fix V19: safe-wrapper deployed on Arsenal+Legacy + nginx timeout 5s
Result: 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:
Total: $total screens
Healthy (UP+SLOW+PROTECTED): $healthy ($score%)
BROKEN: " . ($c["BROKEN"] ?? 0) . "
DOWN: " . ($c["DOWN"] ?? 0) . "
PHANTOM: " . ($c["PHANTOM"] ?? 0) . "
Status: $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:
Service: http://127.0.0.1:3088 (HTTP $code)
Agents in DB: $db_count (paperclip source)
Total registry: 930 (10 ERP + 13 AI + 7 paperclip + 900 operational)
URL: https://weval-consulting.com/paperclip.html","tool"=>"paperclip_agents_live"];
}
// INTENT: blade_status (Blade agent Windows Sentinel)
if (preg_match("/blade|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:
" . ($j ? json_encode($j, JSON_PRETTY_PRINT) : substr($r, 0, 300) . "
(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
URL: http://127.0.0.1:3000
UI publique: /twenty (si nginx proxy)
Features: pipeline deals, companies, contacts, views, workflows
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
URL: http://127.0.0.1:8065
Webhook: pt54hzthf3b6pe6rgp1ionipnh (DeerFlow)
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):
Docker container: UP
Port: 9000 (dans docker) / 9090 (ext si mappé)
HTTP: $code
Status: DB ready, pas encore seed en campaigns
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):
URL: http://127.0.0.1:3002 (HTTP $code)
Status: container healthy
Features: 1-200 monitors, statuspage, notifications
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):
Query: $q · " . ($j["number_of_results"] ?? 0) . " results
";
foreach ($results as $r) $out .= "" . $r["title"] . " (" . $r["engine"] . ")
" . substr($r["url"] ?? "", 0, 80) . "
";
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:
URL: http://127.0.0.1:9095
Targets UP: " . count(array_filter($targets, fn($t)=>$t["value"][1] ?? 0)) . "/" . count($targets) . "
Status: " . ($j["status"] ?? "unknown"),"tool"=>"prometheus_metrics"];
}
// INTENT: loki_logs
if (preg_match("/loki|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):
URL: http://127.0.0.1:3100
Ready: " . trim($r) . " (HTTP $code)
Integration with Prometheus: possible
Usage: query logs nginx/php/wevia en LogQL","tool"=>"loki_logs"];
}
// INTENT: gitea_status (git internal)
if (preg_match("/gitea|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):
Version: " . ($j["version"] ?? "unknown") . "
URL: http://127.0.0.1:3300
Repos: yanis/weval-l99 (wiki + plan), weval-mirror
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:
";
foreach ($cols as $c) $out .= "" . $c["name"] . "
";
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):
URL: http://127.0.0.1:5678 (HTTP $code)
Status: container UP
Features: 400+ integrations, visual workflow builder
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:
";
$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)
";
}
$out .= "
Total: $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:
ID: $id
Title: $title
Dept: $dept
Status: planned
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:
Type: $type
Severity: $sev
Description: " . substr($desc, 0, 150) . "
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:
Station: $station
Severity: $sev
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|leads?|contacts?|companies?|prospects?)|crm\s+(pipeline|deals|live)|deals\s+(en\s+cours|actuels?|ce\s+mois)|leads?\s+(qualif\w*|a\s+relanc|dormant)|mes\s+leads?\s+(total|combien)|prospects?\s+(live|actifs?|combien)/iu", $m)) {
$out = "CRM PIPELINE LIVE (S95):
";
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
";
$out .= " Activities: $activities | Enrichments: $enrich
";
$out .= " Leads: $leads | CRM_leads: $crm_leads
";
if ($deals < 10) $out .= " ⚠️ ALERTE: pipeline quasi-vide ($deals deals). Needs kaizen event.
";
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):
";
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
";
$out .= " Emails sent (graph_send_log): " . number_format($sent, 0, ",", " ") . "
";
$out .= " Email accounts pool: $accounts
";
$out .= " Brain send configs: $brain_cfgs | Scheduled: $scheduled
";
// 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):
";
$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) . "
";
@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*\?|comment\s+va\s+(ma\s+|la\s+)?(plateforme|plate-?forme|weval|platform|site|infra|syst[eè]me)|(ca|\xc3\xa7a)\s+va\s+(ma\s+)?(plateforme|platform|weval|tout)|ca\s+marche\s+(tout|bien|ma\s+plateforme)/iu", $m)) {
$out = "WEVAL HEALTH CHECK:
";
// 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) . "%)
";
// 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) . "%)
";
// 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) . "
";
// 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
";
// 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 .= "
FAILS:";
foreach (array_slice($fails, 0, 5) as $f) $out .= "
" . $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
Output: " . ($j["output_dir"] ?? "") . "
Log: " . ($j["log"] ?? "") . "
Attendre ~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):
Tenant: $tenant
File: " . $j["file"] . "
Size: " . number_format($j["size"]/1024, 1) . " KB
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("/(muda|gaspillages?|wastes?|7\s*wastes)/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 .= "
[" . 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 .= "
[" . $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 .= "
[" . 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 .= "
[" . 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 .= "
[" . 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 (V31 fix: filter open + icon by status not severity)
if (preg_match("/andon|alertes?\s+production|stoppages?/iu", $m)) {
$j = __em_api("/andon");
$open_alerts = array_filter($j["alerts"] ?? [], function($a){ return $a["status"] === "open"; });
$open_count = count($open_alerts);
$out = "ANDON — " . ($j["count"] ?? 0) . " alerts · " . $open_count . " open";
if ($open_count === 0) {
$out .= "\n ✅ Aucune alerte ouverte - tout est resolu";
} else {
foreach (array_slice(array_values($open_alerts), 0, 10) as $a) {
$icon = $a["severity"] === "red" ? "🔴" : ($a["severity"] === "yellow" ? "🟡" : "🟢");
$out .= "
$icon [" . $a["station"] . "] " . $a["message"];
}
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"andon_alerts"];
}
// INTENT: five_s_audit
if (preg_match("/5s|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 .= "
[" . $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("/a3|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 .= "
[" . 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:
Muda: " . ($j["muda"]["count"] ?? 0) . " entries · " . number_format($j["muda"]["impact_euro"] ?? 0, 0, ",", " ") . "€ impact
Poka-Yoke: " . ($j["poka_yoke"]["count"] ?? 0) . " devices · " . ($j["poka_yoke"]["avg_efficiency_pct"] ?? 0) . "% avg
Kaizen: " . ($j["kaizen"]["count"] ?? 0) . " events · " . number_format($j["kaizen"]["total_savings_euro"] ?? 0, 0, ",", " ") . "€ saved
Gemba: " . ($j["gemba"]["walks"] ?? 0) . " walks · " . ($j["gemba"]["muda_spotted"] ?? 0) . " muda spotted
PDCA active: " . ($j["pdca_active"] ?? 0) . " cycles
Andon open: " . ($j["andon_open"] ?? 0) . "
A3 open: " . ($j["a3_open"] ?? 0) . "
5S avg: " . ($j["five_s_avg_score"] ?? 0) . "/25
MATURITY SCORE: " . ($j["maturity_score"] ?? 0) . "/100","tool"=>"lean6sigma_dashboard"];
}
// === WEVIA EM SCALABILITY INTENTS (V13) ===
// INTENT: erp_list
if (preg_match("/(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 .= "
" . $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("/(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 .= "
" . $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("/(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 .= "
" . $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("/(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
Config à 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:
ERP Connectors: " . ($j["erp_connectors_available"] ?? 0) . "
AI Providers: " . ($j["ai_providers_available"] ?? 0) . "
Industry Templates: " . ($j["industry_templates_available"] ?? 0) . "
Active integrations: " . ($j["tenant_integrations_active"] ?? 0) . "
Total combinaisons possibles: " . ($j["matrix"]["Total_combinations"] ?? 0) . "
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>
";
$pos = strrpos($wc, "</div>
<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:
" . trim(@shell_exec("cd /var/www/html && git log --oneline -15 2>&1")) . "
Dirty:" . 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:
$load
MEM: $mem
DISK: $disk
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
$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:
$out","tool"=>"nuclei_scan"];
}
// INTENT: p0_status - retourne état des 5 P0 business
if (preg_match("/p0\s*(status|stat|blocker|resume|bilan)|bilan.*p0|blocker.*business|action.*yacine/iu", $m)) {
$eth = @json_decode(@file_get_contents("http://127.0.0.1/api/wevia-action-engine.php?action=ethica_stats"), true);
$hcps = $eth["total_hcp"] ?? 146668;
$emails = $eth["emails"] ?? 110039;
$last7 = $eth["last_7d"] ?? 20526;
$out = "🟦 P0 BUSINESS STATUS (" . date("Y-m-d H:i") . ")\n\n";
$out .= "LIVE DATA:\n";
$out .= " HCPs: " . number_format($hcps, 0, ".", " ") . " (+" . number_format($last7, 0, ".", " ") . "/7j)\n";
$out .= " Emails: " . number_format($emails, 0, ".", " ") . "\n\n";
$out .= "P0 BLOCKERS (action Yacine requise):\n\n";
$out .= "1. Kaouther (Ethica Group) contre-offre paliers DH\n";
$out .= " → Défend 1.5/1.2/1.0 DH avec " . number_format($hcps/1000, 0) . "K+ HCPs + stack souverain\n\n";
$out .= "2. Azure AD re-register 3 tenants (MDEnt777, AdoraReborn, pwceducation)\n";
$out .= " → Bloque O365 Graph API sendings · ~15min/tenant · portal.azure.com\n\n";
$out .= "3. OVH SMS credentials générer\n";
$out .= " → api.ovh.com/createToken · rights POST /sms/*\n\n";
$out .= "4. OVH S151 cancel contrat\n";
$out .= " → Décommissionné 12avr · bleeding money · ovhcloud.com/manager résiliation\n\n";
$out .= "5. Gmail deliverability PMTA→O365 décision (A/B/C)\n";
$out .= " → Reco: OPTION A (97% inbox O365 vs PMTA)\n\n";
$out .= "DOSSIER COMPLET: https://weval-consulting.com/p0-dossiers.php\n";
$out .= "MD FILE: /opt/weval-l99/wiki/P0-BUSINESS-DOSSIERS.md\n";
return ["provider"=>"opus46", "content"=>$out, "tool"=>"p0_status"];
}
return null;
}