auto-sync-0430
This commit is contained in:
File diff suppressed because it is too large
Load Diff
1
api/screens-health.json.pre-phantom-20260417-042525
Normal file
1
api/screens-health.json.pre-phantom-20260417-042525
Normal file
File diff suppressed because one or more lines are too long
@@ -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;
|
||||
}
|
||||
|
||||
1165
api/wevia-opus46-intents.php.new
Normal file
1165
api/wevia-opus46-intents.php.new
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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(){
|
||||
|
||||
Reference in New Issue
Block a user