auto-sync-0430

This commit is contained in:
opus
2026-04-17 04:30:02 +02:00
parent 3836152bb8
commit 4653c8bad4
5 changed files with 1496 additions and 2027 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -44,7 +44,12 @@ function wevia_opus46_exec($msg) {
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";
$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);
@@ -65,7 +70,8 @@ function wevia_opus46_exec($msg) {
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"]??""); } }
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"];
}
@@ -80,7 +86,9 @@ function wevia_opus46_exec($msg) {
$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"];
return ["provider"=>"opus46","content"=>"QDRANT CREATE:
" . implode("
", $out),"tool"=>"qdrant_create"];
}
// INTENT: enrich_leads_action (triggers real lead enrichment plan)
@@ -89,17 +97,30 @@ function wevia_opus46_exec($msg) {
$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 = "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) {
@@ -128,7 +149,8 @@ function wevia_opus46_exec($msg) {
}
$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"];
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) {
@@ -148,8 +170,10 @@ function wevia_opus46_exec($msg) {
$results[$key] = "shell: " . $out;
}
}
$out = "SMART_MULTIAGENT (" . count($results) . "):\n";
foreach ($results as $k => $v) $out .= " [$k] $v\n";
$out = "SMART_MULTIAGENT (" . count($results) . "):
";
foreach ($results as $k => $v) $out .= " [$k] $v
";
return ["provider"=>"opus46","content"=>$out,"tool"=>"smart_multiagent"];
}
@@ -164,7 +188,10 @@ function wevia_opus46_exec($msg) {
$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"];
return ["provider"=>"opus46","content"=>"DYNMULTI " . count($results) . ":
" . implode("
---
", $results),"tool"=>"dynamic_multiagent"];
}
// === WEVIA EM V10 10 intents ===
@@ -176,7 +203,14 @@ function wevia_opus46_exec($msg) {
$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"];
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
@@ -186,7 +220,8 @@ function wevia_opus46_exec($msg) {
$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"];
return ["provider"=>"opus46","content"=>"AGENTS REGISTRY" . ($dept?" ($dept)":""). ": $count agents
Top: $sample","tool"=>"agents_registry_query"];
}
// INTENT: vsm_dept_query
@@ -200,7 +235,13 @@ function wevia_opus46_exec($msg) {
$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"];
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
@@ -210,7 +251,12 @@ function wevia_opus46_exec($msg) {
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"];
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"];
}
@@ -218,7 +264,8 @@ function wevia_opus46_exec($msg) {
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";
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"];
}
@@ -226,7 +273,8 @@ function wevia_opus46_exec($msg) {
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"] . "%";
foreach (($j["cycles"] ?? []) as $c) $out .= "
" . $c["vs_id"] . ": " . strtoupper($c["phase"]) . " " . $c["progress"] . "%";
return ["provider"=>"opus46","content"=>$out,"tool"=>"dmaic_advance"];
}
@@ -234,7 +282,8 @@ function wevia_opus46_exec($msg) {
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"]??"");
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"];
}
@@ -244,7 +293,8 @@ function wevia_opus46_exec($msg) {
$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...";
$out .= "
[" . $r["dept"] . "] " . $r["name"] . " (SLA " . $r["sla_hours"] . "h): $steps...";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"bpmn_deploy"];
}
@@ -253,7 +303,8 @@ function wevia_opus46_exec($msg) {
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"];
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"];
}
@@ -262,10 +313,15 @@ function wevia_opus46_exec($msg) {
// 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 = "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"];
@@ -278,11 +334,13 @@ function wevia_opus46_exec($msg) {
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";
$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\n";
$out .= " • [" . $c["category"] . "] " . $c["connector_name"] . " (" . $c["auth_type"] . ")$rt$wh
";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"universal_connectors_live"];
}
@@ -297,7 +355,17 @@ function wevia_opus46_exec($msg) {
$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"];
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
@@ -310,7 +378,14 @@ function wevia_opus46_exec($msg) {
$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"];
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 ===
@@ -326,16 +401,22 @@ function wevia_opus46_exec($msg) {
$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"];
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("/\bblade\b|sentinel\s+(windows|blade|agent)|razer/iu", $m)) {
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:\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"];
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)
@@ -343,7 +424,11 @@ function wevia_opus46_exec($msg) {
$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"];
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
@@ -351,7 +436,10 @@ function wevia_opus46_exec($msg) {
$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"];
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)
@@ -360,7 +448,12 @@ function wevia_opus46_exec($msg) {
$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"];
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)
@@ -368,7 +461,11 @@ function wevia_opus46_exec($msg) {
$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"];
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)
@@ -380,8 +477,12 @@ function wevia_opus46_exec($msg) {
$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";
$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"];
}
@@ -392,24 +493,35 @@ function wevia_opus46_exec($msg) {
$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"];
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("/\bloki\b|logs\s+aggregation|log\s+query/iu", $m)) {
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):\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"];
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("/\bgitea\b|git\s+(interne|internal|self)|source\s+code\s+management/iu", $m)) {
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):\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"];
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
@@ -419,8 +531,10 @@ function wevia_opus46_exec($msg) {
$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";
$out = "QDRANT Vector DB — " . count($cols) . " collections:
";
foreach ($cols as $c) $out .= "" . $c["name"] . "
";
return ["provider"=>"opus46","content"=>$out,"tool"=>"qdrant_collections_list"];
}
@@ -429,7 +543,11 @@ function wevia_opus46_exec($msg) {
$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"];
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)
@@ -448,7 +566,8 @@ function wevia_opus46_exec($msg) {
"Ollama" => "http://localhost:11434/api/tags",
"Sovereign AI" => "http://127.0.0.1:4000/v1/models"
];
$out = "CAPABILITIES INVENTORY:\n";
$out = "CAPABILITIES INVENTORY:
";
$ok_count = 0;
foreach ($services as $name => $url) {
$ch = curl_init($url);
@@ -456,9 +575,11 @@ function wevia_opus46_exec($msg) {
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 .= " $status $name (HTTP $code)
";
}
$out .= "\nTotal: $ok_count/" . count($services) . " services alive";
$out .= "
Total: $ok_count/" . count($services) . " services alive";
return ["provider"=>"opus46","content"=>$out,"tool"=>"capabilities_inventory"];
}
@@ -476,7 +597,12 @@ function wevia_opus46_exec($msg) {
$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"];
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"];
}
@@ -493,7 +619,11 @@ function wevia_opus46_exec($msg) {
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"];
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"];
}
@@ -513,7 +643,10 @@ function wevia_opus46_exec($msg) {
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"];
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"];
}
@@ -523,7 +656,8 @@ function wevia_opus46_exec($msg) {
// 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";
$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();
@@ -533,10 +667,14 @@ function wevia_opus46_exec($msg) {
$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";
$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"];
@@ -544,7 +682,8 @@ function wevia_opus46_exec($msg) {
// 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";
$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();
@@ -553,10 +692,14 @@ function wevia_opus46_exec($msg) {
$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";
$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)";
@@ -580,7 +723,8 @@ function wevia_opus46_exec($msg) {
$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";
$out = "MULTIAGENTS EXEC PARALLEL (" . count($cmds) . " agents):
";
$pids = [];
$tmpfiles = [];
foreach ($cmds as $i => $cmd) {
@@ -591,7 +735,8 @@ function wevia_opus46_exec($msg) {
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";
$out .= " [agent" . ($i+1) . " " . ($agents_todo[$i] ?? "task") . "]: " . substr($result, 0, 150) . "
";
@unlink($tmpfiles[$i]);
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"multiagents_real"];
@@ -599,23 +744,28 @@ function wevia_opus46_exec($msg) {
// 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";
$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) . "%)\n";
$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) . "%)\n";
$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) . "\n";
$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\n";
$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");
@@ -634,8 +784,10 @@ function wevia_opus46_exec($msg) {
$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"];
$out .= "
FAILS:";
foreach (array_slice($fails, 0, 5) as $f) $out .= "
" . $f["endpoint"] . " → HTTP " . $f["http"];
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"em_nonreg"];
}
@@ -648,7 +800,10 @@ function wevia_opus46_exec($msg) {
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"];
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)
@@ -659,18 +814,23 @@ function wevia_opus46_exec($msg) {
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"];
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("/\b(muda|gaspillages?|wastes?|7\s*wastes)\b/iu", $m)) {
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 .= "\n [" . strtoupper($e["muda_type"]) . " sev" . $e["severity"] . "] " . $e["description"] . "" . $e["impact_euro"] . "€ (" . $e["status"] . ")";
$out .= "
[" . strtoupper($e["muda_type"]) . " sev" . $e["severity"] . "] " . $e["description"] . "" . $e["impact_euro"] . "€ (" . $e["status"] . ")";
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"muda_list"];
}
@@ -680,7 +840,8 @@ function wevia_opus46_exec($msg) {
$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"];
$out .= "
[" . $d["device_type"] . " " . $d["efficiency_pct"] . "%] " . $d["process"] . ": " . $d["mechanism"];
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"poka_yoke_list"];
}
@@ -690,7 +851,8 @@ function wevia_opus46_exec($msg) {
$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";
$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"];
}
@@ -700,7 +862,8 @@ function wevia_opus46_exec($msg) {
$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)";
$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"];
}
@@ -712,7 +875,8 @@ function wevia_opus46_exec($msg) {
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;
$out .= "
[" . strtoupper($p["phase"]) . "] " . $p["title"] . " — KPI: " . $p["kpi_name"] . " " . $p["baseline"] . "" . $p["target"] . $gap;
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"pdca_list"];
}
@@ -723,27 +887,30 @@ function wevia_opus46_exec($msg) {
$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"] . ")";
$out .= "
$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)) {
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 .= "\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"];
$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("/\ba3\b|rapport\s+a3|problem.?solving/iu", $m)) {
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 .= "\n [" . strtoupper($r["status"]) . "] " . $r["title"] . "" . substr($r["background"] ?? "", 0, 80) . "... · owner: " . $r["owner"];
$out .= "
[" . strtoupper($r["status"]) . "] " . $r["title"] . "" . substr($r["background"] ?? "", 0, 80) . "... · owner: " . $r["owner"];
}
return ["provider"=>"opus46","content"=>$out,"tool"=>"a3_reports"];
}
@@ -751,57 +918,76 @@ function wevia_opus46_exec($msg) {
// 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"];
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("/\b(liste|combien|quels?)\s+(erp|connecteurs?\s+erp)|erp\s+(disponibles?|list)|connecteurs?\s+erp/iu", $m)) {
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 .= "\n " . $e["code"] . "" . $e["name"] . " (" . $e["vendor"] . ") · " . implode(",", $e["protocols"] ?? []) . " · auth=" . $e["auth_type"];
$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("/\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)) {
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 .= "\n " . $p["code"] . "" . $p["name"] . " (" . $p["vendor"] . ") · " . implode(",", array_slice($p["models"] ?? [], 0, 3));
$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("/\b(liste|quels?|combien)\s+(industries?|secteurs?|templates?\s+metier)|industries?\s+disponibles?|metiers?\s+supportes?/iu", $m)) {
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 .= "\n " . $t["code"] . "" . $t["name"] . " (" . $t["sector"] . ") · " . count($t["vsm_depts"] ?? []) . " depts · " . count($t["compliance"] ?? []) . " compliance";
$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("/\b(connecter?|integre[rz]?|brancher?)\s+(erp|ia|ai|industrie?|secteur|template)\s+([a-z0-9\-_]+)/iu", $msg, $mm)) {
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\nConfig à compléter via /integrations-marketplace.html","tool"=>"integration_connect"];
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:\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"];
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
@@ -825,8 +1011,10 @@ function wevia_opus46_exec($msg) {
@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>");
$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");
@@ -884,7 +1072,9 @@ function wevia_opus46_exec($msg) {
// 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"];
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
@@ -918,14 +1108,19 @@ function wevia_opus46_exec($msg) {
$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"];
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\n$s","tool"=>"crons_detail"];
return ["provider"=>"opus46","content"=>"CRONS: www-data=$n root=$nr
$s","tool"=>"crons_detail"];
}
@@ -935,8 +1130,36 @@ function wevia_opus46_exec($msg) {
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 ["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;
}

File diff suppressed because it is too large Load Diff

View File

@@ -117,6 +117,7 @@ fetch('/api/ecosystem-health.php').then(r=>r.text().then(t=>{/* HTML_GUARD_V2_BA
<div class="card wiki-item" data-tags="opus46-20260416235804"><h2 style="border:0;margin:0;padding:0">DATA-COHERENCE fix 141K+ to 141K+ sur 3 ecrans: agents-archi </h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">DATA-COHERENCE fix 141K+ to 141K+ sur 3 ecrans: agents-archi enterprise-model wevia-meeting-rooms. Root cause weval-unified-pipeline. L99 304/304. Gitea push de9aade9<br><span style="color:#06b6d4">[16/04 23:58]</span></div></div>
<div class="card wiki-item" data-tags="opus46-20260417000538"><h2 style="border:0;margin:0;padding:0">WEVIA Master auto wire 3 pages + data coherence fix 22 pages</h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">WEVIA Master auto wire 3 pages + data coherence fix 22 pages 0 stale L99 304/304<br><span style="color:#06b6d4">[17/04 00:05]</span></div></div>
<div class="card wiki-item" data-tags="opus46-20260417000654"><h2 style="border:0;margin:0;padding:0">enterprise-model banner wired sed-escape bug fixed via Pytho</h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">enterprise-model banner wired sed-escape bug fixed via Python 9 pages Playwright PASS DATA-COHERENCE 0 stale<br><span style="color:#06b6d4">[17/04 00:06]</span></div></div>
<div class="card wiki-item" data-tags="opus46-20260417022610"><h2 style="border:0;margin:0;padding:0">P0 BUSINESS DOSSIERS deploye /p0-dossiers.php wire intent p0</h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">P0 BUSINESS DOSSIERS deploye /p0-dossiers.php wire intent p0_status live HCPs 146668 5 dossiers prets Kaouther Azure AD OVH SMS S151 Gmail PMTA-O365<br><span style="color:#06b6d4">[17/04 02:26]</span></div></div>
</div>
<script>
(function(){