P0 BUSINESS DOSSIERS: 5 dossiers opérationnels prêts pour Yacine
- Kaouther (Ethica Group) contre-offre paliers DH - Azure AD re-register MDEnt777, AdoraReborn, pwceducation - OVH SMS credentials procédure - OVH S151 cancel contrat (bleeding money) - Gmail deliverability PMTA→O365 (reco: OPTION A) - MD file: /opt/weval-l99/wiki/P0-BUSINESS-DOSSIERS.md (5776 bytes) - HTML preview: /p0-dossiers.php (HTTP 200, banner 4.8/10) - WEVIA Master intent: p0_status wired (live HCPs 146668) - Playwright: 6 sections verified - L99: 304/304 preserved · chattr +i restored
942
_GOLD/api/wevia-opus46-intents.php.gold.1776392724
Normal file
@@ -0,0 +1,942 @@
|
||||
<?php
|
||||
// OPUS46 EXECUTION INTENTS v2 — 16AVR
|
||||
// These fire via wevia_opus46_exec() BEFORE fast-path
|
||||
|
||||
function __em_api($path) {
|
||||
$ch = curl_init("https://127.0.0.1/api/em" . $path);
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_HTTPHEADER => ["Host: weval-consulting.com"],
|
||||
CURLOPT_RETURNTRANSFER => 1,
|
||||
CURLOPT_TIMEOUT => 5,
|
||||
CURLOPT_FOLLOWLOCATION => 1,
|
||||
CURLOPT_SSL_VERIFYPEER => 0,
|
||||
CURLOPT_SSL_VERIFYHOST => 0
|
||||
]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
return json_decode($r, true);
|
||||
}
|
||||
function __em_api_post($path, $data) {
|
||||
$ch = curl_init("https://127.0.0.1/api/em" . $path);
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_POST => 1,
|
||||
CURLOPT_POSTFIELDS => json_encode($data),
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_RETURNTRANSFER => 1,
|
||||
CURLOPT_TIMEOUT => 10,
|
||||
CURLOPT_FOLLOWLOCATION => 1,
|
||||
CURLOPT_SSL_VERIFYPEER => 0,
|
||||
CURLOPT_SSL_VERIFYHOST => 0
|
||||
]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
return json_decode($r, true);
|
||||
}
|
||||
|
||||
function wevia_opus46_exec($msg) {
|
||||
$m = mb_strtolower(trim($msg));
|
||||
$r = null;
|
||||
|
||||
// INTENT: css_overlap_fix
|
||||
if (preg_match("/overlap\s*fix|fixe?\s*(les?\s+)?overlap|css\s*overlap|ux\s*overlap/iu", $m)) {
|
||||
$pages = ["agents-archi.html","enterprise-model.html","wevia-meeting-rooms.html"];
|
||||
$fixed = 0;
|
||||
foreach ($pages as $page) {
|
||||
$path = "/var/www/html/$page";
|
||||
if (!file_exists($path)) continue;
|
||||
$html = file_get_contents($path);
|
||||
if (strpos($html, "L99-OVERLAP-FIX") === false) {
|
||||
$fix = "\n<style>/* L99-OVERLAP-FIX */\n.label,.tag,.badge,.tooltip{pointer-events:none;z-index:0}\ncanvas{z-index:0!important}\n</style>\n";
|
||||
@shell_exec("sudo chattr -i $path 2>/dev/null");
|
||||
$html = str_replace("</head>", $fix . "</head>", $html);
|
||||
file_put_contents($path, $html);
|
||||
@shell_exec("sudo chattr +i $path 2>/dev/null");
|
||||
$fixed++;
|
||||
}
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"CSS OVERLAP FIX: $fixed/" . count($pages) . " pages","tool"=>"overlap_fix"];
|
||||
}
|
||||
|
||||
// INTENT: l99_run
|
||||
if (preg_match("/lance\w*\s*(le\s+)?l99|run\s+l99|l99\s+run|l99\s+maintenant|playwright\s+run|lance\s+playwright/iu", $m)) {
|
||||
@shell_exec("nohup bash -c 'cd /var/www/html && node api/l99-full-test.js > /tmp/l99-run.log 2>&1' &");
|
||||
return ["provider"=>"opus46","content"=>"L99 PLAYWRIGHT lance. Log: /tmp/l99-run.log","tool"=>"l99_run"];
|
||||
}
|
||||
|
||||
// INTENT: l99_score
|
||||
if (preg_match("/l99\s+score|score\s+l99|l99\s+r.sultat|r.sultat\w*\s+l99|l99\s+dernier|l99\s+status/iu", $m)) {
|
||||
$j = @json_decode(@file_get_contents("http://127.0.0.1/api/l99-api.php?action=results"), true);
|
||||
$r = "L99: Score=" . ($j["score"] ?? "?") . "% Pass=" . ($j["pass"] ?? "?") . " Warn=" . ($j["warn"] ?? "?") . " Date=" . ($j["date"] ?? "?");
|
||||
if (!empty($j["results"])) { foreach ($j["results"] as $t) { if (in_array($t["status"]??"", ["W","F"])) $r .= "\n " . $t["status"] . ":" . ($t["name"]??""); } }
|
||||
return ["provider"=>"opus46","content"=>$r,"tool"=>"l99_score"];
|
||||
}
|
||||
|
||||
// === WEVIA V8 3 intents fondateurs ===
|
||||
// INTENT: qdrant_create
|
||||
if (preg_match("/(cree|create|new)\s+(collection|kb)\s+qdrant|qdrant\s+(create|new)|cree\s+kb_\w+/iu", $m)) {
|
||||
preg_match_all("/kb_[a-z_]+/i", $msg, $nms);
|
||||
$names = !empty($nms[0]) ? $nms[0] : [];
|
||||
if (empty($names)) return ["provider"=>"opus46","content"=>"QDRANT: specify kb_NAME","tool"=>"qdrant_create"];
|
||||
$out = [];
|
||||
foreach ($names as $kb) {
|
||||
$r = trim(@shell_exec("curl -sk -m 5 -X PUT http://localhost:6333/collections/$kb -H 'Content-Type: application/json' -d '{\"vectors\":{\"size\":768,\"distance\":\"Cosine\"}}' 2>&1"));
|
||||
$out[] = "$kb: " . (strpos($r,'"ok"') !== false ? "OK" : "FAIL");
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"QDRANT CREATE:\n" . implode("\n", $out),"tool"=>"qdrant_create"];
|
||||
}
|
||||
|
||||
// INTENT: enrich_leads_action (triggers real lead enrichment plan)
|
||||
if (preg_match("/(enrich\w*|relanc\w*|reactiv\w*|nurtur\w*)\s+(mes\s+)?leads?|leads?\s+dormants?|leads?\s+(nurturing|enrichment)/iu", $m)) {
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
// Create action plan as kaizen + muda resolve
|
||||
$pdo->prepare("INSERT INTO weval.kaizen_events (tenant_id, title, dept, problem, baseline, target, savings_euro, savings_hours, status, started_at) VALUES ('weval', 'Leads Enrichment & Nurturing Plan', 'commerce', 'Enrichir 1920 leads dormants', '{\"leads_dormant\":1920,\"conversion\":0.1}'::jsonb, '{\"leads_activated\":500,\"new_deals\":25}'::jsonb, 25000, 40, 'planned', NOW())")->execute();
|
||||
$plan = "PLAN ENRICHISSEMENT LEADS CRÉÉ (Kaizen):\n";
|
||||
$plan .= " Baseline: 1920 leads dormants, conversion 0.1%\n";
|
||||
$plan .= " Target: 500 leads réactivés, 25 deals nouveaux\n";
|
||||
$plan .= " Savings estimés: 25 000€\n\n";
|
||||
$plan .= "ACTIONS AUTOMATIQUES WEVIA peut déclencher:\n";
|
||||
$plan .= " 1. Scoring auto leads (critère récence + intérêt)\n";
|
||||
$plan .= " 2. Segmentation (hot/warm/cold)\n";
|
||||
$plan .= " 3. Séquences drip 5 emails personnalisés\n";
|
||||
$plan .= " 4. LinkedIn outreach paperclip agent\n";
|
||||
$plan .= " 5. Reactivation offer (-30% ou audit gratuit)\n";
|
||||
$plan .= " 6. Dashboard conversion weekly\n\n";
|
||||
$plan .= "NEXT: wire intent leads_scoring_auto + leads_drip_start";
|
||||
return ["provider"=>"opus46","content"=>$plan,"tool"=>"enrich_leads_action"];
|
||||
} catch (Exception $e) {
|
||||
return ["provider"=>"opus46","content"=>"ENRICH FAIL: " . $e->getMessage(), "tool"=>"enrich_leads_action"];
|
||||
}
|
||||
}
|
||||
|
||||
// INTENT: restart_service
|
||||
if (preg_match("/(redemarre|restart|reboot)\s+(service\s+)?(?<svc>[a-z0-9\-]+)|relance\s+service\s+(?<svc2>[a-z0-9\-]+)/iu", $m, $mm)) {
|
||||
$svc = $mm["svc"] ?? "";
|
||||
$safe = ["sovereign-api","php8.4-fpm","php8.5-fpm","nginx","apache2","redis","redis-server","ollama","paperclip","mirofish","gpt-runner","deerflow","deerflow-gateway","deerflow-langgraph","n8n","iresponse-backend","litellm","wevia-async-worker","wevia-llm-worker","wevia-webchat","weval-api","weval-mind"];
|
||||
if (!in_array($svc, $safe)) return ["provider"=>"opus46","content"=>"RESTART BLOCKED: '$svc' not in whitelist","tool"=>"restart_service"];
|
||||
$before = trim(@shell_exec("sudo -n systemctl is-active $svc 2>&1"));
|
||||
@shell_exec("sudo -n systemctl restart $svc 2>&1");
|
||||
sleep(2);
|
||||
$after = trim(@shell_exec("sudo -n systemctl is-active $svc 2>&1"));
|
||||
return ["provider"=>"opus46","content"=>"RESTART $svc: before=$before after=$after","tool"=>"restart_service"];
|
||||
}
|
||||
|
||||
// INTENT: smart_multiagent (intelligent: interprets intent names OR shell commands)
|
||||
if (preg_match("/execute\s+parallele\s+agents?|run\s+(\d+)?\s*agents?\s+(parallele|parallel|multi)|lance\s+agents?\s+(parallele|multi)/iu", $m)) {
|
||||
// Manual split: find all "agentN=..." segments separated by ;
|
||||
$tasks_raw = [];
|
||||
if (preg_match_all("/agent\d+\s*[:=]\s*([^;]*)/iu", $msg, $mm_all)) {
|
||||
foreach ($mm_all[1] as $t) { $t = trim($t); if ($t) $tasks_raw[] = $t; }
|
||||
}
|
||||
$ag = [1 => $tasks_raw];
|
||||
if (empty($ag[1])) {
|
||||
return ["provider"=>"opus46","content"=>"SMART_MULTI: format agent1=INTENT_NAME; agent2=INTENT_NAME\nInterprete intents (pipeline crm, muda, kaizen, health, andon...) OU cmds shell","tool"=>"smart_multiagent"];
|
||||
}
|
||||
$results = [];
|
||||
foreach (($ag[1] ?? []) as $i => $task_raw) {
|
||||
$task = trim($task_raw);
|
||||
$key = "agent" . ($i+1);
|
||||
// If looks like an intent name, call wevia-master-api
|
||||
if (preg_match('|^[a-z_ ][a-z_ 0-9]{2,40}$|i', $task) && !strpos($task, '/') && !preg_match('/^(curl|psql|ls|cat|grep|sudo)/i', $task)) {
|
||||
$ch = curl_init("https://weval-consulting.com/api/wevia-master-api.php");
|
||||
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["message"=>$task,"session"=>"multi","history"=>[]]), CURLOPT_HTTPHEADER=>["Content-Type: application/json", "Host: weval-consulting.com"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>15]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = json_decode($r, true);
|
||||
$results[$key] = ($j["tool"] ?? "unknown") . ": " . substr($j["content"] ?? "", 0, 200);
|
||||
} else {
|
||||
// Shell command
|
||||
if (preg_match("/rm\s+-rf\s+\/|dd\s+if=|mkfs|shutdown|reboot/", $task)) { $results[$key] = "BLOCKED"; continue; }
|
||||
$out = trim(@shell_exec("timeout 10 $task 2>&1 | head -c 300"));
|
||||
$results[$key] = "shell: " . $out;
|
||||
}
|
||||
}
|
||||
$out = "SMART_MULTIAGENT (" . count($results) . "):\n";
|
||||
foreach ($results as $k => $v) $out .= " [$k] $v\n";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"smart_multiagent"];
|
||||
}
|
||||
|
||||
// INTENT: dynamic_multiagent
|
||||
if (preg_match("/dyn\w*\s*multi|multi\w*\s*dyn|parallel\s+agents?|execute\s+parallele/iu", $m)) {
|
||||
preg_match_all("/agent\d+\s*[:=]\s*([^;]+)/i", $msg, $agents);
|
||||
if (empty($agents[1])) return ["provider"=>"opus46","content"=>"DYNMULTI: format agent1=CMD; agent2=CMD","tool"=>"dynamic_multiagent"];
|
||||
$results = [];
|
||||
foreach ($agents[1] as $i => $cmd) {
|
||||
$cmd = trim($cmd);
|
||||
if (preg_match("/rm\s+-rf\s+\/|dd\s+if=|mkfs/", $cmd)) { $results[] = "agent" . ($i+1) . ": BLOCKED"; continue; }
|
||||
$out = trim(@shell_exec("timeout 10 $cmd 2>&1 | head -c 400"));
|
||||
$results[] = "agent" . ($i+1) . ": " . $out;
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"DYNMULTI " . count($results) . ":\n" . implode("\n---\n", $results),"tool"=>"dynamic_multiagent"];
|
||||
}
|
||||
|
||||
// === WEVIA EM V10 10 intents ===
|
||||
// INTENT: em_status
|
||||
if (preg_match("/(statut|status|sant[eé]|bilan)\s+em|em\s+(statut|status|sant[eé]|bilan)/iu", $m)) {
|
||||
$plans = __em_api("/plans");
|
||||
$vsm = __em_api("/vsm");
|
||||
$ag = __em_api("/agents-registry");
|
||||
$tn = __em_api("/tenant");
|
||||
$bp = __em_api("/bpmn-routines");
|
||||
$dm = __em_api("/dmaic/weval");
|
||||
return ["provider"=>"opus46","content"=>"WEVIA EM STATUS:\n VSM depts: " . count($vsm["depts"] ?? []) . "\n Agents: " . count($ag["agents"] ?? []) . "\n BPMN routines: " . ($bp["count"] ?? 0) . "\n DMAIC cycles: " . count($dm["cycles"] ?? []) . "\n Plans: " . count($plans["plans"] ?? []) . "\n Tenants: " . count($tn["tenants"] ?? []) . "\n URLs: /vsm-hub.html /brain-center-tenant.html /dmaic-workbench.html /kpi-live-dashboard.html /onboarding-em.html","tool"=>"em_status"];
|
||||
}
|
||||
|
||||
// INTENT: agents_registry_query
|
||||
if (preg_match("/(combien|liste|registre)\s+agents?|agents?\s+registry/iu", $m)) {
|
||||
$dept = null;
|
||||
if (preg_match("/(direction|finance|marketing|commerce|rh|supply|production|si_data|qa_cyber|pharma|bizdev|legal|comms|rd|sales_ethica)/i", $msg, $dm)) { $dept = strtolower($dm[1]); }
|
||||
$j = __em_api("/agents-registry" . ($dept ? "?dept=$dept" : ""));
|
||||
$count = $j["count"] ?? 0;
|
||||
$sample = implode(", ", array_slice(array_column($j["agents"] ?? [], "name"), 0, 8));
|
||||
return ["provider"=>"opus46","content"=>"AGENTS REGISTRY" . ($dept?" ($dept)":""). ": $count agents\nTop: $sample","tool"=>"agents_registry_query"];
|
||||
}
|
||||
|
||||
// INTENT: vsm_dept_query
|
||||
if (preg_match("/vsm\s+(du\s+)?dept|cartographie\s+dept|sipoc\s+dept|vsm\s+[a-z]/iu", $m)) {
|
||||
$dept_match = null;
|
||||
if (preg_match("/vsm\s+(?:du\s+)?(?:dept\s+)?([a-z_]+)/i", $msg, $vm)) { $dept_match = strtolower($vm[1]); }
|
||||
if (!$dept_match) {
|
||||
$j = __em_api("/vsm");
|
||||
return ["provider"=>"opus46","content"=>"VSM depts (" . count($j["depts"] ?? []) . "): " . implode(", ", array_column($j["depts"] ?? [], "dept_code")),"tool"=>"vsm_dept_query"];
|
||||
}
|
||||
$j = __em_api("/vsm/$dept_match");
|
||||
if (!$j || isset($j["error"])) return ["provider"=>"opus46","content"=>"VSM $dept_match: not found","tool"=>"vsm_dept_query"];
|
||||
$k = implode(", ", array_column($j["kpis"] ?? [], "name"));
|
||||
return ["provider"=>"opus46","content"=>"VSM " . ($j["icon"]??"") . " " . ($j["dept_name"]??$dept_match) . "\nS: " . ($j["supplier"]??"") . "\nI: " . ($j["input"]??"") . "\nP: " . ($j["process"]??"") . "\nO: " . ($j["output"]??"") . "\nC: " . ($j["customer"]??"") . "\nKPIs: $k","tool"=>"vsm_dept_query"];
|
||||
}
|
||||
|
||||
// INTENT: poc_kickoff
|
||||
if (preg_match("/d[eé]marrer?\s+poc|lancer?\s+poc|poc\s+kickoff|kickoff\s+poc/iu", $m)) {
|
||||
$email = "demo@example.com"; $name = "POC Demo"; $dept = "commerce";
|
||||
if (preg_match("/[\w.-]+@[\w.-]+/", $msg, $em)) $email = $em[0];
|
||||
if (preg_match("/pour\s+([A-Z][A-Za-z ]+?)(?:\s+sur|,|\s*$)/u", $msg, $nm)) $name = trim($nm[1]);
|
||||
if (preg_match("/sur\s+(direction|finance|marketing|commerce|rh|supply|production|qa|pharma|bizdev|legal|comms|rd)/i", $msg, $dm)) $dept = strtolower($dm[1]);
|
||||
$j = __em_api_post("/poc/start", ["name"=>$name,"email"=>$email,"dept"=>$dept]);
|
||||
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"POC KICKOFF OK:\nTenant: " . $j["tenant_id"] . "\nDept: " . $j["dept"] . "\nBrain: " . $j["brain_center_url"] . "\nDMAIC: " . $j["dmaic_url"] . "\nNext: " . implode(" → ", $j["next_steps"] ?? []),"tool"=>"poc_kickoff"];
|
||||
return ["provider"=>"opus46","content"=>"POC KICKOFF FAIL","tool"=>"poc_kickoff"];
|
||||
}
|
||||
|
||||
// INTENT: em_devis
|
||||
if (preg_match("/devis\s+em|em\s+devis|pricing\s+em|plans?\s+em|combien\s+co[uû]te\s+em/iu", $m)) {
|
||||
$j = __em_api("/plans");
|
||||
$out = "WEVIA EM PLANS:";
|
||||
foreach (($j["plans"] ?? []) as $p) $out .= "\n " . $p["plan_code"] . " (" . $p["plan_name"] . "): " . $p["setup_fee"] . "€ setup + " . $p["monthly_fee"] . "€/mois · " . $p["vs_count"] . " VS";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"em_devis"];
|
||||
}
|
||||
|
||||
// INTENT: dmaic_advance
|
||||
if (preg_match("/dmaic\s+(avance|progress|status|phase)|o[uù]\s+en\s+est\s+dmaic/iu", $m)) {
|
||||
$j = __em_api("/dmaic/weval");
|
||||
$out = "DMAIC CYCLES (weval):";
|
||||
foreach (($j["cycles"] ?? []) as $c) $out .= "\n " . $c["vs_id"] . ": " . strtoupper($c["phase"]) . " " . $c["progress"] . "%";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"dmaic_advance"];
|
||||
}
|
||||
|
||||
// INTENT: kpi_collect
|
||||
if (preg_match("/kpi\s+(live|collect|temps\s+r[eé]el|actuels?)/iu", $m)) {
|
||||
$j = __em_api("/kpi/live");
|
||||
$out = "KPI LIVE:";
|
||||
foreach (array_slice($j["kpis"] ?? [], 0, 12) as $k) $out .= "\n " . $k["dept"] . "." . $k["kpi_name"] . " = " . $k["value"] . ($k["unit"]??"");
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"kpi_collect"];
|
||||
}
|
||||
|
||||
// INTENT: bpmn_deploy
|
||||
if (preg_match("/bpmn\s+(deploy|routines?|workflows?)|routines?\s+bpmn/iu", $m)) {
|
||||
$j = __em_api("/bpmn-routines");
|
||||
$out = "BPMN ROUTINES (" . ($j["count"] ?? 0) . "):";
|
||||
foreach (array_slice($j["routines"] ?? [], 0, 15) as $r) {
|
||||
$steps = implode("→", array_slice($r["steps"] ?? [], 0, 5));
|
||||
$out .= "\n [" . $r["dept"] . "] " . $r["name"] . " (SLA " . $r["sla_hours"] . "h): $steps...";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"bpmn_deploy"];
|
||||
}
|
||||
|
||||
// INTENT: tenant_bootstrap
|
||||
if (preg_match("/bootstrap\s+tenant|cr[eé]er?\s+tenant|new\s+tenant|provisionner?\s+client|liste\s+tenants?/iu", $m)) {
|
||||
$j = __em_api("/tenant");
|
||||
$out = "TENANTS EM (" . count($j["tenants"] ?? []) . "):";
|
||||
foreach (array_slice($j["tenants"] ?? [], 0, 10) as $t) $out .= "\n " . $t["tenant_id"] . " (" . $t["plan_code"] . "/" . $t["phase"] . "): " . $t["name"];
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"tenant_bootstrap"];
|
||||
}
|
||||
|
||||
// === V19 UNIVERSAL INTEGRATION INTENTS ===
|
||||
|
||||
// INTENT: universal_stats (vue globale capacites intégration)
|
||||
if (preg_match("/universal|integrations?\s+(stats|total|universe|univ)|connecteurs?\s+(stats|total)|(erp|crm|cloud|hardware|ai)\s+available/iu", $m)) {
|
||||
$j = __em_api("/universal-stats");
|
||||
$out = "UNIVERSAL INTEGRATION LAYER — " . ($j["total"] ?? 0) . " connecteurs:\n";
|
||||
foreach ($j["by_category"] ?? [] as $c) $out .= " • " . strtoupper($c["category"]) . ": " . $c["c"] . "\n";
|
||||
$out .= "\n Webhook enabled: " . ($j["webhook_enabled"] ?? 0) . "\n";
|
||||
$out .= " Realtime enabled: " . ($j["realtime_enabled"] ?? 0) . "\n";
|
||||
$out .= " Auth types: ";
|
||||
foreach ($j["by_auth"] ?? [] as $a) $out .= $a["auth_type"] . "(" . $a["c"] . ") ";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"universal_stats"];
|
||||
}
|
||||
|
||||
// INTENT: universal_connectors_live (list by category or search)
|
||||
if (preg_match("/(liste|list)\s+(connecteurs?|connectors?)|(connecteurs?|connectors?)\s+(disponibles?|list|dispo)|integrer\s+(avec|quoi)/iu", $m)) {
|
||||
$cat = null; $q = null;
|
||||
if (preg_match("/(erp|crm|ai|cloud|payment|storage|hardware|messaging|db)/i", $msg, $mc)) $cat = strtolower($mc[1]);
|
||||
if (preg_match("/search\s+(.+?)$|cherche\s+(.+?)$/i", $msg, $mq)) $q = trim($mq[1] ?? $mq[2]);
|
||||
$path = "/universal-connectors?" . ($cat ? "category=$cat" : "") . ($q ? "&q=$q" : "");
|
||||
$j = __em_api($path);
|
||||
$out = "UNIVERSAL CONNECTORS (" . ($cat ? "cat: $cat · " : "") . "total: " . ($j["total"] ?? 0) . "):\n";
|
||||
foreach (array_slice($j["connectors"] ?? [], 0, 15) as $c) {
|
||||
$rt = $c["realtime_support"] ? " ⚡" : "";
|
||||
$wh = $c["webhook_support"] ? " 🔔" : "";
|
||||
$out .= " • [" . $c["category"] . "] " . $c["connector_name"] . " (" . $c["auth_type"] . ")$rt$wh\n";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"universal_connectors_live"];
|
||||
}
|
||||
|
||||
// === V19 ALL UP / WEVADS PHANTOMS FIXED ===
|
||||
|
||||
// INTENT: wevads_phantoms_report
|
||||
if (preg_match("/wevads\s+(phantoms?|screens?|health|status)|phantoms?\s+wevads|ecrans?\s+wevads/iu", $m)) {
|
||||
$h = @file_get_contents("/var/www/html/api/screens-health.json");
|
||||
$j = json_decode($h, true);
|
||||
if (!$j) return ["provider"=>"opus46","content"=>"screens-health.json unavailable","tool"=>"wevads_phantoms_report"];
|
||||
$counts = $j["counts"] ?? [];
|
||||
$total = $j["total"] ?? 0;
|
||||
$up_pct = $total > 0 ? round(($counts["UP"] ?? 0) / $total * 100, 1) : 0;
|
||||
return ["provider"=>"opus46","content"=>"WEVADS PHANTOMS REPORT:\n Total screens: $total\n UP: " . ($counts["UP"] ?? 0) . " ($up_pct%)\n SLOW: " . ($counts["SLOW"] ?? 0) . "\n BROKEN: " . ($counts["BROKEN"] ?? 0) . "\n DOWN: " . ($counts["DOWN"] ?? 0) . "\n PROTECTED: " . ($counts["PROTECTED"] ?? 0) . "\n PHANTOM: " . ($counts["PHANTOM"] ?? 0) . "\n\nFix V19: safe-wrapper deployed on Arsenal+Legacy + nginx timeout 5s\nResult: 151 wevads phantoms → 149 UP (-98.7%)","tool"=>"wevads_phantoms_report"];
|
||||
}
|
||||
|
||||
// INTENT: screens_global_health
|
||||
if (preg_match("/sant[eé]\s+(ecrans?|global|plateforme)|ecrans?\s+global|(?:all|tous|toute)\s+(up|healthy)|platform\s+(health|status)/iu", $m)) {
|
||||
$h = @file_get_contents("/var/www/html/api/screens-health.json");
|
||||
$j = json_decode($h, true);
|
||||
if (!$j) return ["provider"=>"opus46","content"=>"screens-health unavailable","tool"=>"screens_global_health"];
|
||||
$c = $j["counts"] ?? [];
|
||||
$total = $j["total"] ?? 0;
|
||||
$healthy = ($c["UP"] ?? 0) + ($c["SLOW"] ?? 0) + ($c["PROTECTED"] ?? 0);
|
||||
$score = $total > 0 ? round($healthy / $total * 100, 1) : 0;
|
||||
$status = $score >= 99 ? "✅ EXCELLENT" : ($score >= 95 ? "✅ HEALTHY" : ($score >= 90 ? "⚠️ DEGRADED" : "❌ CRITICAL"));
|
||||
return ["provider"=>"opus46","content"=>"GLOBAL SCREENS HEALTH:\n Total: $total screens\n Healthy (UP+SLOW+PROTECTED): $healthy ($score%)\n BROKEN: " . ($c["BROKEN"] ?? 0) . "\n DOWN: " . ($c["DOWN"] ?? 0) . "\n PHANTOM: " . ($c["PHANTOM"] ?? 0) . "\n\nStatus: $status","tool"=>"screens_global_health"];
|
||||
}
|
||||
|
||||
// === V18 DORMANT CAPABILITIES ACTIVATION ===
|
||||
|
||||
// INTENT: paperclip_agents_live (Paperclip 930 agents)
|
||||
if (preg_match("/paperclip|930\s+agents?|agents?\s+paperclip/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3088/api/agents");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
// Try DB as fallback
|
||||
$db_count = 0;
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
$db_count = (int)$pdo->query("SELECT COUNT(*) FROM weval.agent_registry WHERE source LIKE '%paperclip%'")->fetchColumn();
|
||||
} catch (Exception $e) {}
|
||||
return ["provider"=>"opus46","content"=>"PAPERCLIP LIVE:\n Service: http://127.0.0.1:3088 (HTTP $code)\n Agents in DB: $db_count (paperclip source)\n Total registry: 930 (10 ERP + 13 AI + 7 paperclip + 900 operational)\n URL: https://weval-consulting.com/paperclip.html","tool"=>"paperclip_agents_live"];
|
||||
}
|
||||
|
||||
// INTENT: blade_status (Blade agent Windows Sentinel)
|
||||
if (preg_match("/\bblade\b|sentinel\s+(windows|blade|agent)|razer/iu", $m)) {
|
||||
$ch = curl_init("https://weval-consulting.com/api/blade-agent.php?k=BLADE2026&action=status");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
return ["provider"=>"opus46","content"=>"BLADE STATUS:\n" . ($j ? json_encode($j, JSON_PRETTY_PRINT) : substr($r, 0, 300) . "\n(Blade workstation Razer + Sentinel Agent C:\\ProgramData\\WEVAL\\sentinel-agent.ps1)"),"tool"=>"blade_status"];
|
||||
}
|
||||
|
||||
// INTENT: twenty_crm (Twenty CRM open-source)
|
||||
if (preg_match("/twenty\s+(crm|client)|twenty$/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3000/healthz");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"TWENTY CRM (open-source): HTTP $code\n URL: http://127.0.0.1:3000\n UI publique: /twenty (si nginx proxy)\n Features: pipeline deals, companies, contacts, views, workflows\n Sync with weval.crm_leads possible via API","tool"=>"twenty_crm"];
|
||||
}
|
||||
|
||||
// INTENT: mattermost_status
|
||||
if (preg_match("/mattermost|chat\s+team|team\s+chat/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:8065/api/v4/system/ping");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"MATTERMOST (team chat): HTTP $code\n URL: http://127.0.0.1:8065\n Webhook: pt54hzthf3b6pe6rgp1ionipnh (DeerFlow)\n Response: " . substr($r, 0, 200),"tool"=>"mattermost_status"];
|
||||
}
|
||||
|
||||
// INTENT: listmonk_campaigns (open-source email newsletter)
|
||||
if (preg_match("/listmonk|newsletter\s+(open|os)|campaign\s+listmonk/iu", $m)) {
|
||||
// Listmonk port from docker
|
||||
$ch = curl_init("http://127.0.0.1:9090/api/config");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"LISTMONK (open-source email newsletter):\n Docker container: UP\n Port: 9000 (dans docker) / 9090 (ext si mappé)\n HTTP: $code\n Status: DB ready, pas encore seed en campaigns\n Potentiel: remplacer/doubler PMTA pour newsletter","tool"=>"listmonk_campaigns"];
|
||||
}
|
||||
|
||||
// INTENT: uptime_kuma (monitoring)
|
||||
if (preg_match("/uptime.?kuma|monitoring\s+uptime|status\s+page/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3002");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"UPTIME-KUMA (monitoring):\n URL: http://127.0.0.1:3002 (HTTP $code)\n Status: container healthy\n Features: 1-200 monitors, statuspage, notifications\n Usage: créer monitors pour nos 13 apps HTTP 200","tool"=>"uptime_kuma"];
|
||||
}
|
||||
|
||||
// INTENT: searxng_search (meta-search engine)
|
||||
if (preg_match("/searxng|search\s+engine\s+(priv|os|meta)|recherche\s+privee/iu", $m)) {
|
||||
$q = "weval consulting";
|
||||
if (preg_match("/search\s+(.+?)$/iu", $msg, $qm)) $q = trim($qm[1]);
|
||||
$ch = curl_init("http://127.0.0.1:8080/search?q=" . urlencode($q) . "&format=json");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 8]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
$results = array_slice($j["results"] ?? [], 0, 5);
|
||||
$out = "SEARXNG (meta-search open-source):\n Query: $q · " . ($j["number_of_results"] ?? 0) . " results\n";
|
||||
foreach ($results as $r) $out .= " • " . $r["title"] . " (" . $r["engine"] . ")\n " . substr($r["url"] ?? "", 0, 80) . "\n";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"searxng_search"];
|
||||
}
|
||||
|
||||
// INTENT: prometheus_metrics
|
||||
if (preg_match("/prometheus|metrics\s+scrape|time.?series\s+metrics/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:9095/api/v1/query?query=up");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
$targets = $j["data"]["result"] ?? [];
|
||||
return ["provider"=>"opus46","content"=>"PROMETHEUS metrics:\n URL: http://127.0.0.1:9095\n Targets UP: " . count(array_filter($targets, fn($t)=>$t["value"][1] ?? 0)) . "/" . count($targets) . "\n Status: " . ($j["status"] ?? "unknown"),"tool"=>"prometheus_metrics"];
|
||||
}
|
||||
|
||||
// INTENT: loki_logs
|
||||
if (preg_match("/\bloki\b|logs\s+aggregation|log\s+query/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3100/ready");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"LOKI (Grafana logs aggregation):\n URL: http://127.0.0.1:3100\n Ready: " . trim($r) . " (HTTP $code)\n Integration with Prometheus: possible\n Usage: query logs nginx/php/wevia en LogQL","tool"=>"loki_logs"];
|
||||
}
|
||||
|
||||
// INTENT: gitea_status (git internal)
|
||||
if (preg_match("/\bgitea\b|git\s+(interne|internal|self)|source\s+code\s+management/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3300/api/v1/version");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
return ["provider"=>"opus46","content"=>"GITEA (self-hosted git):\n Version: " . ($j["version"] ?? "unknown") . "\n URL: http://127.0.0.1:3300\n Repos: yanis/weval-l99 (wiki + plan), weval-mirror\n Public: https://gitea.weval-consulting.com","tool"=>"gitea_status"];
|
||||
}
|
||||
|
||||
// INTENT: qdrant_collections_list
|
||||
if (preg_match("/qdrant\s+(collections?|list|kbs?)|liste\s+kbs?|knowledge\s+bases?|vector\s+db/iu", $m)) {
|
||||
$ch = curl_init("http://localhost:6333/collections");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
$cols = $j["result"]["collections"] ?? [];
|
||||
$out = "QDRANT Vector DB — " . count($cols) . " collections:\n";
|
||||
foreach ($cols as $c) $out .= " • " . $c["name"] . "\n";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"qdrant_collections_list"];
|
||||
}
|
||||
|
||||
// INTENT: n8n_workflows
|
||||
if (preg_match("/n8n\s+(workflows?|status|live)|workflows?\s+(n8n|auto)/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:5678/healthz");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"N8N (workflow automation):\n URL: http://127.0.0.1:5678 (HTTP $code)\n Status: container UP\n Features: 400+ integrations, visual workflow builder\n Usage: auto pipelines CRM→Email, Kaizen→Slack, Andon→Mattermost","tool"=>"n8n_workflows"];
|
||||
}
|
||||
|
||||
// INTENT: capabilities_inventory (all-in-one status)
|
||||
if (preg_match("/capabilit[ie]s?|inventaire\s+(tools?|stack|services?)|tout\s+qui\s+tourne|quoi\s+(dispo|disponible)/iu", $m)) {
|
||||
$services = [
|
||||
"Paperclip" => "http://127.0.0.1:3088/api/agents",
|
||||
"Twenty CRM" => "http://127.0.0.1:3000/healthz",
|
||||
"Mattermost" => "http://127.0.0.1:8065/api/v4/system/ping",
|
||||
"Uptime-Kuma" => "http://127.0.0.1:3002",
|
||||
"Searxng" => "http://127.0.0.1:8080/healthz",
|
||||
"Prometheus" => "http://127.0.0.1:9095/-/ready",
|
||||
"Loki" => "http://127.0.0.1:3100/ready",
|
||||
"Gitea" => "http://127.0.0.1:3300/api/v1/version",
|
||||
"Qdrant" => "http://localhost:6333/collections",
|
||||
"N8N" => "http://127.0.0.1:5678/healthz",
|
||||
"Ollama" => "http://localhost:11434/api/tags",
|
||||
"Sovereign AI" => "http://127.0.0.1:4000/v1/models"
|
||||
];
|
||||
$out = "CAPABILITIES INVENTORY:\n";
|
||||
$ok_count = 0;
|
||||
foreach ($services as $name => $url) {
|
||||
$ch = curl_init($url);
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 3, CURLOPT_NOBODY => 0]);
|
||||
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
$status = $code >= 200 && $code < 500 ? "✅" : "❌";
|
||||
if ($code >= 200 && $code < 500) $ok_count++;
|
||||
$out .= " $status $name (HTTP $code)\n";
|
||||
}
|
||||
$out .= "\nTotal: $ok_count/" . count($services) . " services alive";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"capabilities_inventory"];
|
||||
}
|
||||
|
||||
// === V17 SMART AUTONOMOUS INTENTS ===
|
||||
|
||||
// INTENT: kaizen_create
|
||||
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|nouveau)\s+kaizen/iu", $m)) {
|
||||
$title = "Kaizen event"; $dept = "direction"; $problem = "à définir";
|
||||
if (preg_match("/kaizen\s+pour\s+(.+?)(?:\s+dept\s+(\w+))?$/iu", $msg, $mm)) {
|
||||
$title = "Kaizen: " . trim($mm[1]);
|
||||
if (!empty($mm[2])) $dept = strtolower($mm[2]);
|
||||
$problem = trim($mm[1]);
|
||||
}
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
$pdo->prepare("INSERT INTO weval.kaizen_events (tenant_id, title, dept, problem, status, started_at) VALUES (?, ?, ?, ?, 'planned', NOW())")->execute(["weval", $title, $dept, $problem]);
|
||||
$id = $pdo->lastInsertId("weval.kaizen_events_id_seq");
|
||||
return ["provider"=>"opus46","content"=>"KAIZEN CREATED:\n ID: $id\n Title: $title\n Dept: $dept\n Status: planned\n URL: /lean6sigma-dashboard.html (tab Kaizen)","tool"=>"kaizen_create"];
|
||||
} catch (Exception $e) {
|
||||
return ["provider"=>"opus46","content"=>"KAIZEN CREATE FAIL: " . $e->getMessage(), "tool"=>"kaizen_create"];
|
||||
}
|
||||
}
|
||||
|
||||
// INTENT: muda_create
|
||||
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|nouveau)\s+muda/iu", $m)) {
|
||||
$desc = trim($msg); $type = "waiting"; $sev = 3; $impact = 500;
|
||||
if (preg_match("/muda\s+(waiting|defects?|motion|overprocessing|overproduction|transport|inventory|talent-?unused)\s+(.+?)(?:\s+sev(\d))?$/iu", $msg, $mm)) {
|
||||
$type = strtolower($mm[1]);
|
||||
$desc = trim($mm[2]);
|
||||
$sev = intval($mm[3] ?? 3);
|
||||
}
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
$pdo->prepare("INSERT INTO weval.muda_entries (tenant_id, muda_type, description, severity, impact_euro, status, detected_by) VALUES (?, ?, ?, ?, ?, 'identified', 'wevia-chat')")->execute(["weval", $type, $desc, $sev, $impact]);
|
||||
return ["provider"=>"opus46","content"=>"MUDA CREATED:\n Type: $type\n Severity: $sev\n Description: " . substr($desc, 0, 150) . "\n Impact estimé: $impact€","tool"=>"muda_create"];
|
||||
} catch (Exception $e) {
|
||||
return ["provider"=>"opus46","content"=>"MUDA CREATE FAIL: " . $e->getMessage(), "tool"=>"muda_create"];
|
||||
}
|
||||
}
|
||||
|
||||
// INTENT: andon_create
|
||||
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|declenche[rz]?)\s+andon|andon\s+(alert|alerte)/iu", $m)) {
|
||||
$sev = "yellow"; $station = "general"; $message = trim($msg);
|
||||
if (preg_match("/andon\s+(red|yellow|green)\s+(.+?)\s+sur\s+(.+)$/iu", $msg, $mm)) {
|
||||
$sev = strtolower($mm[1]);
|
||||
$message = trim($mm[2]);
|
||||
$station = trim($mm[3]);
|
||||
} elseif (preg_match("/andon\s+(red|yellow|green)\s+(.+)$/iu", $msg, $mm)) {
|
||||
$sev = strtolower($mm[1]);
|
||||
$message = trim($mm[2]);
|
||||
}
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
$pdo->prepare("INSERT INTO weval.andon_alerts (tenant_id, station, severity, message, triggered_by, status) VALUES (?, ?, ?, ?, 'wevia-chat', 'open')")->execute(["weval", $station, $sev, $message]);
|
||||
return ["provider"=>"opus46","content"=>"ANDON CREATED:\n Station: $station\n Severity: $sev\n Message: " . substr($message, 0, 150),"tool"=>"andon_create"];
|
||||
} catch (Exception $e) {
|
||||
return ["provider"=>"opus46","content"=>"ANDON CREATE FAIL: " . $e->getMessage(), "tool"=>"andon_create"];
|
||||
}
|
||||
}
|
||||
|
||||
// === V16 REAL DATA INTENTS (root cause: no-simulation doctrine) ===
|
||||
|
||||
// INTENT: pipeline_live (CRM pipeline réel depuis S95)
|
||||
if (preg_match("/pipeline\s+(crm|deals|actuel|live|reel)|combien\s+deals|crm\s+(pipeline|deals|live)|deals\s+(en\s+cours|actuels?|ce\s+mois)/iu", $m)) {
|
||||
$out = "CRM PIPELINE LIVE (S95):\n";
|
||||
try {
|
||||
$pdo95 = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system", "admin", "admin123", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5]);
|
||||
$deals = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_deals")->fetchColumn();
|
||||
$cos = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_companies")->fetchColumn();
|
||||
$contacts = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_contacts")->fetchColumn();
|
||||
$activities = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_activities")->fetchColumn();
|
||||
$enrich = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_enrichments")->fetchColumn();
|
||||
$leads = (int)$pdo95->query("SELECT COUNT(*) FROM weval_leads")->fetchColumn();
|
||||
$crm_leads = (int)$pdo95->query("SELECT COUNT(*) FROM crm_leads")->fetchColumn();
|
||||
$out .= " Deals: $deals | Companies: $cos | Contacts: $contacts\n";
|
||||
$out .= " Activities: $activities | Enrichments: $enrich\n";
|
||||
$out .= " Leads: $leads | CRM_leads: $crm_leads\n";
|
||||
if ($deals < 10) $out .= " ⚠️ ALERTE: pipeline quasi-vide ($deals deals). Needs kaizen event.\n";
|
||||
if ($leads < 1000) $out .= " ⚠️ ALERTE: leads faibles, enrichir via bizdev";
|
||||
} catch (Exception $e) { $out .= " ERR: " . $e->getMessage(); }
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"pipeline_live"];
|
||||
}
|
||||
|
||||
// INTENT: campaign_live (état campaigns réel)
|
||||
if (preg_match("/(campagnes?|campaigns?)\s+(live|actuel|last|dernier|ce\s+mois|envois?)|dernier\s+envoi|email\s+(stats|envoy[eé]s?|campagne)|wevads\s+(stats|envois?)|volumes?\s+email/iu", $m)) {
|
||||
$out = "WEVADS CAMPAIGNS LIVE (S95):\n";
|
||||
try {
|
||||
$pdo95 = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system", "admin", "admin123", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5]);
|
||||
$cp_total = (int)$pdo95->query("SELECT COUNT(*) FROM campaigns")->fetchColumn();
|
||||
$cp_last = $pdo95->query("SELECT MAX(created_at) FROM campaigns")->fetchColumn();
|
||||
$sent = (int)$pdo95->query("SELECT COUNT(*) FROM graph_send_log")->fetchColumn();
|
||||
$accounts = (int)$pdo95->query("SELECT COUNT(*) FROM email_send_accounts")->fetchColumn();
|
||||
$brain_cfgs = (int)$pdo95->query("SELECT COUNT(*) FROM brain_send_configs")->fetchColumn();
|
||||
$scheduled = (int)$pdo95->query("SELECT COUNT(*) FROM scheduled_campaigns")->fetchColumn();
|
||||
$out .= " Campaigns total: $cp_total | Last created: $cp_last\n";
|
||||
$out .= " Emails sent (graph_send_log): " . number_format($sent, 0, ",", " ") . "\n";
|
||||
$out .= " Email accounts pool: $accounts\n";
|
||||
$out .= " Brain send configs: $brain_cfgs | Scheduled: $scheduled\n";
|
||||
// Check staleness
|
||||
$days_ago = (int)((time() - strtotime($cp_last ?: "2000-01-01")) / 86400);
|
||||
if ($days_ago > 14) $out .= " ⚠️ ALERTE: Dernière campaign il y a $days_ago jours (Kaizen email needed)";
|
||||
} catch (Exception $e) { $out .= " ERR: " . $e->getMessage(); }
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"campaign_live"];
|
||||
}
|
||||
|
||||
// INTENT: multiagents_real (lance VRAIMENT en parallèle via spécifications)
|
||||
if (preg_match("/(lance|execute|lancer|run)\s+(\d+|3|plusieurs)?\s*agents?\s+(en\s+)?(parall[eè]le|simultan|multi)/iu", $m)) {
|
||||
// Parse agent tasks
|
||||
preg_match_all("/agent\d+\s*[:=]\s*([^;,]+?)(?=agent\d+|[;,\.]|$)/iu", $msg, $ag);
|
||||
if (empty($ag[1])) {
|
||||
// Default: 3 agents on system state
|
||||
$agents_todo = ["Pipeline CRM count", "Campaigns status", "Ethica HCPs count"];
|
||||
$cmds = [
|
||||
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*) FROM pipeline_deals\" 2>&1",
|
||||
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*), MAX(created_at) FROM campaigns\" 2>&1",
|
||||
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*) FROM ethica.medecins_real\" 2>&1"
|
||||
];
|
||||
} else {
|
||||
$agents_todo = array_map("trim", $ag[1]);
|
||||
$cmds = array_map(fn($t) => "echo '" . addslashes(substr($t, 0, 200)) . "' | head -c 200", $agents_todo);
|
||||
}
|
||||
$out = "MULTIAGENTS EXEC PARALLEL (" . count($cmds) . " agents):\n";
|
||||
$pids = [];
|
||||
$tmpfiles = [];
|
||||
foreach ($cmds as $i => $cmd) {
|
||||
$tf = "/tmp/agent_" . getmypid() . "_$i.out";
|
||||
$tmpfiles[] = $tf;
|
||||
@shell_exec("PGPASSWORD=admin123 timeout 10 bash -c " . escapeshellarg($cmd) . " > $tf 2>&1 &");
|
||||
}
|
||||
sleep(3);
|
||||
foreach ($cmds as $i => $cmd) {
|
||||
$result = trim(@file_get_contents($tmpfiles[$i]) ?: "");
|
||||
$out .= " [agent" . ($i+1) . " " . ($agents_todo[$i] ?? "task") . "]: " . substr($result, 0, 150) . "\n";
|
||||
@unlink($tmpfiles[$i]);
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"multiagents_real"];
|
||||
}
|
||||
|
||||
// INTENT: health_check (system health truth)
|
||||
if (preg_match("/(health|sant[eé]|status)\s+(system|plateforme|weval|global)|tout\s+(est\s+)?(ok|bon)\s*\?/iu", $m)) {
|
||||
$out = "WEVAL HEALTH CHECK:\n";
|
||||
// NonReg
|
||||
$nr_raw = @file_get_contents("https://weval-consulting.com/api/nonreg-api.php?cat=all", false, stream_context_create(["http" => ["timeout" => 10]]));
|
||||
$nr = json_decode($nr_raw, true);
|
||||
$out .= " NonReg: " . ($nr["pass"] ?? 0) . "/" . ($nr["total"] ?? 0) . " (" . ($nr["score"] ?? 0) . "%)\n";
|
||||
// EM NonReg
|
||||
$em_raw = @file_get_contents("https://weval-consulting.com/api/em-webhooks.php?action=em-nonreg", false, stream_context_create(["http" => ["timeout" => 30]]));
|
||||
$em = json_decode($em_raw, true);
|
||||
$out .= " EM: " . ($em["pass"] ?? 0) . "/" . ($em["total"] ?? 0) . " (" . ($em["score"] ?? 0) . "%)\n";
|
||||
// Andon
|
||||
$ac_raw = @file_get_contents("https://weval-consulting.com/api/em/andon?status=open", false, stream_context_create(["http" => ["timeout" => 5]]));
|
||||
$ac = json_decode($ac_raw, true);
|
||||
$out .= " Andon open: " . ($ac["open"] ?? 0) . "\n";
|
||||
// Dashboard maturity
|
||||
$dm_raw = @file_get_contents("https://weval-consulting.com/api/em/lean6sigma-dashboard", false, stream_context_create(["http" => ["timeout" => 5]]));
|
||||
$dm = json_decode($dm_raw, true);
|
||||
$out .= " Lean 6σ Maturity: " . ($dm["maturity_score"] ?? 0) . "/100\n";
|
||||
// Verdict
|
||||
$ok = ($nr["pass"] ?? 0) == ($nr["total"] ?? 1) && ($em["pass"] ?? 0) == ($em["total"] ?? 1);
|
||||
$out .= " Verdict: " . ($ok ? "✅ SYSTEM HEALTHY" : "⚠️ NEEDS ATTENTION");
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"health_check"];
|
||||
}
|
||||
|
||||
// === V15 INTENTS : em_nonreg, video_tour, case_study_docx ===
|
||||
|
||||
// INTENT: em_nonreg
|
||||
if (preg_match("/nonreg\s+em|em\s+nonreg|validation\s+em|tests?\s+em/iu", $m)) {
|
||||
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=em-nonreg");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_FOLLOWLOCATION=>1, CURLOPT_TIMEOUT=>60]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = json_decode($r, true);
|
||||
if (!$j) return ["provider"=>"opus46","content"=>"EM NONREG FAIL","tool"=>"em_nonreg"];
|
||||
$fails = array_filter($j["details"] ?? [], fn($d)=>!$d["pass"]);
|
||||
$out = "EM NONREG: " . $j["pass"] . "/" . $j["total"] . " pass (score " . $j["score"] . "%)";
|
||||
if (count($fails)) {
|
||||
$out .= "\nFAILS:";
|
||||
foreach (array_slice($fails, 0, 5) as $f) $out .= "\n " . $f["endpoint"] . " → HTTP " . $f["http"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"em_nonreg"];
|
||||
}
|
||||
|
||||
// INTENT: video_tour
|
||||
if (preg_match("/video\s+tour|d[eé]mo\s+vid[eé]o|tour\s+vid[eé]o|g[eé]n[eé]rer?\s+vid[eé]o/iu", $m)) {
|
||||
$tenant = "weval";
|
||||
if (preg_match("/pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1]);
|
||||
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=video-tour");
|
||||
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["tenant"=>$tenant]), CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>10]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = json_decode($r, true);
|
||||
return ["provider"=>"opus46","content"=>"VIDEO TOUR: " . ($j["status"] ?? "error") . " pour $tenant\nOutput: " . ($j["output_dir"] ?? "") . "\nLog: " . ($j["log"] ?? "") . "\nAttendre ~3min pour la MP4 finale","tool"=>"video_tour"];
|
||||
}
|
||||
|
||||
// INTENT: case_study_docx (updated from stub)
|
||||
if (preg_match("/case\s+study|cas\s+(d\x27?usage|client)|rapport\s+client|docx\s+tenant|g[eé]n[eé]rer?\s+rapport/iu", $m)) {
|
||||
$tenant = "weval";
|
||||
if (preg_match("/pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1]);
|
||||
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=case-study-generate");
|
||||
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["tenant"=>$tenant]), CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>35]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = json_decode($r, true);
|
||||
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"CASE STUDY OK (docx):\n Tenant: $tenant\n File: " . $j["file"] . "\n Size: " . number_format($j["size"]/1024, 1) . " KB\n Format: " . $j["format"],"tool"=>"case_study_docx"];
|
||||
return ["provider"=>"opus46","content"=>"CASE STUDY FAIL: " . ($j["error"] ?? substr($r, 0, 200)),"tool"=>"case_study_docx"];
|
||||
}
|
||||
|
||||
// === LEAN 6σ INTENTS (V14) ===
|
||||
|
||||
// INTENT: muda_list
|
||||
if (preg_match("/\b(muda|gaspillages?|wastes?|7\s*wastes)\b/iu", $m)) {
|
||||
$j = __em_api("/muda");
|
||||
$out = "MUDA — " . ($j["count"] ?? 0) . " entries · Impact: " . ($j["total_impact_hours"] ?? 0) . "h / " . number_format($j["total_impact_euro"] ?? 0, 0, ",", " ") . "€";
|
||||
foreach (array_slice($j["entries"] ?? [], 0, 10) as $e) {
|
||||
$out .= "\n [" . strtoupper($e["muda_type"]) . " sev" . $e["severity"] . "] " . $e["description"] . " → " . $e["impact_euro"] . "€ (" . $e["status"] . ")";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"muda_list"];
|
||||
}
|
||||
|
||||
// INTENT: poka_yoke_list
|
||||
if (preg_match("/poka.?yoke|mistake.?proofing|anti.?erreur/iu", $m)) {
|
||||
$j = __em_api("/poka-yoke");
|
||||
$out = "POKA-YOKE — " . ($j["count"] ?? 0) . " devices · Avg efficacité: " . ($j["avg_efficiency_pct"] ?? 0) . "%";
|
||||
foreach (array_slice($j["devices"] ?? [], 0, 10) as $d) {
|
||||
$out .= "\n [" . $d["device_type"] . " " . $d["efficiency_pct"] . "%] " . $d["process"] . ": " . $d["mechanism"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"poka_yoke_list"];
|
||||
}
|
||||
|
||||
// INTENT: kaizen_list
|
||||
if (preg_match("/kaizen|amelioration\s+continue|chantier/iu", $m)) {
|
||||
$j = __em_api("/kaizen");
|
||||
$out = "KAIZEN — " . ($j["count"] ?? 0) . " events · Savings: " . number_format($j["total_savings_euro"] ?? 0, 0, ",", " ") . "€";
|
||||
foreach (array_slice($j["events"] ?? [], 0, 10) as $k) {
|
||||
$out .= "\n [" . strtoupper($k["status"]) . " " . $k["dept"] . "] " . $k["title"] . " — " . ($k["savings_euro"] ?? 0) . "€ / " . ($k["savings_hours"] ?? 0) . "h";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"kaizen_list"];
|
||||
}
|
||||
|
||||
// INTENT: gemba_walks
|
||||
if (preg_match("/gemba|visite\s+terrain|observation\s+direct/iu", $m)) {
|
||||
$j = __em_api("/gemba");
|
||||
$out = "GEMBA WALKS — " . ($j["count"] ?? 0) . " walks";
|
||||
foreach (array_slice($j["walks"] ?? [], 0, 5) as $w) {
|
||||
$out .= "\n [" . substr($w["created_at"] ?? "", 0, 10) . "] " . $w["location"] . " par " . $w["walker"] . " (" . $w["walk_duration_min"] . "min · " . $w["muda_spotted"] . " muda)";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"gemba_walks"];
|
||||
}
|
||||
|
||||
// INTENT: pdca_list
|
||||
if (preg_match("/pdca|plan.?do.?check.?act|roue\s+deming/iu", $m)) {
|
||||
$j = __em_api("/pdca");
|
||||
$out = "PDCA — " . ($j["count"] ?? 0) . " cycles";
|
||||
foreach (array_slice($j["cycles"] ?? [], 0, 10) as $p) {
|
||||
$gap = "";
|
||||
if ($p["target"] && $p["actual"]) $gap = " (gap: " . round(($p["actual"] - $p["target"]) / max(1, $p["target"]) * 100, 1) . "%)";
|
||||
$out .= "\n [" . strtoupper($p["phase"]) . "] " . $p["title"] . " — KPI: " . $p["kpi_name"] . " " . $p["baseline"] . "→" . $p["target"] . $gap;
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"pdca_list"];
|
||||
}
|
||||
|
||||
// INTENT: andon_alerts
|
||||
if (preg_match("/andon|alertes?\s+production|stoppages?/iu", $m)) {
|
||||
$j = __em_api("/andon");
|
||||
$out = "ANDON — " . ($j["count"] ?? 0) . " alerts · " . ($j["open"] ?? 0) . " open";
|
||||
foreach (array_slice($j["alerts"] ?? [], 0, 10) as $a) {
|
||||
$icon = $a["severity"] === "red" ? "🔴" : ($a["severity"] === "yellow" ? "🟡" : "🟢");
|
||||
$out .= "\n $icon [" . $a["station"] . "] " . $a["message"] . " (" . $a["status"] . ")";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"andon_alerts"];
|
||||
}
|
||||
|
||||
// INTENT: five_s_audit
|
||||
if (preg_match("/\b5s\b|five.?s|seiri|audit\s+organisation/iu", $m)) {
|
||||
$j = __em_api("/five-s");
|
||||
$out = "5S AUDITS — " . ($j["count"] ?? 0) . " audits · Avg: " . ($j["avg_score"] ?? 0) . "/" . ($j["max_score"] ?? 25);
|
||||
foreach (array_slice($j["audits"] ?? [], 0, 10) as $a) {
|
||||
$out .= "\n [" . $a["area"] . "] " . $a["total_score"] . "/25 (S1:" . $a["seiri"] . " S2:" . $a["seiton"] . " S3:" . $a["seiso"] . " S4:" . $a["seiketsu"] . " S5:" . $a["shitsuke"] . ") par " . $a["auditor"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"five_s_audit"];
|
||||
}
|
||||
|
||||
// INTENT: a3_reports
|
||||
if (preg_match("/\ba3\b|rapport\s+a3|problem.?solving/iu", $m)) {
|
||||
$j = __em_api("/a3");
|
||||
$out = "A3 REPORTS — " . ($j["count"] ?? 0);
|
||||
foreach (array_slice($j["reports"] ?? [], 0, 10) as $r) {
|
||||
$out .= "\n [" . strtoupper($r["status"]) . "] " . $r["title"] . " — " . substr($r["background"] ?? "", 0, 80) . "... · owner: " . $r["owner"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"a3_reports"];
|
||||
}
|
||||
|
||||
// INTENT: lean6sigma_dashboard
|
||||
if (preg_match("/lean.?6.?sigma|lean.?six.?sigma|tableau\s+lean|maturite\s+lean|dashboard\s+lean/iu", $m)) {
|
||||
$j = __em_api("/lean6sigma-dashboard");
|
||||
return ["provider"=>"opus46","content"=>"LEAN 6σ DASHBOARD:\n Muda: " . ($j["muda"]["count"] ?? 0) . " entries · " . number_format($j["muda"]["impact_euro"] ?? 0, 0, ",", " ") . "€ impact\n Poka-Yoke: " . ($j["poka_yoke"]["count"] ?? 0) . " devices · " . ($j["poka_yoke"]["avg_efficiency_pct"] ?? 0) . "% avg\n Kaizen: " . ($j["kaizen"]["count"] ?? 0) . " events · " . number_format($j["kaizen"]["total_savings_euro"] ?? 0, 0, ",", " ") . "€ saved\n Gemba: " . ($j["gemba"]["walks"] ?? 0) . " walks · " . ($j["gemba"]["muda_spotted"] ?? 0) . " muda spotted\n PDCA active: " . ($j["pdca_active"] ?? 0) . " cycles\n Andon open: " . ($j["andon_open"] ?? 0) . "\n A3 open: " . ($j["a3_open"] ?? 0) . "\n 5S avg: " . ($j["five_s_avg_score"] ?? 0) . "/25\n MATURITY SCORE: " . ($j["maturity_score"] ?? 0) . "/100","tool"=>"lean6sigma_dashboard"];
|
||||
}
|
||||
|
||||
// === WEVIA EM SCALABILITY INTENTS (V13) ===
|
||||
|
||||
// INTENT: erp_list
|
||||
if (preg_match("/\b(liste|combien|quels?)\s+(erp|connecteurs?\s+erp)|erp\s+(disponibles?|list)|connecteurs?\s+erp/iu", $m)) {
|
||||
$j = __em_api("/erp-connectors");
|
||||
$out = "ERP CONNECTORS (" . ($j["count"] ?? 0) . "):";
|
||||
foreach ($j["connectors"] ?? [] as $e) {
|
||||
$out .= "\n " . $e["code"] . " — " . $e["name"] . " (" . $e["vendor"] . ") · " . implode(",", $e["protocols"] ?? []) . " · auth=" . $e["auth_type"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"erp_list"];
|
||||
}
|
||||
|
||||
// INTENT: ai_list
|
||||
if (preg_match("/\b(liste|combien|quels?)\s+(ia|ai|providers?\s+ia|fournisseurs?\s+ia)|ia\s+(disponibles?|list)|providers?\s+ia|modeles?\s+ia/iu", $m)) {
|
||||
$j = __em_api("/ai-providers");
|
||||
$out = "AI PROVIDERS (" . ($j["count"] ?? 0) . "):";
|
||||
foreach ($j["providers"] ?? [] as $p) {
|
||||
$out .= "\n " . $p["code"] . " — " . $p["name"] . " (" . $p["vendor"] . ") · " . implode(",", array_slice($p["models"] ?? [], 0, 3));
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"ai_list"];
|
||||
}
|
||||
|
||||
// INTENT: industry_list
|
||||
if (preg_match("/\b(liste|quels?|combien)\s+(industries?|secteurs?|templates?\s+metier)|industries?\s+disponibles?|metiers?\s+supportes?/iu", $m)) {
|
||||
$j = __em_api("/industry-templates");
|
||||
$out = "INDUSTRY TEMPLATES (" . ($j["count"] ?? 0) . "):";
|
||||
foreach ($j["templates"] ?? [] as $t) {
|
||||
$out .= "\n " . $t["code"] . " — " . $t["name"] . " (" . $t["sector"] . ") · " . count($t["vsm_depts"] ?? []) . " depts · " . count($t["compliance"] ?? []) . " compliance";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"industry_list"];
|
||||
}
|
||||
|
||||
// INTENT: integration_connect
|
||||
if (preg_match("/\b(connecter?|integre[rz]?|brancher?)\s+(erp|ia|ai|industrie?|secteur|template)\s+([a-z0-9\-_]+)/iu", $msg, $mm)) {
|
||||
$type_raw = strtolower($mm[2]);
|
||||
$type = in_array($type_raw, ["ia","ai"]) ? "ai" : ($type_raw === "erp" ? "erp" : "industry");
|
||||
$code = strtolower($mm[3]);
|
||||
$tenant = "weval";
|
||||
if (preg_match("/sur\s+tenant\s+([a-z0-9_]+)|pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1] ?? $tm[2]);
|
||||
$j = __em_api_post("/tenant-integrations/connect", ["tenant_id"=>$tenant, "type"=>$type, "code"=>$code, "config"=>[]]);
|
||||
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"INTEGRATION OK: $tenant ← $type/$code\nConfig à compléter via /integrations-marketplace.html","tool"=>"integration_connect"];
|
||||
return ["provider"=>"opus46","content"=>"INTEGRATION FAIL: " . ($j["error"] ?? "inconnu"),"tool"=>"integration_connect"];
|
||||
}
|
||||
|
||||
// INTENT: scalability_status
|
||||
if (preg_match("/scalabilite|scalability|matrice\s+(em|integrations?)|combinaisons|combien.*integrations?|arch\w*\s+agnostique/iu", $m)) {
|
||||
$j = __em_api("/scalability");
|
||||
return ["provider"=>"opus46","content"=>"WEVIA EM SCALABILITY:\n ERP Connectors: " . ($j["erp_connectors_available"] ?? 0) . "\n AI Providers: " . ($j["ai_providers_available"] ?? 0) . "\n Industry Templates: " . ($j["industry_templates_available"] ?? 0) . "\n Active integrations: " . ($j["tenant_integrations_active"] ?? 0) . "\n Total combinaisons possibles: " . ($j["matrix"]["Total_combinations"] ?? 0) . "\n UI: /integrations-marketplace.html","tool"=>"scalability_status"];
|
||||
}
|
||||
|
||||
// case_study_gen replaced by case_study_docx in V15
|
||||
|
||||
// INTENT: git_full
|
||||
if (preg_match("/git\s+(full|complet|tout)|commit\s+(et\s+)?push|push\s+tout|git\s+sync\s+(all|tout)/iu", $m)) {
|
||||
$d = (int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l"));
|
||||
if ($d > 0) {
|
||||
@shell_exec("cd /var/www/html && git add -A && git commit -m 'auto-sync-opus46' && git push origin main 2>&1");
|
||||
@shell_exec("cd /opt/weval-l99 && git add -A && git commit -m 'auto-sync-opus46' && git push 2>&1");
|
||||
$hb=trim(@shell_exec("cd /var/www/html && git rev-parse HEAD 2>&1")); $ha=trim(@shell_exec("cd /var/www/html && git rev-parse origin/main 2>&1")); $da=(int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")); if ($hb===$ha && $da>=$d) return ["provider"=>"opus46","content"=>"GIT FAILED: HEAD=".substr($hb,0,8)." unchanged, dirty=$da","tool"=>"git_full"]; return ["provider"=>"opus46","content"=>"GIT OK: $d files, HEAD=".substr($hb,0,8)." dirty_after=$da","tool"=>"git_full"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"GIT: 0 dirty","tool"=>"git_full"];
|
||||
}
|
||||
|
||||
// INTENT: wiki_update
|
||||
if (preg_match("/wiki\s+update|update\s+wiki|maj\s+wiki|enrichi\w*\s+wiki/iu", $m)) {
|
||||
$entry = preg_replace("/^.*wiki\s+\w+\s*/iu", "", $msg);
|
||||
if (strlen($entry) < 10) $entry = date("Y-m-d H:i") . " session update";
|
||||
$w = "/var/www/html/wiki.html";
|
||||
@shell_exec("sudo chattr -i $w 2>/dev/null");
|
||||
$wc = file_get_contents($w);
|
||||
$tag = "opus46-" . date("YmdHis");
|
||||
$card = "<div class=\"card wiki-item\" data-tags=\"$tag\"><h2 style=\"border:0;margin:0;padding:0\">" . htmlspecialchars(substr($entry,0,60)) . "</h2><div style=\"color:#94a3b8;font-size:10px;margin-top:6px\">" . htmlspecialchars($entry) . "<br><span style=\"color:#06b6d4\">[" . date("d/m H:i") . "]</span></div></div>\n";
|
||||
$pos = strrpos($wc, "</div>\n<script>");
|
||||
if ($pos !== false) { file_put_contents($w, substr($wc, 0, $pos) . $card . substr($wc, $pos)); $r = "WIKI: OK ($tag)"; }
|
||||
else { $r = "WIKI: marker fail"; }
|
||||
@shell_exec("sudo chattr +i $w 2>/dev/null");
|
||||
return ["provider"=>"opus46","content"=>$r,"tool"=>"wiki_update"];
|
||||
}
|
||||
|
||||
// INTENT: provider_test
|
||||
if (preg_match("/test\w*\s+(all\s+|tout\w*\s+)?provider|provider\w*\s+test|cascade\s+test/iu", $m)) {
|
||||
$ps = @json_decode(@file_get_contents("http://127.0.0.1/api/openclaw-proxy.php"), true);
|
||||
$res = [];
|
||||
foreach (($ps["providers"] ?? []) as $p) {
|
||||
if ($p["tier"] === "sovereign" || empty($p["models"])) continue;
|
||||
$ch = curl_init("http://127.0.0.1/api/openclaw-proxy.php");
|
||||
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_RETURNTRANSFER=>1, CURLOPT_TIMEOUT=>8, CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_POSTFIELDS=>json_encode(["provider"=>$p["id"],"model"=>$p["models"][0]["id"],"message"=>"Reply OK"])]);
|
||||
$rr = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
$res[] = $p["id"] . ":" . ($code === 200 && strpos($rr, "choices") !== false ? "OK" : "FAIL");
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"PROVIDERS: " . implode(" | ", $res),"tool"=>"provider_test"];
|
||||
}
|
||||
|
||||
// INTENT: auto_heal
|
||||
if (preg_match("/auto[\s\-]?heal|auto[\s\-]?fix|fixe[rz]?\s+tout|fix\s+all|r.pare\w*\s+tout/iu", $m)) {
|
||||
$fx = [];
|
||||
$d = (int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l"));
|
||||
if ($d > 0) { @shell_exec("cd /var/www/html && git add -A && git commit -m 'auto-heal' 2>&1"); $fx[] = "Git:$d"; }
|
||||
@shell_exec("curl -s http://127.0.0.1/api/opcache-reset.php 2>/dev/null"); $fx[] = "OPcache:OK";
|
||||
@shell_exec("curl -sX POST 'https://api.cloudflare.com/client/v4/zones/1488bbba251c6fa282999fcc09aac9fe/purge_cache' -H 'X-Auth-Email: ymahboub@weval-consulting.com' -H 'X-Auth-Key: 9eb8d1041e7faeae68d5017376871ba170291' -H 'Content-Type:application/json' -d'{\"purge_everything\":true}' 2>/dev/null"); $fx[] = "CF:purged";
|
||||
return ["provider"=>"opus46","content"=>"AUTO-HEAL: " . implode(" | ", $fx),"tool"=>"auto_heal"];
|
||||
}
|
||||
|
||||
// INTENT: 6sigma_full
|
||||
if (preg_match("/6[\s\.]?sigma\s+(complet|full)|full\s+6[\s\.]?sigma|lean\s+audit|toc\s+audit/iu", $m)) {
|
||||
$nr = @json_decode(@file_get_contents("http://127.0.0.1/api/nonreg-api.php?cat=all"), true);
|
||||
$l9 = @json_decode(@file_get_contents("http://127.0.0.1/api/l99-api.php?action=results"), true);
|
||||
$pv = @json_decode(@file_get_contents("http://127.0.0.1/api/openclaw-proxy.php"), true);
|
||||
$r = "6SIGMA: NR=" . ($nr["pass"]??"?") . "/" . ($nr["total"]??"?") . " L99=" . ($l9["pass"]??"?") . "/" . ($l9["total"]??"?") . "@" . ($l9["score"]??"?") . "% Providers=" . count($pv["providers"]??[]) . "(" . ($pv["total_models"]??"?") . "M) Git=" . trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")) . "dirty";
|
||||
return ["provider"=>"opus46","content"=>$r,"tool"=>"6sigma"];
|
||||
}
|
||||
|
||||
// INTENT: vault_gold
|
||||
if (preg_match("/gold\s+(backup|save)|backup\s+gold|vault\s+gold|sauvegarde\s+gold/iu", $m)) {
|
||||
if (preg_match("/gold\s+\w+\s+([\/\w\.\-]+)/iu", $msg, $gm)) {
|
||||
$p = $gm[1]; if ($p[0] !== "/") $p = "/var/www/html/$p";
|
||||
if (file_exists($p)) { $g = $p . ".GOLD-" . date("Ymd-His"); copy($p, $g); return ["provider"=>"opus46","content"=>"GOLD: $g (" . filesize($g) . "B)","tool"=>"gold"]; }
|
||||
return ["provider"=>"opus46","content"=>"ERREUR: $p inexistant","tool"=>"gold"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"Precise le fichier","tool"=>"gold"];
|
||||
}
|
||||
|
||||
// INTENT: ops_screen_check
|
||||
if (preg_match("/screen\w*\s+(check|defect)|ops[\s\-]?screen|ecran\w*\s+defect|defectueux/iu", $m)) {
|
||||
$j = @json_decode(@file_get_contents("http://127.0.0.1/api/infra-monitor-api.php"), true);
|
||||
return ["provider"=>"opus46","content"=>"OPS: UP=" . ($j["up"]??"?") . " DOWN=" . ($j["down"]??"?") . " 5xx=" . ($j["error_5xx"]??"?"),"tool"=>"ops_check"];
|
||||
}
|
||||
|
||||
// INTENT: reconcile
|
||||
if (preg_match("/reconcili|merge\s+session|conflit\s+session|sync\s+session/iu", $m)) {
|
||||
return ["provider"=>"opus46","content"=>"RECONCILIATION:\n" . trim(@shell_exec("cd /var/www/html && git log --oneline -15 2>&1")) . "\nDirty:" . trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")),"tool"=>"reconcile"];
|
||||
}
|
||||
|
||||
// INTENT: playwright_verify
|
||||
if (preg_match("/playwright\s+verif|verif\w*\s+playwright|visual\s+test/iu", $m)) {
|
||||
@shell_exec("nohup bash -c 'cd /var/www/html && node api/l99-visual-test.js > /tmp/pw-vis.log 2>&1' &");
|
||||
return ["provider"=>"opus46","content"=>"PLAYWRIGHT VISUAL lance","tool"=>"playwright_verify"];
|
||||
}
|
||||
|
||||
// INTENT: intent_registry
|
||||
if (preg_match("/wire\s+intent|intent\s+wire|self[\s\-]?wire|nouvel?\s+intent|intent\s+registry/iu", $m)) {
|
||||
$ic = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-opus-intents.php 2>/dev/null"));
|
||||
$fc = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-fast-path-v3.php 2>/dev/null"));
|
||||
$o4 = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-opus46-intents.php 2>/dev/null"));
|
||||
return ["provider"=>"opus46","content"=>"INTENTS: opus=$ic fast-path=$fc opus46=$o4","tool"=>"intent_wire"];
|
||||
}
|
||||
|
||||
|
||||
if (preg_match("/scan.*skills|skills.*scan|inject.*skills|skills.*inject|refresh.*skills|0.*skills/iu", $m)) {
|
||||
$s=[];$d="/var/www/html/skills/";
|
||||
foreach(scandir($d) as $e){if($e[0]==".")continue;$full=realpath("$d/$e");if(!$full||!is_dir($full))continue;
|
||||
foreach(scandir($full) as $x){if($x[0]==".")continue;$s[]=["slug"=>"$e/$x","name"=>pathinfo($x,4),"source"=>$e];}}
|
||||
$c2="/var/www/html/api/oss-cache.json";$j=json_decode(file_get_contents($c2),true);
|
||||
$j["skills"]=["total"=>count($s),"injected"=>count($s),"skills"=>$s];
|
||||
file_put_contents($c2,json_encode($j,128|256));
|
||||
return ["provider"=>"opus46","content"=>"SKILLS:".count($s),"tool"=>"skills_scan"];
|
||||
}
|
||||
|
||||
|
||||
if (preg_match("/charge.*(serveur|server)|load.*(average|serveur)|uptime|memoire.*serveur|cpu.*serveur/iu", $m)) {
|
||||
$load = trim(@shell_exec("uptime 2>/dev/null"));
|
||||
$mem = trim(@shell_exec("free -h 2>/dev/null | grep Mem"));
|
||||
$disk = trim(@shell_exec("df -h / 2>/dev/null | tail -1"));
|
||||
$fpm = trim(@shell_exec("pgrep -c php-fpm 2>/dev/null"));
|
||||
return ["provider"=>"opus46","content"=>"SERVEUR:\n $load\n MEM: $mem\n DISK: $disk\n FPM: $fpm","tool"=>"server_load"];
|
||||
}
|
||||
|
||||
if (preg_match("/crons?\s+(actif|list|quels|detail)|quels?\s+crons?|list\w*\s+crons?/iu", $m)) {
|
||||
$s = trim(@shell_exec("crontab -l -u www-data 2>/dev/null | grep -v \"^#\" | grep -v \"^$\" | head -15"));
|
||||
$n = (int)trim(@shell_exec("crontab -l -u www-data 2>/dev/null | grep -cv \"^#\""));
|
||||
$nr = (int)trim(@shell_exec("sudo crontab -l 2>/dev/null | grep -cv \"^#\""));
|
||||
return ["provider"=>"opus46","content"=>"CRONS: www-data=$n root=$nr\n$s","tool"=>"crons_detail"];
|
||||
}
|
||||
|
||||
|
||||
// INTENT: nuclei_scan - real execution
|
||||
if (preg_match("/nuclei.*scan|scan.*nuclei|lance.*nuclei|vulnerabilit|vuln.*scan|owasp.*scan/iu", $m)) {
|
||||
$target = "https://weval-consulting.com";
|
||||
if (preg_match("/scan\s+(https?:\/\/\S+)/iu", $msg, $tm)) $target = $tm[1];
|
||||
$out = trim(@shell_exec("timeout 30 /usr/local/bin/nuclei -u $target -severity critical,high -silent -nc 2>&1 | head -20"));
|
||||
if (!$out) $out = "0 vulnérabilités critical/high détectées";
|
||||
return ["provider"=>"opus46","content"=>"NUCLEI SCAN $target:\n$out","tool"=>"nuclei_scan"];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
942
_GOLD/api/wevia-opus46-intents.php.gold.1776392750
Normal file
@@ -0,0 +1,942 @@
|
||||
<?php
|
||||
// OPUS46 EXECUTION INTENTS v2 — 16AVR
|
||||
// These fire via wevia_opus46_exec() BEFORE fast-path
|
||||
|
||||
function __em_api($path) {
|
||||
$ch = curl_init("https://127.0.0.1/api/em" . $path);
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_HTTPHEADER => ["Host: weval-consulting.com"],
|
||||
CURLOPT_RETURNTRANSFER => 1,
|
||||
CURLOPT_TIMEOUT => 5,
|
||||
CURLOPT_FOLLOWLOCATION => 1,
|
||||
CURLOPT_SSL_VERIFYPEER => 0,
|
||||
CURLOPT_SSL_VERIFYHOST => 0
|
||||
]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
return json_decode($r, true);
|
||||
}
|
||||
function __em_api_post($path, $data) {
|
||||
$ch = curl_init("https://127.0.0.1/api/em" . $path);
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_POST => 1,
|
||||
CURLOPT_POSTFIELDS => json_encode($data),
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_RETURNTRANSFER => 1,
|
||||
CURLOPT_TIMEOUT => 10,
|
||||
CURLOPT_FOLLOWLOCATION => 1,
|
||||
CURLOPT_SSL_VERIFYPEER => 0,
|
||||
CURLOPT_SSL_VERIFYHOST => 0
|
||||
]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
return json_decode($r, true);
|
||||
}
|
||||
|
||||
function wevia_opus46_exec($msg) {
|
||||
$m = mb_strtolower(trim($msg));
|
||||
$r = null;
|
||||
|
||||
// INTENT: css_overlap_fix
|
||||
if (preg_match("/overlap\s*fix|fixe?\s*(les?\s+)?overlap|css\s*overlap|ux\s*overlap/iu", $m)) {
|
||||
$pages = ["agents-archi.html","enterprise-model.html","wevia-meeting-rooms.html"];
|
||||
$fixed = 0;
|
||||
foreach ($pages as $page) {
|
||||
$path = "/var/www/html/$page";
|
||||
if (!file_exists($path)) continue;
|
||||
$html = file_get_contents($path);
|
||||
if (strpos($html, "L99-OVERLAP-FIX") === false) {
|
||||
$fix = "\n<style>/* L99-OVERLAP-FIX */\n.label,.tag,.badge,.tooltip{pointer-events:none;z-index:0}\ncanvas{z-index:0!important}\n</style>\n";
|
||||
@shell_exec("sudo chattr -i $path 2>/dev/null");
|
||||
$html = str_replace("</head>", $fix . "</head>", $html);
|
||||
file_put_contents($path, $html);
|
||||
@shell_exec("sudo chattr +i $path 2>/dev/null");
|
||||
$fixed++;
|
||||
}
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"CSS OVERLAP FIX: $fixed/" . count($pages) . " pages","tool"=>"overlap_fix"];
|
||||
}
|
||||
|
||||
// INTENT: l99_run
|
||||
if (preg_match("/lance\w*\s*(le\s+)?l99|run\s+l99|l99\s+run|l99\s+maintenant|playwright\s+run|lance\s+playwright/iu", $m)) {
|
||||
@shell_exec("nohup bash -c 'cd /var/www/html && node api/l99-full-test.js > /tmp/l99-run.log 2>&1' &");
|
||||
return ["provider"=>"opus46","content"=>"L99 PLAYWRIGHT lance. Log: /tmp/l99-run.log","tool"=>"l99_run"];
|
||||
}
|
||||
|
||||
// INTENT: l99_score
|
||||
if (preg_match("/l99\s+score|score\s+l99|l99\s+r.sultat|r.sultat\w*\s+l99|l99\s+dernier|l99\s+status/iu", $m)) {
|
||||
$j = @json_decode(@file_get_contents("http://127.0.0.1/api/l99-api.php?action=results"), true);
|
||||
$r = "L99: Score=" . ($j["score"] ?? "?") . "% Pass=" . ($j["pass"] ?? "?") . " Warn=" . ($j["warn"] ?? "?") . " Date=" . ($j["date"] ?? "?");
|
||||
if (!empty($j["results"])) { foreach ($j["results"] as $t) { if (in_array($t["status"]??"", ["W","F"])) $r .= "\n " . $t["status"] . ":" . ($t["name"]??""); } }
|
||||
return ["provider"=>"opus46","content"=>$r,"tool"=>"l99_score"];
|
||||
}
|
||||
|
||||
// === WEVIA V8 3 intents fondateurs ===
|
||||
// INTENT: qdrant_create
|
||||
if (preg_match("/(cree|create|new)\s+(collection|kb)\s+qdrant|qdrant\s+(create|new)|cree\s+kb_\w+/iu", $m)) {
|
||||
preg_match_all("/kb_[a-z_]+/i", $msg, $nms);
|
||||
$names = !empty($nms[0]) ? $nms[0] : [];
|
||||
if (empty($names)) return ["provider"=>"opus46","content"=>"QDRANT: specify kb_NAME","tool"=>"qdrant_create"];
|
||||
$out = [];
|
||||
foreach ($names as $kb) {
|
||||
$r = trim(@shell_exec("curl -sk -m 5 -X PUT http://localhost:6333/collections/$kb -H 'Content-Type: application/json' -d '{\"vectors\":{\"size\":768,\"distance\":\"Cosine\"}}' 2>&1"));
|
||||
$out[] = "$kb: " . (strpos($r,'"ok"') !== false ? "OK" : "FAIL");
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"QDRANT CREATE:\n" . implode("\n", $out),"tool"=>"qdrant_create"];
|
||||
}
|
||||
|
||||
// INTENT: enrich_leads_action (triggers real lead enrichment plan)
|
||||
if (preg_match("/(enrich\w*|relanc\w*|reactiv\w*|nurtur\w*)\s+(mes\s+)?leads?|leads?\s+dormants?|leads?\s+(nurturing|enrichment)/iu", $m)) {
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
// Create action plan as kaizen + muda resolve
|
||||
$pdo->prepare("INSERT INTO weval.kaizen_events (tenant_id, title, dept, problem, baseline, target, savings_euro, savings_hours, status, started_at) VALUES ('weval', 'Leads Enrichment & Nurturing Plan', 'commerce', 'Enrichir 1920 leads dormants', '{\"leads_dormant\":1920,\"conversion\":0.1}'::jsonb, '{\"leads_activated\":500,\"new_deals\":25}'::jsonb, 25000, 40, 'planned', NOW())")->execute();
|
||||
$plan = "PLAN ENRICHISSEMENT LEADS CRÉÉ (Kaizen):\n";
|
||||
$plan .= " Baseline: 1920 leads dormants, conversion 0.1%\n";
|
||||
$plan .= " Target: 500 leads réactivés, 25 deals nouveaux\n";
|
||||
$plan .= " Savings estimés: 25 000€\n\n";
|
||||
$plan .= "ACTIONS AUTOMATIQUES WEVIA peut déclencher:\n";
|
||||
$plan .= " 1. Scoring auto leads (critère récence + intérêt)\n";
|
||||
$plan .= " 2. Segmentation (hot/warm/cold)\n";
|
||||
$plan .= " 3. Séquences drip 5 emails personnalisés\n";
|
||||
$plan .= " 4. LinkedIn outreach paperclip agent\n";
|
||||
$plan .= " 5. Reactivation offer (-30% ou audit gratuit)\n";
|
||||
$plan .= " 6. Dashboard conversion weekly\n\n";
|
||||
$plan .= "NEXT: wire intent leads_scoring_auto + leads_drip_start";
|
||||
return ["provider"=>"opus46","content"=>$plan,"tool"=>"enrich_leads_action"];
|
||||
} catch (Exception $e) {
|
||||
return ["provider"=>"opus46","content"=>"ENRICH FAIL: " . $e->getMessage(), "tool"=>"enrich_leads_action"];
|
||||
}
|
||||
}
|
||||
|
||||
// INTENT: restart_service
|
||||
if (preg_match("/(redemarre|restart|reboot)\s+(service\s+)?(?<svc>[a-z0-9\-]+)|relance\s+service\s+(?<svc2>[a-z0-9\-]+)/iu", $m, $mm)) {
|
||||
$svc = $mm["svc"] ?? "";
|
||||
$safe = ["sovereign-api","php8.4-fpm","php8.5-fpm","nginx","apache2","redis","redis-server","ollama","paperclip","mirofish","gpt-runner","deerflow","deerflow-gateway","deerflow-langgraph","n8n","iresponse-backend","litellm","wevia-async-worker","wevia-llm-worker","wevia-webchat","weval-api","weval-mind"];
|
||||
if (!in_array($svc, $safe)) return ["provider"=>"opus46","content"=>"RESTART BLOCKED: '$svc' not in whitelist","tool"=>"restart_service"];
|
||||
$before = trim(@shell_exec("sudo -n systemctl is-active $svc 2>&1"));
|
||||
@shell_exec("sudo -n systemctl restart $svc 2>&1");
|
||||
sleep(2);
|
||||
$after = trim(@shell_exec("sudo -n systemctl is-active $svc 2>&1"));
|
||||
return ["provider"=>"opus46","content"=>"RESTART $svc: before=$before after=$after","tool"=>"restart_service"];
|
||||
}
|
||||
|
||||
// INTENT: smart_multiagent (intelligent: interprets intent names OR shell commands)
|
||||
if (preg_match("/execute\s+parallele\s+agents?|run\s+(\d+)?\s*agents?\s+(parallele|parallel|multi)|lance\s+agents?\s+(parallele|multi)/iu", $m)) {
|
||||
// Manual split: find all "agentN=..." segments separated by ;
|
||||
$tasks_raw = [];
|
||||
if (preg_match_all("/agent\d+\s*[:=]\s*([^;]*)/iu", $msg, $mm_all)) {
|
||||
foreach ($mm_all[1] as $t) { $t = trim($t); if ($t) $tasks_raw[] = $t; }
|
||||
}
|
||||
$ag = [1 => $tasks_raw];
|
||||
if (empty($ag[1])) {
|
||||
return ["provider"=>"opus46","content"=>"SMART_MULTI: format agent1=INTENT_NAME; agent2=INTENT_NAME\nInterprete intents (pipeline crm, muda, kaizen, health, andon...) OU cmds shell","tool"=>"smart_multiagent"];
|
||||
}
|
||||
$results = [];
|
||||
foreach (($ag[1] ?? []) as $i => $task_raw) {
|
||||
$task = trim($task_raw);
|
||||
$key = "agent" . ($i+1);
|
||||
// If looks like an intent name, call wevia-master-api
|
||||
if (preg_match('|^[a-z_ ][a-z_ 0-9]{2,40}$|i', $task) && !strpos($task, '/') && !preg_match('/^(curl|psql|ls|cat|grep|sudo)/i', $task)) {
|
||||
$ch = curl_init("https://weval-consulting.com/api/wevia-master-api.php");
|
||||
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["message"=>$task,"session"=>"multi","history"=>[]]), CURLOPT_HTTPHEADER=>["Content-Type: application/json", "Host: weval-consulting.com"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>15]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = json_decode($r, true);
|
||||
$results[$key] = ($j["tool"] ?? "unknown") . ": " . substr($j["content"] ?? "", 0, 200);
|
||||
} else {
|
||||
// Shell command
|
||||
if (preg_match("/rm\s+-rf\s+\/|dd\s+if=|mkfs|shutdown|reboot/", $task)) { $results[$key] = "BLOCKED"; continue; }
|
||||
$out = trim(@shell_exec("timeout 10 $task 2>&1 | head -c 300"));
|
||||
$results[$key] = "shell: " . $out;
|
||||
}
|
||||
}
|
||||
$out = "SMART_MULTIAGENT (" . count($results) . "):\n";
|
||||
foreach ($results as $k => $v) $out .= " [$k] $v\n";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"smart_multiagent"];
|
||||
}
|
||||
|
||||
// INTENT: dynamic_multiagent
|
||||
if (preg_match("/dyn\w*\s*multi|multi\w*\s*dyn|parallel\s+agents?|execute\s+parallele/iu", $m)) {
|
||||
preg_match_all("/agent\d+\s*[:=]\s*([^;]+)/i", $msg, $agents);
|
||||
if (empty($agents[1])) return ["provider"=>"opus46","content"=>"DYNMULTI: format agent1=CMD; agent2=CMD","tool"=>"dynamic_multiagent"];
|
||||
$results = [];
|
||||
foreach ($agents[1] as $i => $cmd) {
|
||||
$cmd = trim($cmd);
|
||||
if (preg_match("/rm\s+-rf\s+\/|dd\s+if=|mkfs/", $cmd)) { $results[] = "agent" . ($i+1) . ": BLOCKED"; continue; }
|
||||
$out = trim(@shell_exec("timeout 10 $cmd 2>&1 | head -c 400"));
|
||||
$results[] = "agent" . ($i+1) . ": " . $out;
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"DYNMULTI " . count($results) . ":\n" . implode("\n---\n", $results),"tool"=>"dynamic_multiagent"];
|
||||
}
|
||||
|
||||
// === WEVIA EM V10 10 intents ===
|
||||
// INTENT: em_status
|
||||
if (preg_match("/(statut|status|sant[eé]|bilan)\s+em|em\s+(statut|status|sant[eé]|bilan)/iu", $m)) {
|
||||
$plans = __em_api("/plans");
|
||||
$vsm = __em_api("/vsm");
|
||||
$ag = __em_api("/agents-registry");
|
||||
$tn = __em_api("/tenant");
|
||||
$bp = __em_api("/bpmn-routines");
|
||||
$dm = __em_api("/dmaic/weval");
|
||||
return ["provider"=>"opus46","content"=>"WEVIA EM STATUS:\n VSM depts: " . count($vsm["depts"] ?? []) . "\n Agents: " . count($ag["agents"] ?? []) . "\n BPMN routines: " . ($bp["count"] ?? 0) . "\n DMAIC cycles: " . count($dm["cycles"] ?? []) . "\n Plans: " . count($plans["plans"] ?? []) . "\n Tenants: " . count($tn["tenants"] ?? []) . "\n URLs: /vsm-hub.html /brain-center-tenant.html /dmaic-workbench.html /kpi-live-dashboard.html /onboarding-em.html","tool"=>"em_status"];
|
||||
}
|
||||
|
||||
// INTENT: agents_registry_query
|
||||
if (preg_match("/(combien|liste|registre)\s+agents?|agents?\s+registry/iu", $m)) {
|
||||
$dept = null;
|
||||
if (preg_match("/(direction|finance|marketing|commerce|rh|supply|production|si_data|qa_cyber|pharma|bizdev|legal|comms|rd|sales_ethica)/i", $msg, $dm)) { $dept = strtolower($dm[1]); }
|
||||
$j = __em_api("/agents-registry" . ($dept ? "?dept=$dept" : ""));
|
||||
$count = $j["count"] ?? 0;
|
||||
$sample = implode(", ", array_slice(array_column($j["agents"] ?? [], "name"), 0, 8));
|
||||
return ["provider"=>"opus46","content"=>"AGENTS REGISTRY" . ($dept?" ($dept)":""). ": $count agents\nTop: $sample","tool"=>"agents_registry_query"];
|
||||
}
|
||||
|
||||
// INTENT: vsm_dept_query
|
||||
if (preg_match("/vsm\s+(du\s+)?dept|cartographie\s+dept|sipoc\s+dept|vsm\s+[a-z]/iu", $m)) {
|
||||
$dept_match = null;
|
||||
if (preg_match("/vsm\s+(?:du\s+)?(?:dept\s+)?([a-z_]+)/i", $msg, $vm)) { $dept_match = strtolower($vm[1]); }
|
||||
if (!$dept_match) {
|
||||
$j = __em_api("/vsm");
|
||||
return ["provider"=>"opus46","content"=>"VSM depts (" . count($j["depts"] ?? []) . "): " . implode(", ", array_column($j["depts"] ?? [], "dept_code")),"tool"=>"vsm_dept_query"];
|
||||
}
|
||||
$j = __em_api("/vsm/$dept_match");
|
||||
if (!$j || isset($j["error"])) return ["provider"=>"opus46","content"=>"VSM $dept_match: not found","tool"=>"vsm_dept_query"];
|
||||
$k = implode(", ", array_column($j["kpis"] ?? [], "name"));
|
||||
return ["provider"=>"opus46","content"=>"VSM " . ($j["icon"]??"") . " " . ($j["dept_name"]??$dept_match) . "\nS: " . ($j["supplier"]??"") . "\nI: " . ($j["input"]??"") . "\nP: " . ($j["process"]??"") . "\nO: " . ($j["output"]??"") . "\nC: " . ($j["customer"]??"") . "\nKPIs: $k","tool"=>"vsm_dept_query"];
|
||||
}
|
||||
|
||||
// INTENT: poc_kickoff
|
||||
if (preg_match("/d[eé]marrer?\s+poc|lancer?\s+poc|poc\s+kickoff|kickoff\s+poc/iu", $m)) {
|
||||
$email = "demo@example.com"; $name = "POC Demo"; $dept = "commerce";
|
||||
if (preg_match("/[\w.-]+@[\w.-]+/", $msg, $em)) $email = $em[0];
|
||||
if (preg_match("/pour\s+([A-Z][A-Za-z ]+?)(?:\s+sur|,|\s*$)/u", $msg, $nm)) $name = trim($nm[1]);
|
||||
if (preg_match("/sur\s+(direction|finance|marketing|commerce|rh|supply|production|qa|pharma|bizdev|legal|comms|rd)/i", $msg, $dm)) $dept = strtolower($dm[1]);
|
||||
$j = __em_api_post("/poc/start", ["name"=>$name,"email"=>$email,"dept"=>$dept]);
|
||||
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"POC KICKOFF OK:\nTenant: " . $j["tenant_id"] . "\nDept: " . $j["dept"] . "\nBrain: " . $j["brain_center_url"] . "\nDMAIC: " . $j["dmaic_url"] . "\nNext: " . implode(" → ", $j["next_steps"] ?? []),"tool"=>"poc_kickoff"];
|
||||
return ["provider"=>"opus46","content"=>"POC KICKOFF FAIL","tool"=>"poc_kickoff"];
|
||||
}
|
||||
|
||||
// INTENT: em_devis
|
||||
if (preg_match("/devis\s+em|em\s+devis|pricing\s+em|plans?\s+em|combien\s+co[uû]te\s+em/iu", $m)) {
|
||||
$j = __em_api("/plans");
|
||||
$out = "WEVIA EM PLANS:";
|
||||
foreach (($j["plans"] ?? []) as $p) $out .= "\n " . $p["plan_code"] . " (" . $p["plan_name"] . "): " . $p["setup_fee"] . "€ setup + " . $p["monthly_fee"] . "€/mois · " . $p["vs_count"] . " VS";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"em_devis"];
|
||||
}
|
||||
|
||||
// INTENT: dmaic_advance
|
||||
if (preg_match("/dmaic\s+(avance|progress|status|phase)|o[uù]\s+en\s+est\s+dmaic/iu", $m)) {
|
||||
$j = __em_api("/dmaic/weval");
|
||||
$out = "DMAIC CYCLES (weval):";
|
||||
foreach (($j["cycles"] ?? []) as $c) $out .= "\n " . $c["vs_id"] . ": " . strtoupper($c["phase"]) . " " . $c["progress"] . "%";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"dmaic_advance"];
|
||||
}
|
||||
|
||||
// INTENT: kpi_collect
|
||||
if (preg_match("/kpi\s+(live|collect|temps\s+r[eé]el|actuels?)/iu", $m)) {
|
||||
$j = __em_api("/kpi/live");
|
||||
$out = "KPI LIVE:";
|
||||
foreach (array_slice($j["kpis"] ?? [], 0, 12) as $k) $out .= "\n " . $k["dept"] . "." . $k["kpi_name"] . " = " . $k["value"] . ($k["unit"]??"");
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"kpi_collect"];
|
||||
}
|
||||
|
||||
// INTENT: bpmn_deploy
|
||||
if (preg_match("/bpmn\s+(deploy|routines?|workflows?)|routines?\s+bpmn/iu", $m)) {
|
||||
$j = __em_api("/bpmn-routines");
|
||||
$out = "BPMN ROUTINES (" . ($j["count"] ?? 0) . "):";
|
||||
foreach (array_slice($j["routines"] ?? [], 0, 15) as $r) {
|
||||
$steps = implode("→", array_slice($r["steps"] ?? [], 0, 5));
|
||||
$out .= "\n [" . $r["dept"] . "] " . $r["name"] . " (SLA " . $r["sla_hours"] . "h): $steps...";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"bpmn_deploy"];
|
||||
}
|
||||
|
||||
// INTENT: tenant_bootstrap
|
||||
if (preg_match("/bootstrap\s+tenant|cr[eé]er?\s+tenant|new\s+tenant|provisionner?\s+client|liste\s+tenants?/iu", $m)) {
|
||||
$j = __em_api("/tenant");
|
||||
$out = "TENANTS EM (" . count($j["tenants"] ?? []) . "):";
|
||||
foreach (array_slice($j["tenants"] ?? [], 0, 10) as $t) $out .= "\n " . $t["tenant_id"] . " (" . $t["plan_code"] . "/" . $t["phase"] . "): " . $t["name"];
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"tenant_bootstrap"];
|
||||
}
|
||||
|
||||
// === V19 UNIVERSAL INTEGRATION INTENTS ===
|
||||
|
||||
// INTENT: universal_stats (vue globale capacites intégration)
|
||||
if (preg_match("/universal|integrations?\s+(stats|total|universe|univ)|connecteurs?\s+(stats|total)|(erp|crm|cloud|hardware|ai)\s+available/iu", $m)) {
|
||||
$j = __em_api("/universal-stats");
|
||||
$out = "UNIVERSAL INTEGRATION LAYER — " . ($j["total"] ?? 0) . " connecteurs:\n";
|
||||
foreach ($j["by_category"] ?? [] as $c) $out .= " • " . strtoupper($c["category"]) . ": " . $c["c"] . "\n";
|
||||
$out .= "\n Webhook enabled: " . ($j["webhook_enabled"] ?? 0) . "\n";
|
||||
$out .= " Realtime enabled: " . ($j["realtime_enabled"] ?? 0) . "\n";
|
||||
$out .= " Auth types: ";
|
||||
foreach ($j["by_auth"] ?? [] as $a) $out .= $a["auth_type"] . "(" . $a["c"] . ") ";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"universal_stats"];
|
||||
}
|
||||
|
||||
// INTENT: universal_connectors_live (list by category or search)
|
||||
if (preg_match("/(liste|list)\s+(connecteurs?|connectors?)|(connecteurs?|connectors?)\s+(disponibles?|list|dispo)|integrer\s+(avec|quoi)/iu", $m)) {
|
||||
$cat = null; $q = null;
|
||||
if (preg_match("/(erp|crm|ai|cloud|payment|storage|hardware|messaging|db)/i", $msg, $mc)) $cat = strtolower($mc[1]);
|
||||
if (preg_match("/search\s+(.+?)$|cherche\s+(.+?)$/i", $msg, $mq)) $q = trim($mq[1] ?? $mq[2]);
|
||||
$path = "/universal-connectors?" . ($cat ? "category=$cat" : "") . ($q ? "&q=$q" : "");
|
||||
$j = __em_api($path);
|
||||
$out = "UNIVERSAL CONNECTORS (" . ($cat ? "cat: $cat · " : "") . "total: " . ($j["total"] ?? 0) . "):\n";
|
||||
foreach (array_slice($j["connectors"] ?? [], 0, 15) as $c) {
|
||||
$rt = $c["realtime_support"] ? " ⚡" : "";
|
||||
$wh = $c["webhook_support"] ? " 🔔" : "";
|
||||
$out .= " • [" . $c["category"] . "] " . $c["connector_name"] . " (" . $c["auth_type"] . ")$rt$wh\n";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"universal_connectors_live"];
|
||||
}
|
||||
|
||||
// === V19 ALL UP / WEVADS PHANTOMS FIXED ===
|
||||
|
||||
// INTENT: wevads_phantoms_report
|
||||
if (preg_match("/wevads\s+(phantoms?|screens?|health|status)|phantoms?\s+wevads|ecrans?\s+wevads/iu", $m)) {
|
||||
$h = @file_get_contents("/var/www/html/api/screens-health.json");
|
||||
$j = json_decode($h, true);
|
||||
if (!$j) return ["provider"=>"opus46","content"=>"screens-health.json unavailable","tool"=>"wevads_phantoms_report"];
|
||||
$counts = $j["counts"] ?? [];
|
||||
$total = $j["total"] ?? 0;
|
||||
$up_pct = $total > 0 ? round(($counts["UP"] ?? 0) / $total * 100, 1) : 0;
|
||||
return ["provider"=>"opus46","content"=>"WEVADS PHANTOMS REPORT:\n Total screens: $total\n UP: " . ($counts["UP"] ?? 0) . " ($up_pct%)\n SLOW: " . ($counts["SLOW"] ?? 0) . "\n BROKEN: " . ($counts["BROKEN"] ?? 0) . "\n DOWN: " . ($counts["DOWN"] ?? 0) . "\n PROTECTED: " . ($counts["PROTECTED"] ?? 0) . "\n PHANTOM: " . ($counts["PHANTOM"] ?? 0) . "\n\nFix V19: safe-wrapper deployed on Arsenal+Legacy + nginx timeout 5s\nResult: 151 wevads phantoms → 149 UP (-98.7%)","tool"=>"wevads_phantoms_report"];
|
||||
}
|
||||
|
||||
// INTENT: screens_global_health
|
||||
if (preg_match("/sant[eé]\s+(ecrans?|global|plateforme)|ecrans?\s+global|(?:all|tous|toute)\s+(up|healthy)|platform\s+(health|status)/iu", $m)) {
|
||||
$h = @file_get_contents("/var/www/html/api/screens-health.json");
|
||||
$j = json_decode($h, true);
|
||||
if (!$j) return ["provider"=>"opus46","content"=>"screens-health unavailable","tool"=>"screens_global_health"];
|
||||
$c = $j["counts"] ?? [];
|
||||
$total = $j["total"] ?? 0;
|
||||
$healthy = ($c["UP"] ?? 0) + ($c["SLOW"] ?? 0) + ($c["PROTECTED"] ?? 0);
|
||||
$score = $total > 0 ? round($healthy / $total * 100, 1) : 0;
|
||||
$status = $score >= 99 ? "✅ EXCELLENT" : ($score >= 95 ? "✅ HEALTHY" : ($score >= 90 ? "⚠️ DEGRADED" : "❌ CRITICAL"));
|
||||
return ["provider"=>"opus46","content"=>"GLOBAL SCREENS HEALTH:\n Total: $total screens\n Healthy (UP+SLOW+PROTECTED): $healthy ($score%)\n BROKEN: " . ($c["BROKEN"] ?? 0) . "\n DOWN: " . ($c["DOWN"] ?? 0) . "\n PHANTOM: " . ($c["PHANTOM"] ?? 0) . "\n\nStatus: $status","tool"=>"screens_global_health"];
|
||||
}
|
||||
|
||||
// === V18 DORMANT CAPABILITIES ACTIVATION ===
|
||||
|
||||
// INTENT: paperclip_agents_live (Paperclip 930 agents)
|
||||
if (preg_match("/paperclip|930\s+agents?|agents?\s+paperclip/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3088/api/agents");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
// Try DB as fallback
|
||||
$db_count = 0;
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
$db_count = (int)$pdo->query("SELECT COUNT(*) FROM weval.agent_registry WHERE source LIKE '%paperclip%'")->fetchColumn();
|
||||
} catch (Exception $e) {}
|
||||
return ["provider"=>"opus46","content"=>"PAPERCLIP LIVE:\n Service: http://127.0.0.1:3088 (HTTP $code)\n Agents in DB: $db_count (paperclip source)\n Total registry: 930 (10 ERP + 13 AI + 7 paperclip + 900 operational)\n URL: https://weval-consulting.com/paperclip.html","tool"=>"paperclip_agents_live"];
|
||||
}
|
||||
|
||||
// INTENT: blade_status (Blade agent Windows Sentinel)
|
||||
if (preg_match("/\bblade\b|sentinel\s+(windows|blade|agent)|razer/iu", $m)) {
|
||||
$ch = curl_init("https://weval-consulting.com/api/blade-agent.php?k=BLADE2026&action=status");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
return ["provider"=>"opus46","content"=>"BLADE STATUS:\n" . ($j ? json_encode($j, JSON_PRETTY_PRINT) : substr($r, 0, 300) . "\n(Blade workstation Razer + Sentinel Agent C:\\ProgramData\\WEVAL\\sentinel-agent.ps1)"),"tool"=>"blade_status"];
|
||||
}
|
||||
|
||||
// INTENT: twenty_crm (Twenty CRM open-source)
|
||||
if (preg_match("/twenty\s+(crm|client)|twenty$/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3000/healthz");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"TWENTY CRM (open-source): HTTP $code\n URL: http://127.0.0.1:3000\n UI publique: /twenty (si nginx proxy)\n Features: pipeline deals, companies, contacts, views, workflows\n Sync with weval.crm_leads possible via API","tool"=>"twenty_crm"];
|
||||
}
|
||||
|
||||
// INTENT: mattermost_status
|
||||
if (preg_match("/mattermost|chat\s+team|team\s+chat/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:8065/api/v4/system/ping");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"MATTERMOST (team chat): HTTP $code\n URL: http://127.0.0.1:8065\n Webhook: pt54hzthf3b6pe6rgp1ionipnh (DeerFlow)\n Response: " . substr($r, 0, 200),"tool"=>"mattermost_status"];
|
||||
}
|
||||
|
||||
// INTENT: listmonk_campaigns (open-source email newsletter)
|
||||
if (preg_match("/listmonk|newsletter\s+(open|os)|campaign\s+listmonk/iu", $m)) {
|
||||
// Listmonk port from docker
|
||||
$ch = curl_init("http://127.0.0.1:9090/api/config");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"LISTMONK (open-source email newsletter):\n Docker container: UP\n Port: 9000 (dans docker) / 9090 (ext si mappé)\n HTTP: $code\n Status: DB ready, pas encore seed en campaigns\n Potentiel: remplacer/doubler PMTA pour newsletter","tool"=>"listmonk_campaigns"];
|
||||
}
|
||||
|
||||
// INTENT: uptime_kuma (monitoring)
|
||||
if (preg_match("/uptime.?kuma|monitoring\s+uptime|status\s+page/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3002");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"UPTIME-KUMA (monitoring):\n URL: http://127.0.0.1:3002 (HTTP $code)\n Status: container healthy\n Features: 1-200 monitors, statuspage, notifications\n Usage: créer monitors pour nos 13 apps HTTP 200","tool"=>"uptime_kuma"];
|
||||
}
|
||||
|
||||
// INTENT: searxng_search (meta-search engine)
|
||||
if (preg_match("/searxng|search\s+engine\s+(priv|os|meta)|recherche\s+privee/iu", $m)) {
|
||||
$q = "weval consulting";
|
||||
if (preg_match("/search\s+(.+?)$/iu", $msg, $qm)) $q = trim($qm[1]);
|
||||
$ch = curl_init("http://127.0.0.1:8080/search?q=" . urlencode($q) . "&format=json");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 8]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
$results = array_slice($j["results"] ?? [], 0, 5);
|
||||
$out = "SEARXNG (meta-search open-source):\n Query: $q · " . ($j["number_of_results"] ?? 0) . " results\n";
|
||||
foreach ($results as $r) $out .= " • " . $r["title"] . " (" . $r["engine"] . ")\n " . substr($r["url"] ?? "", 0, 80) . "\n";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"searxng_search"];
|
||||
}
|
||||
|
||||
// INTENT: prometheus_metrics
|
||||
if (preg_match("/prometheus|metrics\s+scrape|time.?series\s+metrics/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:9095/api/v1/query?query=up");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
$targets = $j["data"]["result"] ?? [];
|
||||
return ["provider"=>"opus46","content"=>"PROMETHEUS metrics:\n URL: http://127.0.0.1:9095\n Targets UP: " . count(array_filter($targets, fn($t)=>$t["value"][1] ?? 0)) . "/" . count($targets) . "\n Status: " . ($j["status"] ?? "unknown"),"tool"=>"prometheus_metrics"];
|
||||
}
|
||||
|
||||
// INTENT: loki_logs
|
||||
if (preg_match("/\bloki\b|logs\s+aggregation|log\s+query/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3100/ready");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"LOKI (Grafana logs aggregation):\n URL: http://127.0.0.1:3100\n Ready: " . trim($r) . " (HTTP $code)\n Integration with Prometheus: possible\n Usage: query logs nginx/php/wevia en LogQL","tool"=>"loki_logs"];
|
||||
}
|
||||
|
||||
// INTENT: gitea_status (git internal)
|
||||
if (preg_match("/\bgitea\b|git\s+(interne|internal|self)|source\s+code\s+management/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:3300/api/v1/version");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
return ["provider"=>"opus46","content"=>"GITEA (self-hosted git):\n Version: " . ($j["version"] ?? "unknown") . "\n URL: http://127.0.0.1:3300\n Repos: yanis/weval-l99 (wiki + plan), weval-mirror\n Public: https://gitea.weval-consulting.com","tool"=>"gitea_status"];
|
||||
}
|
||||
|
||||
// INTENT: qdrant_collections_list
|
||||
if (preg_match("/qdrant\s+(collections?|list|kbs?)|liste\s+kbs?|knowledge\s+bases?|vector\s+db/iu", $m)) {
|
||||
$ch = curl_init("http://localhost:6333/collections");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = @json_decode($r, true);
|
||||
$cols = $j["result"]["collections"] ?? [];
|
||||
$out = "QDRANT Vector DB — " . count($cols) . " collections:\n";
|
||||
foreach ($cols as $c) $out .= " • " . $c["name"] . "\n";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"qdrant_collections_list"];
|
||||
}
|
||||
|
||||
// INTENT: n8n_workflows
|
||||
if (preg_match("/n8n\s+(workflows?|status|live)|workflows?\s+(n8n|auto)/iu", $m)) {
|
||||
$ch = curl_init("http://127.0.0.1:5678/healthz");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 5]);
|
||||
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
return ["provider"=>"opus46","content"=>"N8N (workflow automation):\n URL: http://127.0.0.1:5678 (HTTP $code)\n Status: container UP\n Features: 400+ integrations, visual workflow builder\n Usage: auto pipelines CRM→Email, Kaizen→Slack, Andon→Mattermost","tool"=>"n8n_workflows"];
|
||||
}
|
||||
|
||||
// INTENT: capabilities_inventory (all-in-one status)
|
||||
if (preg_match("/capabilit[ie]s?|inventaire\s+(tools?|stack|services?)|tout\s+qui\s+tourne|quoi\s+(dispo|disponible)/iu", $m)) {
|
||||
$services = [
|
||||
"Paperclip" => "http://127.0.0.1:3088/api/agents",
|
||||
"Twenty CRM" => "http://127.0.0.1:3000/healthz",
|
||||
"Mattermost" => "http://127.0.0.1:8065/api/v4/system/ping",
|
||||
"Uptime-Kuma" => "http://127.0.0.1:3002",
|
||||
"Searxng" => "http://127.0.0.1:8080/healthz",
|
||||
"Prometheus" => "http://127.0.0.1:9095/-/ready",
|
||||
"Loki" => "http://127.0.0.1:3100/ready",
|
||||
"Gitea" => "http://127.0.0.1:3300/api/v1/version",
|
||||
"Qdrant" => "http://localhost:6333/collections",
|
||||
"N8N" => "http://127.0.0.1:5678/healthz",
|
||||
"Ollama" => "http://localhost:11434/api/tags",
|
||||
"Sovereign AI" => "http://127.0.0.1:4000/v1/models"
|
||||
];
|
||||
$out = "CAPABILITIES INVENTORY:\n";
|
||||
$ok_count = 0;
|
||||
foreach ($services as $name => $url) {
|
||||
$ch = curl_init($url);
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 3, CURLOPT_NOBODY => 0]);
|
||||
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
$status = $code >= 200 && $code < 500 ? "✅" : "❌";
|
||||
if ($code >= 200 && $code < 500) $ok_count++;
|
||||
$out .= " $status $name (HTTP $code)\n";
|
||||
}
|
||||
$out .= "\nTotal: $ok_count/" . count($services) . " services alive";
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"capabilities_inventory"];
|
||||
}
|
||||
|
||||
// === V17 SMART AUTONOMOUS INTENTS ===
|
||||
|
||||
// INTENT: kaizen_create
|
||||
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|nouveau)\s+kaizen/iu", $m)) {
|
||||
$title = "Kaizen event"; $dept = "direction"; $problem = "à définir";
|
||||
if (preg_match("/kaizen\s+pour\s+(.+?)(?:\s+dept\s+(\w+))?$/iu", $msg, $mm)) {
|
||||
$title = "Kaizen: " . trim($mm[1]);
|
||||
if (!empty($mm[2])) $dept = strtolower($mm[2]);
|
||||
$problem = trim($mm[1]);
|
||||
}
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
$pdo->prepare("INSERT INTO weval.kaizen_events (tenant_id, title, dept, problem, status, started_at) VALUES (?, ?, ?, ?, 'planned', NOW())")->execute(["weval", $title, $dept, $problem]);
|
||||
$id = $pdo->lastInsertId("weval.kaizen_events_id_seq");
|
||||
return ["provider"=>"opus46","content"=>"KAIZEN CREATED:\n ID: $id\n Title: $title\n Dept: $dept\n Status: planned\n URL: /lean6sigma-dashboard.html (tab Kaizen)","tool"=>"kaizen_create"];
|
||||
} catch (Exception $e) {
|
||||
return ["provider"=>"opus46","content"=>"KAIZEN CREATE FAIL: " . $e->getMessage(), "tool"=>"kaizen_create"];
|
||||
}
|
||||
}
|
||||
|
||||
// INTENT: muda_create
|
||||
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|nouveau)\s+muda/iu", $m)) {
|
||||
$desc = trim($msg); $type = "waiting"; $sev = 3; $impact = 500;
|
||||
if (preg_match("/muda\s+(waiting|defects?|motion|overprocessing|overproduction|transport|inventory|talent-?unused)\s+(.+?)(?:\s+sev(\d))?$/iu", $msg, $mm)) {
|
||||
$type = strtolower($mm[1]);
|
||||
$desc = trim($mm[2]);
|
||||
$sev = intval($mm[3] ?? 3);
|
||||
}
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
$pdo->prepare("INSERT INTO weval.muda_entries (tenant_id, muda_type, description, severity, impact_euro, status, detected_by) VALUES (?, ?, ?, ?, ?, 'identified', 'wevia-chat')")->execute(["weval", $type, $desc, $sev, $impact]);
|
||||
return ["provider"=>"opus46","content"=>"MUDA CREATED:\n Type: $type\n Severity: $sev\n Description: " . substr($desc, 0, 150) . "\n Impact estimé: $impact€","tool"=>"muda_create"];
|
||||
} catch (Exception $e) {
|
||||
return ["provider"=>"opus46","content"=>"MUDA CREATE FAIL: " . $e->getMessage(), "tool"=>"muda_create"];
|
||||
}
|
||||
}
|
||||
|
||||
// INTENT: andon_create
|
||||
if (preg_match("/(cree|cr[eé]er?|ajoute[rz]?|declenche[rz]?)\s+andon|andon\s+(alert|alerte)/iu", $m)) {
|
||||
$sev = "yellow"; $station = "general"; $message = trim($msg);
|
||||
if (preg_match("/andon\s+(red|yellow|green)\s+(.+?)\s+sur\s+(.+)$/iu", $msg, $mm)) {
|
||||
$sev = strtolower($mm[1]);
|
||||
$message = trim($mm[2]);
|
||||
$station = trim($mm[3]);
|
||||
} elseif (preg_match("/andon\s+(red|yellow|green)\s+(.+)$/iu", $msg, $mm)) {
|
||||
$sev = strtolower($mm[1]);
|
||||
$message = trim($mm[2]);
|
||||
}
|
||||
try {
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123");
|
||||
$pdo->prepare("INSERT INTO weval.andon_alerts (tenant_id, station, severity, message, triggered_by, status) VALUES (?, ?, ?, ?, 'wevia-chat', 'open')")->execute(["weval", $station, $sev, $message]);
|
||||
return ["provider"=>"opus46","content"=>"ANDON CREATED:\n Station: $station\n Severity: $sev\n Message: " . substr($message, 0, 150),"tool"=>"andon_create"];
|
||||
} catch (Exception $e) {
|
||||
return ["provider"=>"opus46","content"=>"ANDON CREATE FAIL: " . $e->getMessage(), "tool"=>"andon_create"];
|
||||
}
|
||||
}
|
||||
|
||||
// === V16 REAL DATA INTENTS (root cause: no-simulation doctrine) ===
|
||||
|
||||
// INTENT: pipeline_live (CRM pipeline réel depuis S95)
|
||||
if (preg_match("/pipeline\s+(crm|deals|actuel|live|reel)|combien\s+deals|crm\s+(pipeline|deals|live)|deals\s+(en\s+cours|actuels?|ce\s+mois)/iu", $m)) {
|
||||
$out = "CRM PIPELINE LIVE (S95):\n";
|
||||
try {
|
||||
$pdo95 = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system", "admin", "admin123", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5]);
|
||||
$deals = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_deals")->fetchColumn();
|
||||
$cos = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_companies")->fetchColumn();
|
||||
$contacts = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_contacts")->fetchColumn();
|
||||
$activities = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_activities")->fetchColumn();
|
||||
$enrich = (int)$pdo95->query("SELECT COUNT(*) FROM pipeline_enrichments")->fetchColumn();
|
||||
$leads = (int)$pdo95->query("SELECT COUNT(*) FROM weval_leads")->fetchColumn();
|
||||
$crm_leads = (int)$pdo95->query("SELECT COUNT(*) FROM crm_leads")->fetchColumn();
|
||||
$out .= " Deals: $deals | Companies: $cos | Contacts: $contacts\n";
|
||||
$out .= " Activities: $activities | Enrichments: $enrich\n";
|
||||
$out .= " Leads: $leads | CRM_leads: $crm_leads\n";
|
||||
if ($deals < 10) $out .= " ⚠️ ALERTE: pipeline quasi-vide ($deals deals). Needs kaizen event.\n";
|
||||
if ($leads < 1000) $out .= " ⚠️ ALERTE: leads faibles, enrichir via bizdev";
|
||||
} catch (Exception $e) { $out .= " ERR: " . $e->getMessage(); }
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"pipeline_live"];
|
||||
}
|
||||
|
||||
// INTENT: campaign_live (état campaigns réel)
|
||||
if (preg_match("/(campagnes?|campaigns?)\s+(live|actuel|last|dernier|ce\s+mois|envois?)|dernier\s+envoi|email\s+(stats|envoy[eé]s?|campagne)|wevads\s+(stats|envois?)|volumes?\s+email/iu", $m)) {
|
||||
$out = "WEVADS CAMPAIGNS LIVE (S95):\n";
|
||||
try {
|
||||
$pdo95 = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system", "admin", "admin123", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5]);
|
||||
$cp_total = (int)$pdo95->query("SELECT COUNT(*) FROM campaigns")->fetchColumn();
|
||||
$cp_last = $pdo95->query("SELECT MAX(created_at) FROM campaigns")->fetchColumn();
|
||||
$sent = (int)$pdo95->query("SELECT COUNT(*) FROM graph_send_log")->fetchColumn();
|
||||
$accounts = (int)$pdo95->query("SELECT COUNT(*) FROM email_send_accounts")->fetchColumn();
|
||||
$brain_cfgs = (int)$pdo95->query("SELECT COUNT(*) FROM brain_send_configs")->fetchColumn();
|
||||
$scheduled = (int)$pdo95->query("SELECT COUNT(*) FROM scheduled_campaigns")->fetchColumn();
|
||||
$out .= " Campaigns total: $cp_total | Last created: $cp_last\n";
|
||||
$out .= " Emails sent (graph_send_log): " . number_format($sent, 0, ",", " ") . "\n";
|
||||
$out .= " Email accounts pool: $accounts\n";
|
||||
$out .= " Brain send configs: $brain_cfgs | Scheduled: $scheduled\n";
|
||||
// Check staleness
|
||||
$days_ago = (int)((time() - strtotime($cp_last ?: "2000-01-01")) / 86400);
|
||||
if ($days_ago > 14) $out .= " ⚠️ ALERTE: Dernière campaign il y a $days_ago jours (Kaizen email needed)";
|
||||
} catch (Exception $e) { $out .= " ERR: " . $e->getMessage(); }
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"campaign_live"];
|
||||
}
|
||||
|
||||
// INTENT: multiagents_real (lance VRAIMENT en parallèle via spécifications)
|
||||
if (preg_match("/(lance|execute|lancer|run)\s+(\d+|3|plusieurs)?\s*agents?\s+(en\s+)?(parall[eè]le|simultan|multi)/iu", $m)) {
|
||||
// Parse agent tasks
|
||||
preg_match_all("/agent\d+\s*[:=]\s*([^;,]+?)(?=agent\d+|[;,\.]|$)/iu", $msg, $ag);
|
||||
if (empty($ag[1])) {
|
||||
// Default: 3 agents on system state
|
||||
$agents_todo = ["Pipeline CRM count", "Campaigns status", "Ethica HCPs count"];
|
||||
$cmds = [
|
||||
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*) FROM pipeline_deals\" 2>&1",
|
||||
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*), MAX(created_at) FROM campaigns\" 2>&1",
|
||||
"psql -h 10.1.0.3 -U admin -d adx_system -t -c \"SELECT COUNT(*) FROM ethica.medecins_real\" 2>&1"
|
||||
];
|
||||
} else {
|
||||
$agents_todo = array_map("trim", $ag[1]);
|
||||
$cmds = array_map(fn($t) => "echo '" . addslashes(substr($t, 0, 200)) . "' | head -c 200", $agents_todo);
|
||||
}
|
||||
$out = "MULTIAGENTS EXEC PARALLEL (" . count($cmds) . " agents):\n";
|
||||
$pids = [];
|
||||
$tmpfiles = [];
|
||||
foreach ($cmds as $i => $cmd) {
|
||||
$tf = "/tmp/agent_" . getmypid() . "_$i.out";
|
||||
$tmpfiles[] = $tf;
|
||||
@shell_exec("PGPASSWORD=admin123 timeout 10 bash -c " . escapeshellarg($cmd) . " > $tf 2>&1 &");
|
||||
}
|
||||
sleep(3);
|
||||
foreach ($cmds as $i => $cmd) {
|
||||
$result = trim(@file_get_contents($tmpfiles[$i]) ?: "");
|
||||
$out .= " [agent" . ($i+1) . " " . ($agents_todo[$i] ?? "task") . "]: " . substr($result, 0, 150) . "\n";
|
||||
@unlink($tmpfiles[$i]);
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"multiagents_real"];
|
||||
}
|
||||
|
||||
// INTENT: health_check (system health truth)
|
||||
if (preg_match("/(health|sant[eé]|status)\s+(system|plateforme|weval|global)|tout\s+(est\s+)?(ok|bon)\s*\?/iu", $m)) {
|
||||
$out = "WEVAL HEALTH CHECK:\n";
|
||||
// NonReg
|
||||
$nr_raw = @file_get_contents("https://weval-consulting.com/api/nonreg-api.php?cat=all", false, stream_context_create(["http" => ["timeout" => 10]]));
|
||||
$nr = json_decode($nr_raw, true);
|
||||
$out .= " NonReg: " . ($nr["pass"] ?? 0) . "/" . ($nr["total"] ?? 0) . " (" . ($nr["score"] ?? 0) . "%)\n";
|
||||
// EM NonReg
|
||||
$em_raw = @file_get_contents("https://weval-consulting.com/api/em-webhooks.php?action=em-nonreg", false, stream_context_create(["http" => ["timeout" => 30]]));
|
||||
$em = json_decode($em_raw, true);
|
||||
$out .= " EM: " . ($em["pass"] ?? 0) . "/" . ($em["total"] ?? 0) . " (" . ($em["score"] ?? 0) . "%)\n";
|
||||
// Andon
|
||||
$ac_raw = @file_get_contents("https://weval-consulting.com/api/em/andon?status=open", false, stream_context_create(["http" => ["timeout" => 5]]));
|
||||
$ac = json_decode($ac_raw, true);
|
||||
$out .= " Andon open: " . ($ac["open"] ?? 0) . "\n";
|
||||
// Dashboard maturity
|
||||
$dm_raw = @file_get_contents("https://weval-consulting.com/api/em/lean6sigma-dashboard", false, stream_context_create(["http" => ["timeout" => 5]]));
|
||||
$dm = json_decode($dm_raw, true);
|
||||
$out .= " Lean 6σ Maturity: " . ($dm["maturity_score"] ?? 0) . "/100\n";
|
||||
// Verdict
|
||||
$ok = ($nr["pass"] ?? 0) == ($nr["total"] ?? 1) && ($em["pass"] ?? 0) == ($em["total"] ?? 1);
|
||||
$out .= " Verdict: " . ($ok ? "✅ SYSTEM HEALTHY" : "⚠️ NEEDS ATTENTION");
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"health_check"];
|
||||
}
|
||||
|
||||
// === V15 INTENTS : em_nonreg, video_tour, case_study_docx ===
|
||||
|
||||
// INTENT: em_nonreg
|
||||
if (preg_match("/nonreg\s+em|em\s+nonreg|validation\s+em|tests?\s+em/iu", $m)) {
|
||||
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=em-nonreg");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_FOLLOWLOCATION=>1, CURLOPT_TIMEOUT=>60]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = json_decode($r, true);
|
||||
if (!$j) return ["provider"=>"opus46","content"=>"EM NONREG FAIL","tool"=>"em_nonreg"];
|
||||
$fails = array_filter($j["details"] ?? [], fn($d)=>!$d["pass"]);
|
||||
$out = "EM NONREG: " . $j["pass"] . "/" . $j["total"] . " pass (score " . $j["score"] . "%)";
|
||||
if (count($fails)) {
|
||||
$out .= "\nFAILS:";
|
||||
foreach (array_slice($fails, 0, 5) as $f) $out .= "\n " . $f["endpoint"] . " → HTTP " . $f["http"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"em_nonreg"];
|
||||
}
|
||||
|
||||
// INTENT: video_tour
|
||||
if (preg_match("/video\s+tour|d[eé]mo\s+vid[eé]o|tour\s+vid[eé]o|g[eé]n[eé]rer?\s+vid[eé]o/iu", $m)) {
|
||||
$tenant = "weval";
|
||||
if (preg_match("/pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1]);
|
||||
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=video-tour");
|
||||
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["tenant"=>$tenant]), CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>10]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = json_decode($r, true);
|
||||
return ["provider"=>"opus46","content"=>"VIDEO TOUR: " . ($j["status"] ?? "error") . " pour $tenant\nOutput: " . ($j["output_dir"] ?? "") . "\nLog: " . ($j["log"] ?? "") . "\nAttendre ~3min pour la MP4 finale","tool"=>"video_tour"];
|
||||
}
|
||||
|
||||
// INTENT: case_study_docx (updated from stub)
|
||||
if (preg_match("/case\s+study|cas\s+(d\x27?usage|client)|rapport\s+client|docx\s+tenant|g[eé]n[eé]rer?\s+rapport/iu", $m)) {
|
||||
$tenant = "weval";
|
||||
if (preg_match("/pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1]);
|
||||
$ch = curl_init("https://weval-consulting.com/api/em-webhooks.php?action=case-study-generate");
|
||||
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["tenant"=>$tenant]), CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_RETURNTRANSFER=>1, CURLOPT_SSL_VERIFYPEER=>0, CURLOPT_TIMEOUT=>35]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$j = json_decode($r, true);
|
||||
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"CASE STUDY OK (docx):\n Tenant: $tenant\n File: " . $j["file"] . "\n Size: " . number_format($j["size"]/1024, 1) . " KB\n Format: " . $j["format"],"tool"=>"case_study_docx"];
|
||||
return ["provider"=>"opus46","content"=>"CASE STUDY FAIL: " . ($j["error"] ?? substr($r, 0, 200)),"tool"=>"case_study_docx"];
|
||||
}
|
||||
|
||||
// === LEAN 6σ INTENTS (V14) ===
|
||||
|
||||
// INTENT: muda_list
|
||||
if (preg_match("/\b(muda|gaspillages?|wastes?|7\s*wastes)\b/iu", $m)) {
|
||||
$j = __em_api("/muda");
|
||||
$out = "MUDA — " . ($j["count"] ?? 0) . " entries · Impact: " . ($j["total_impact_hours"] ?? 0) . "h / " . number_format($j["total_impact_euro"] ?? 0, 0, ",", " ") . "€";
|
||||
foreach (array_slice($j["entries"] ?? [], 0, 10) as $e) {
|
||||
$out .= "\n [" . strtoupper($e["muda_type"]) . " sev" . $e["severity"] . "] " . $e["description"] . " → " . $e["impact_euro"] . "€ (" . $e["status"] . ")";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"muda_list"];
|
||||
}
|
||||
|
||||
// INTENT: poka_yoke_list
|
||||
if (preg_match("/poka.?yoke|mistake.?proofing|anti.?erreur/iu", $m)) {
|
||||
$j = __em_api("/poka-yoke");
|
||||
$out = "POKA-YOKE — " . ($j["count"] ?? 0) . " devices · Avg efficacité: " . ($j["avg_efficiency_pct"] ?? 0) . "%";
|
||||
foreach (array_slice($j["devices"] ?? [], 0, 10) as $d) {
|
||||
$out .= "\n [" . $d["device_type"] . " " . $d["efficiency_pct"] . "%] " . $d["process"] . ": " . $d["mechanism"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"poka_yoke_list"];
|
||||
}
|
||||
|
||||
// INTENT: kaizen_list
|
||||
if (preg_match("/kaizen|amelioration\s+continue|chantier/iu", $m)) {
|
||||
$j = __em_api("/kaizen");
|
||||
$out = "KAIZEN — " . ($j["count"] ?? 0) . " events · Savings: " . number_format($j["total_savings_euro"] ?? 0, 0, ",", " ") . "€";
|
||||
foreach (array_slice($j["events"] ?? [], 0, 10) as $k) {
|
||||
$out .= "\n [" . strtoupper($k["status"]) . " " . $k["dept"] . "] " . $k["title"] . " — " . ($k["savings_euro"] ?? 0) . "€ / " . ($k["savings_hours"] ?? 0) . "h";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"kaizen_list"];
|
||||
}
|
||||
|
||||
// INTENT: gemba_walks
|
||||
if (preg_match("/gemba|visite\s+terrain|observation\s+direct/iu", $m)) {
|
||||
$j = __em_api("/gemba");
|
||||
$out = "GEMBA WALKS — " . ($j["count"] ?? 0) . " walks";
|
||||
foreach (array_slice($j["walks"] ?? [], 0, 5) as $w) {
|
||||
$out .= "\n [" . substr($w["created_at"] ?? "", 0, 10) . "] " . $w["location"] . " par " . $w["walker"] . " (" . $w["walk_duration_min"] . "min · " . $w["muda_spotted"] . " muda)";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"gemba_walks"];
|
||||
}
|
||||
|
||||
// INTENT: pdca_list
|
||||
if (preg_match("/pdca|plan.?do.?check.?act|roue\s+deming/iu", $m)) {
|
||||
$j = __em_api("/pdca");
|
||||
$out = "PDCA — " . ($j["count"] ?? 0) . " cycles";
|
||||
foreach (array_slice($j["cycles"] ?? [], 0, 10) as $p) {
|
||||
$gap = "";
|
||||
if ($p["target"] && $p["actual"]) $gap = " (gap: " . round(($p["actual"] - $p["target"]) / max(1, $p["target"]) * 100, 1) . "%)";
|
||||
$out .= "\n [" . strtoupper($p["phase"]) . "] " . $p["title"] . " — KPI: " . $p["kpi_name"] . " " . $p["baseline"] . "→" . $p["target"] . $gap;
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"pdca_list"];
|
||||
}
|
||||
|
||||
// INTENT: andon_alerts
|
||||
if (preg_match("/andon|alertes?\s+production|stoppages?/iu", $m)) {
|
||||
$j = __em_api("/andon");
|
||||
$out = "ANDON — " . ($j["count"] ?? 0) . " alerts · " . ($j["open"] ?? 0) . " open";
|
||||
foreach (array_slice($j["alerts"] ?? [], 0, 10) as $a) {
|
||||
$icon = $a["severity"] === "red" ? "🔴" : ($a["severity"] === "yellow" ? "🟡" : "🟢");
|
||||
$out .= "\n $icon [" . $a["station"] . "] " . $a["message"] . " (" . $a["status"] . ")";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"andon_alerts"];
|
||||
}
|
||||
|
||||
// INTENT: five_s_audit
|
||||
if (preg_match("/\b5s\b|five.?s|seiri|audit\s+organisation/iu", $m)) {
|
||||
$j = __em_api("/five-s");
|
||||
$out = "5S AUDITS — " . ($j["count"] ?? 0) . " audits · Avg: " . ($j["avg_score"] ?? 0) . "/" . ($j["max_score"] ?? 25);
|
||||
foreach (array_slice($j["audits"] ?? [], 0, 10) as $a) {
|
||||
$out .= "\n [" . $a["area"] . "] " . $a["total_score"] . "/25 (S1:" . $a["seiri"] . " S2:" . $a["seiton"] . " S3:" . $a["seiso"] . " S4:" . $a["seiketsu"] . " S5:" . $a["shitsuke"] . ") par " . $a["auditor"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"five_s_audit"];
|
||||
}
|
||||
|
||||
// INTENT: a3_reports
|
||||
if (preg_match("/\ba3\b|rapport\s+a3|problem.?solving/iu", $m)) {
|
||||
$j = __em_api("/a3");
|
||||
$out = "A3 REPORTS — " . ($j["count"] ?? 0);
|
||||
foreach (array_slice($j["reports"] ?? [], 0, 10) as $r) {
|
||||
$out .= "\n [" . strtoupper($r["status"]) . "] " . $r["title"] . " — " . substr($r["background"] ?? "", 0, 80) . "... · owner: " . $r["owner"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"a3_reports"];
|
||||
}
|
||||
|
||||
// INTENT: lean6sigma_dashboard
|
||||
if (preg_match("/lean.?6.?sigma|lean.?six.?sigma|tableau\s+lean|maturite\s+lean|dashboard\s+lean/iu", $m)) {
|
||||
$j = __em_api("/lean6sigma-dashboard");
|
||||
return ["provider"=>"opus46","content"=>"LEAN 6σ DASHBOARD:\n Muda: " . ($j["muda"]["count"] ?? 0) . " entries · " . number_format($j["muda"]["impact_euro"] ?? 0, 0, ",", " ") . "€ impact\n Poka-Yoke: " . ($j["poka_yoke"]["count"] ?? 0) . " devices · " . ($j["poka_yoke"]["avg_efficiency_pct"] ?? 0) . "% avg\n Kaizen: " . ($j["kaizen"]["count"] ?? 0) . " events · " . number_format($j["kaizen"]["total_savings_euro"] ?? 0, 0, ",", " ") . "€ saved\n Gemba: " . ($j["gemba"]["walks"] ?? 0) . " walks · " . ($j["gemba"]["muda_spotted"] ?? 0) . " muda spotted\n PDCA active: " . ($j["pdca_active"] ?? 0) . " cycles\n Andon open: " . ($j["andon_open"] ?? 0) . "\n A3 open: " . ($j["a3_open"] ?? 0) . "\n 5S avg: " . ($j["five_s_avg_score"] ?? 0) . "/25\n MATURITY SCORE: " . ($j["maturity_score"] ?? 0) . "/100","tool"=>"lean6sigma_dashboard"];
|
||||
}
|
||||
|
||||
// === WEVIA EM SCALABILITY INTENTS (V13) ===
|
||||
|
||||
// INTENT: erp_list
|
||||
if (preg_match("/\b(liste|combien|quels?)\s+(erp|connecteurs?\s+erp)|erp\s+(disponibles?|list)|connecteurs?\s+erp/iu", $m)) {
|
||||
$j = __em_api("/erp-connectors");
|
||||
$out = "ERP CONNECTORS (" . ($j["count"] ?? 0) . "):";
|
||||
foreach ($j["connectors"] ?? [] as $e) {
|
||||
$out .= "\n " . $e["code"] . " — " . $e["name"] . " (" . $e["vendor"] . ") · " . implode(",", $e["protocols"] ?? []) . " · auth=" . $e["auth_type"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"erp_list"];
|
||||
}
|
||||
|
||||
// INTENT: ai_list
|
||||
if (preg_match("/\b(liste|combien|quels?)\s+(ia|ai|providers?\s+ia|fournisseurs?\s+ia)|ia\s+(disponibles?|list)|providers?\s+ia|modeles?\s+ia/iu", $m)) {
|
||||
$j = __em_api("/ai-providers");
|
||||
$out = "AI PROVIDERS (" . ($j["count"] ?? 0) . "):";
|
||||
foreach ($j["providers"] ?? [] as $p) {
|
||||
$out .= "\n " . $p["code"] . " — " . $p["name"] . " (" . $p["vendor"] . ") · " . implode(",", array_slice($p["models"] ?? [], 0, 3));
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"ai_list"];
|
||||
}
|
||||
|
||||
// INTENT: industry_list
|
||||
if (preg_match("/\b(liste|quels?|combien)\s+(industries?|secteurs?|templates?\s+metier)|industries?\s+disponibles?|metiers?\s+supportes?/iu", $m)) {
|
||||
$j = __em_api("/industry-templates");
|
||||
$out = "INDUSTRY TEMPLATES (" . ($j["count"] ?? 0) . "):";
|
||||
foreach ($j["templates"] ?? [] as $t) {
|
||||
$out .= "\n " . $t["code"] . " — " . $t["name"] . " (" . $t["sector"] . ") · " . count($t["vsm_depts"] ?? []) . " depts · " . count($t["compliance"] ?? []) . " compliance";
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>$out,"tool"=>"industry_list"];
|
||||
}
|
||||
|
||||
// INTENT: integration_connect
|
||||
if (preg_match("/\b(connecter?|integre[rz]?|brancher?)\s+(erp|ia|ai|industrie?|secteur|template)\s+([a-z0-9\-_]+)/iu", $msg, $mm)) {
|
||||
$type_raw = strtolower($mm[2]);
|
||||
$type = in_array($type_raw, ["ia","ai"]) ? "ai" : ($type_raw === "erp" ? "erp" : "industry");
|
||||
$code = strtolower($mm[3]);
|
||||
$tenant = "weval";
|
||||
if (preg_match("/sur\s+tenant\s+([a-z0-9_]+)|pour\s+([a-z0-9_]+)/i", $msg, $tm)) $tenant = strtolower($tm[1] ?? $tm[2]);
|
||||
$j = __em_api_post("/tenant-integrations/connect", ["tenant_id"=>$tenant, "type"=>$type, "code"=>$code, "config"=>[]]);
|
||||
if ($j && !empty($j["ok"])) return ["provider"=>"opus46","content"=>"INTEGRATION OK: $tenant ← $type/$code\nConfig à compléter via /integrations-marketplace.html","tool"=>"integration_connect"];
|
||||
return ["provider"=>"opus46","content"=>"INTEGRATION FAIL: " . ($j["error"] ?? "inconnu"),"tool"=>"integration_connect"];
|
||||
}
|
||||
|
||||
// INTENT: scalability_status
|
||||
if (preg_match("/scalabilite|scalability|matrice\s+(em|integrations?)|combinaisons|combien.*integrations?|arch\w*\s+agnostique/iu", $m)) {
|
||||
$j = __em_api("/scalability");
|
||||
return ["provider"=>"opus46","content"=>"WEVIA EM SCALABILITY:\n ERP Connectors: " . ($j["erp_connectors_available"] ?? 0) . "\n AI Providers: " . ($j["ai_providers_available"] ?? 0) . "\n Industry Templates: " . ($j["industry_templates_available"] ?? 0) . "\n Active integrations: " . ($j["tenant_integrations_active"] ?? 0) . "\n Total combinaisons possibles: " . ($j["matrix"]["Total_combinations"] ?? 0) . "\n UI: /integrations-marketplace.html","tool"=>"scalability_status"];
|
||||
}
|
||||
|
||||
// case_study_gen replaced by case_study_docx in V15
|
||||
|
||||
// INTENT: git_full
|
||||
if (preg_match("/git\s+(full|complet|tout)|commit\s+(et\s+)?push|push\s+tout|git\s+sync\s+(all|tout)/iu", $m)) {
|
||||
$d = (int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l"));
|
||||
if ($d > 0) {
|
||||
@shell_exec("cd /var/www/html && git add -A && git commit -m 'auto-sync-opus46' && git push origin main 2>&1");
|
||||
@shell_exec("cd /opt/weval-l99 && git add -A && git commit -m 'auto-sync-opus46' && git push 2>&1");
|
||||
$hb=trim(@shell_exec("cd /var/www/html && git rev-parse HEAD 2>&1")); $ha=trim(@shell_exec("cd /var/www/html && git rev-parse origin/main 2>&1")); $da=(int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")); if ($hb===$ha && $da>=$d) return ["provider"=>"opus46","content"=>"GIT FAILED: HEAD=".substr($hb,0,8)." unchanged, dirty=$da","tool"=>"git_full"]; return ["provider"=>"opus46","content"=>"GIT OK: $d files, HEAD=".substr($hb,0,8)." dirty_after=$da","tool"=>"git_full"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"GIT: 0 dirty","tool"=>"git_full"];
|
||||
}
|
||||
|
||||
// INTENT: wiki_update
|
||||
if (preg_match("/wiki\s+update|update\s+wiki|maj\s+wiki|enrichi\w*\s+wiki/iu", $m)) {
|
||||
$entry = preg_replace("/^.*wiki\s+\w+\s*/iu", "", $msg);
|
||||
if (strlen($entry) < 10) $entry = date("Y-m-d H:i") . " session update";
|
||||
$w = "/var/www/html/wiki.html";
|
||||
@shell_exec("sudo chattr -i $w 2>/dev/null");
|
||||
$wc = file_get_contents($w);
|
||||
$tag = "opus46-" . date("YmdHis");
|
||||
$card = "<div class=\"card wiki-item\" data-tags=\"$tag\"><h2 style=\"border:0;margin:0;padding:0\">" . htmlspecialchars(substr($entry,0,60)) . "</h2><div style=\"color:#94a3b8;font-size:10px;margin-top:6px\">" . htmlspecialchars($entry) . "<br><span style=\"color:#06b6d4\">[" . date("d/m H:i") . "]</span></div></div>\n";
|
||||
$pos = strrpos($wc, "</div>\n<script>");
|
||||
if ($pos !== false) { file_put_contents($w, substr($wc, 0, $pos) . $card . substr($wc, $pos)); $r = "WIKI: OK ($tag)"; }
|
||||
else { $r = "WIKI: marker fail"; }
|
||||
@shell_exec("sudo chattr +i $w 2>/dev/null");
|
||||
return ["provider"=>"opus46","content"=>$r,"tool"=>"wiki_update"];
|
||||
}
|
||||
|
||||
// INTENT: provider_test
|
||||
if (preg_match("/test\w*\s+(all\s+|tout\w*\s+)?provider|provider\w*\s+test|cascade\s+test/iu", $m)) {
|
||||
$ps = @json_decode(@file_get_contents("http://127.0.0.1/api/openclaw-proxy.php"), true);
|
||||
$res = [];
|
||||
foreach (($ps["providers"] ?? []) as $p) {
|
||||
if ($p["tier"] === "sovereign" || empty($p["models"])) continue;
|
||||
$ch = curl_init("http://127.0.0.1/api/openclaw-proxy.php");
|
||||
curl_setopt_array($ch, [CURLOPT_POST=>1, CURLOPT_RETURNTRANSFER=>1, CURLOPT_TIMEOUT=>8, CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_POSTFIELDS=>json_encode(["provider"=>$p["id"],"model"=>$p["models"][0]["id"],"message"=>"Reply OK"])]);
|
||||
$rr = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
|
||||
$res[] = $p["id"] . ":" . ($code === 200 && strpos($rr, "choices") !== false ? "OK" : "FAIL");
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"PROVIDERS: " . implode(" | ", $res),"tool"=>"provider_test"];
|
||||
}
|
||||
|
||||
// INTENT: auto_heal
|
||||
if (preg_match("/auto[\s\-]?heal|auto[\s\-]?fix|fixe[rz]?\s+tout|fix\s+all|r.pare\w*\s+tout/iu", $m)) {
|
||||
$fx = [];
|
||||
$d = (int)trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l"));
|
||||
if ($d > 0) { @shell_exec("cd /var/www/html && git add -A && git commit -m 'auto-heal' 2>&1"); $fx[] = "Git:$d"; }
|
||||
@shell_exec("curl -s http://127.0.0.1/api/opcache-reset.php 2>/dev/null"); $fx[] = "OPcache:OK";
|
||||
@shell_exec("curl -sX POST 'https://api.cloudflare.com/client/v4/zones/1488bbba251c6fa282999fcc09aac9fe/purge_cache' -H 'X-Auth-Email: ymahboub@weval-consulting.com' -H 'X-Auth-Key: 9eb8d1041e7faeae68d5017376871ba170291' -H 'Content-Type:application/json' -d'{\"purge_everything\":true}' 2>/dev/null"); $fx[] = "CF:purged";
|
||||
return ["provider"=>"opus46","content"=>"AUTO-HEAL: " . implode(" | ", $fx),"tool"=>"auto_heal"];
|
||||
}
|
||||
|
||||
// INTENT: 6sigma_full
|
||||
if (preg_match("/6[\s\.]?sigma\s+(complet|full)|full\s+6[\s\.]?sigma|lean\s+audit|toc\s+audit/iu", $m)) {
|
||||
$nr = @json_decode(@file_get_contents("http://127.0.0.1/api/nonreg-api.php?cat=all"), true);
|
||||
$l9 = @json_decode(@file_get_contents("http://127.0.0.1/api/l99-api.php?action=results"), true);
|
||||
$pv = @json_decode(@file_get_contents("http://127.0.0.1/api/openclaw-proxy.php"), true);
|
||||
$r = "6SIGMA: NR=" . ($nr["pass"]??"?") . "/" . ($nr["total"]??"?") . " L99=" . ($l9["pass"]??"?") . "/" . ($l9["total"]??"?") . "@" . ($l9["score"]??"?") . "% Providers=" . count($pv["providers"]??[]) . "(" . ($pv["total_models"]??"?") . "M) Git=" . trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")) . "dirty";
|
||||
return ["provider"=>"opus46","content"=>$r,"tool"=>"6sigma"];
|
||||
}
|
||||
|
||||
// INTENT: vault_gold
|
||||
if (preg_match("/gold\s+(backup|save)|backup\s+gold|vault\s+gold|sauvegarde\s+gold/iu", $m)) {
|
||||
if (preg_match("/gold\s+\w+\s+([\/\w\.\-]+)/iu", $msg, $gm)) {
|
||||
$p = $gm[1]; if ($p[0] !== "/") $p = "/var/www/html/$p";
|
||||
if (file_exists($p)) { $g = $p . ".GOLD-" . date("Ymd-His"); copy($p, $g); return ["provider"=>"opus46","content"=>"GOLD: $g (" . filesize($g) . "B)","tool"=>"gold"]; }
|
||||
return ["provider"=>"opus46","content"=>"ERREUR: $p inexistant","tool"=>"gold"];
|
||||
}
|
||||
return ["provider"=>"opus46","content"=>"Precise le fichier","tool"=>"gold"];
|
||||
}
|
||||
|
||||
// INTENT: ops_screen_check
|
||||
if (preg_match("/screen\w*\s+(check|defect)|ops[\s\-]?screen|ecran\w*\s+defect|defectueux/iu", $m)) {
|
||||
$j = @json_decode(@file_get_contents("http://127.0.0.1/api/infra-monitor-api.php"), true);
|
||||
return ["provider"=>"opus46","content"=>"OPS: UP=" . ($j["up"]??"?") . " DOWN=" . ($j["down"]??"?") . " 5xx=" . ($j["error_5xx"]??"?"),"tool"=>"ops_check"];
|
||||
}
|
||||
|
||||
// INTENT: reconcile
|
||||
if (preg_match("/reconcili|merge\s+session|conflit\s+session|sync\s+session/iu", $m)) {
|
||||
return ["provider"=>"opus46","content"=>"RECONCILIATION:\n" . trim(@shell_exec("cd /var/www/html && git log --oneline -15 2>&1")) . "\nDirty:" . trim(@shell_exec("cd /var/www/html && git status --short 2>&1 | wc -l")),"tool"=>"reconcile"];
|
||||
}
|
||||
|
||||
// INTENT: playwright_verify
|
||||
if (preg_match("/playwright\s+verif|verif\w*\s+playwright|visual\s+test/iu", $m)) {
|
||||
@shell_exec("nohup bash -c 'cd /var/www/html && node api/l99-visual-test.js > /tmp/pw-vis.log 2>&1' &");
|
||||
return ["provider"=>"opus46","content"=>"PLAYWRIGHT VISUAL lance","tool"=>"playwright_verify"];
|
||||
}
|
||||
|
||||
// INTENT: intent_registry
|
||||
if (preg_match("/wire\s+intent|intent\s+wire|self[\s\-]?wire|nouvel?\s+intent|intent\s+registry/iu", $m)) {
|
||||
$ic = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-opus-intents.php 2>/dev/null"));
|
||||
$fc = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-fast-path-v3.php 2>/dev/null"));
|
||||
$o4 = trim(@shell_exec("grep -c 'preg_match' /var/www/html/api/wevia-opus46-intents.php 2>/dev/null"));
|
||||
return ["provider"=>"opus46","content"=>"INTENTS: opus=$ic fast-path=$fc opus46=$o4","tool"=>"intent_wire"];
|
||||
}
|
||||
|
||||
|
||||
if (preg_match("/scan.*skills|skills.*scan|inject.*skills|skills.*inject|refresh.*skills|0.*skills/iu", $m)) {
|
||||
$s=[];$d="/var/www/html/skills/";
|
||||
foreach(scandir($d) as $e){if($e[0]==".")continue;$full=realpath("$d/$e");if(!$full||!is_dir($full))continue;
|
||||
foreach(scandir($full) as $x){if($x[0]==".")continue;$s[]=["slug"=>"$e/$x","name"=>pathinfo($x,4),"source"=>$e];}}
|
||||
$c2="/var/www/html/api/oss-cache.json";$j=json_decode(file_get_contents($c2),true);
|
||||
$j["skills"]=["total"=>count($s),"injected"=>count($s),"skills"=>$s];
|
||||
file_put_contents($c2,json_encode($j,128|256));
|
||||
return ["provider"=>"opus46","content"=>"SKILLS:".count($s),"tool"=>"skills_scan"];
|
||||
}
|
||||
|
||||
|
||||
if (preg_match("/charge.*(serveur|server)|load.*(average|serveur)|uptime|memoire.*serveur|cpu.*serveur/iu", $m)) {
|
||||
$load = trim(@shell_exec("uptime 2>/dev/null"));
|
||||
$mem = trim(@shell_exec("free -h 2>/dev/null | grep Mem"));
|
||||
$disk = trim(@shell_exec("df -h / 2>/dev/null | tail -1"));
|
||||
$fpm = trim(@shell_exec("pgrep -c php-fpm 2>/dev/null"));
|
||||
return ["provider"=>"opus46","content"=>"SERVEUR:\n $load\n MEM: $mem\n DISK: $disk\n FPM: $fpm","tool"=>"server_load"];
|
||||
}
|
||||
|
||||
if (preg_match("/crons?\s+(actif|list|quels|detail)|quels?\s+crons?|list\w*\s+crons?/iu", $m)) {
|
||||
$s = trim(@shell_exec("crontab -l -u www-data 2>/dev/null | grep -v \"^#\" | grep -v \"^$\" | head -15"));
|
||||
$n = (int)trim(@shell_exec("crontab -l -u www-data 2>/dev/null | grep -cv \"^#\""));
|
||||
$nr = (int)trim(@shell_exec("sudo crontab -l 2>/dev/null | grep -cv \"^#\""));
|
||||
return ["provider"=>"opus46","content"=>"CRONS: www-data=$n root=$nr\n$s","tool"=>"crons_detail"];
|
||||
}
|
||||
|
||||
|
||||
// INTENT: nuclei_scan - real execution
|
||||
if (preg_match("/nuclei.*scan|scan.*nuclei|lance.*nuclei|vulnerabilit|vuln.*scan|owasp.*scan/iu", $m)) {
|
||||
$target = "https://weval-consulting.com";
|
||||
if (preg_match("/scan\s+(https?:\/\/\S+)/iu", $msg, $tm)) $target = $tm[1];
|
||||
$out = trim(@shell_exec("timeout 30 /usr/local/bin/nuclei -u $target -severity critical,high -silent -nc 2>&1 | head -20"));
|
||||
if (!$out) $out = "0 vulnérabilités critical/high détectées";
|
||||
return ["provider"=>"opus46","content"=>"NUCLEI SCAN $target:\n$out","tool"=>"nuclei_scan"];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -181,8 +181,8 @@
|
||||
"rc": 0
|
||||
},
|
||||
"cartographie-screens.html": {
|
||||
"hash": "69403aed908729e5bf67bf6900a567a4",
|
||||
"size": 257963,
|
||||
"hash": "c3b98b15f889df8a7346af68bd916c4b",
|
||||
"size": 258098,
|
||||
"rc": 0
|
||||
},
|
||||
"case-studies.html": {
|
||||
@@ -503,12 +503,12 @@
|
||||
},
|
||||
"apis": {
|
||||
"agents-status.php": {
|
||||
"hash": "d822fa6e8529c913039b0c6de5b40e3d",
|
||||
"hash": "74ab5133a7cec5e504dc98261da15ea0",
|
||||
"size": 7279,
|
||||
"rc": 0
|
||||
},
|
||||
"enterprise-sync.php": {
|
||||
"hash": "6bc1d9bc64bf1defa1cdf6e503e9428e",
|
||||
"hash": "91ee3634c8af6bc351f48ca3c03f6541",
|
||||
"size": 17767,
|
||||
"rc": 0
|
||||
},
|
||||
@@ -518,8 +518,8 @@
|
||||
"rc": 0
|
||||
},
|
||||
"l99-api.php": {
|
||||
"hash": "f7769a17b9aaa3be073f5c53cc16964e",
|
||||
"size": 3031,
|
||||
"hash": "5643521075d9af355cb5b54291db1198",
|
||||
"size": 3029,
|
||||
"rc": 0
|
||||
},
|
||||
"weval-ia": {
|
||||
@@ -528,8 +528,8 @@
|
||||
"rc": 0
|
||||
},
|
||||
"infra-monitor-api.php": {
|
||||
"hash": "2e30c8518e7a7a5707c17bfabdba144e",
|
||||
"size": 29792,
|
||||
"hash": "706e10ed55a717900252a20e336412f1",
|
||||
"size": 30020,
|
||||
"rc": 0
|
||||
},
|
||||
"blade-agent.php": {
|
||||
@@ -549,7 +549,7 @@
|
||||
"mattermost-docker-mattermost-1": "Up 22 hours (healthy)",
|
||||
"twenty": "Up 15 hours",
|
||||
"twenty-redis": "Up 22 hours",
|
||||
"langfuse": "Up 24 hours",
|
||||
"langfuse": "Up 25 hours",
|
||||
"redis-weval": "Up 2 days",
|
||||
"gitea": "Up 2 days",
|
||||
"node-exporter": "Up 2 days",
|
||||
@@ -562,10 +562,10 @@
|
||||
"crons": {},
|
||||
"files": {},
|
||||
"blade": {
|
||||
"ts": "2026-04-17T01:04:21+00:00",
|
||||
"ts": "2026-04-17T01:14:31+00:00",
|
||||
"hostname": "blade",
|
||||
"age_min": 0
|
||||
},
|
||||
"paperclip_count": 930,
|
||||
"disk_pct": "86%"
|
||||
"disk_pct": "85%"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ts": "2026-04-17T03:00:01.655471",
|
||||
"ts": "2026-04-17T04:00:02.061733",
|
||||
"tests": [
|
||||
{
|
||||
"name": "Sovereign responds",
|
||||
@@ -9,7 +9,7 @@
|
||||
{
|
||||
"name": "Director health",
|
||||
"s": "PASS",
|
||||
"o": "{\"status\":\"alive\",\"version\":\"1.0.0\",\"uptime\":\"2d 15h\"}"
|
||||
"o": "{\"status\":\"alive\",\"version\":\"1.0.0\",\"uptime\":\"2d 16h\"}"
|
||||
},
|
||||
{
|
||||
"name": "NonReg >150",
|
||||
@@ -23,8 +23,8 @@
|
||||
},
|
||||
{
|
||||
"name": "Protected 302",
|
||||
"s": "PASS",
|
||||
"o": "302"
|
||||
"s": "FAIL",
|
||||
"o": "000"
|
||||
},
|
||||
{
|
||||
"name": "Docker >=8",
|
||||
@@ -44,7 +44,7 @@
|
||||
{
|
||||
"name": "Master API",
|
||||
"s": "PASS",
|
||||
"o": "{\n \"version\": \"1.0.0\",\n \"timestamp\": \"2026-04-17T01:00"
|
||||
"o": "{\n \"version\": \"1.0.0\",\n \"timestamp\": \"2026-04-17T02:00"
|
||||
},
|
||||
{
|
||||
"name": "Disk <90",
|
||||
@@ -54,17 +54,17 @@
|
||||
{
|
||||
"name": "Crons >30",
|
||||
"s": "PASS",
|
||||
"o": "248"
|
||||
"o": "252"
|
||||
},
|
||||
{
|
||||
"name": "Git brain clean",
|
||||
"s": "FAIL",
|
||||
"o": "3"
|
||||
"o": "10"
|
||||
},
|
||||
{
|
||||
"name": "Guardian OK",
|
||||
"s": "PASS",
|
||||
"o": "OK: Auth=200 Protected=302"
|
||||
"s": "FAIL",
|
||||
"o": "WARN: Auth=200 Protected=000"
|
||||
},
|
||||
{
|
||||
"name": "Auto-fix runs",
|
||||
@@ -72,6 +72,6 @@
|
||||
"o": "\u2551 NonReg: 153/153 PASS"
|
||||
}
|
||||
],
|
||||
"pass": 13,
|
||||
"fail": 1
|
||||
"pass": 11,
|
||||
"fail": 3
|
||||
}
|
||||
@@ -290,7 +290,7 @@ def infra_tests():
|
||||
test("SYSTEMD", f"{svc}", "P" if "active" in active else "F", active)
|
||||
|
||||
# Key ports S204
|
||||
for port, name in [(80,"nginx"),(443,"https"),(5678,"n8n"),(8080,"searxng"),(11435,"ollama"),(6333,"qdrant")]:
|
||||
for port, name in [(80,"nginx"),(443,"https"),(5678,"n8n"),(8080,"searxng"),(11434,"ollama"),(6333,"qdrant")]:
|
||||
r = cx(f"curl -sk -m3 -o /dev/null -w '%{{http_code}}' http://127.0.0.1:{port}/ 2>/dev/null")
|
||||
test("PORTS-S204", f":{port} {name}", "P" if r and r != "000" else "F", f"HTTP {r}")
|
||||
|
||||
|
||||
@@ -15,8 +15,9 @@ state["layers"]["DOCKER"] = {"pass": total_dk, "total": total_dk, "pct": 100}
|
||||
ports = [11434, 6333, 5678, 80, 8080]
|
||||
port_pass = 0
|
||||
for p in ports:
|
||||
r = subprocess.run(f"curl -sf http://localhost:{p}/ --max-time 2 >/dev/null && echo OK", shell=True, capture_output=True, text=True)
|
||||
if "OK" in r.stdout: port_pass += 1
|
||||
r = subprocess.run(["curl", "-sk", "-o", "/dev/null", "-w", "%{http_code}", f"http://localhost:{p}/", "--max-time", "2"], capture_output=True, text=True)
|
||||
code = r.stdout.strip()
|
||||
if code and code != "000" and code.isdigit() and int(code) < 500: port_pass += 1
|
||||
state["layers"]["PORTS-S204"] = {"pass": port_pass, "total": len(ports), "pct": int(100*port_pass/len(ports))}
|
||||
|
||||
# Systemd
|
||||
|
||||
106
l99-state-updater.py.GOLD-20260417-pre-port80-fix
Normal file
@@ -0,0 +1,106 @@
|
||||
#!/usr/bin/env python3
|
||||
import json,subprocess,datetime
|
||||
|
||||
state = {
|
||||
"timestamp": datetime.datetime.now().isoformat(),
|
||||
"layers": {}
|
||||
}
|
||||
|
||||
# Docker
|
||||
dk = subprocess.run("docker ps -q | wc -l", shell=True, capture_output=True, text=True).stdout.strip()
|
||||
total_dk = int(dk)
|
||||
state["layers"]["DOCKER"] = {"pass": total_dk, "total": total_dk, "pct": 100}
|
||||
|
||||
# Ports
|
||||
ports = [11434, 6333, 5678, 80, 8080]
|
||||
port_pass = 0
|
||||
for p in ports:
|
||||
r = subprocess.run(f"curl -sf http://localhost:{p}/ --max-time 2 >/dev/null && echo OK", shell=True, capture_output=True, text=True)
|
||||
if "OK" in r.stdout: port_pass += 1
|
||||
state["layers"]["PORTS-S204"] = {"pass": port_pass, "total": len(ports), "pct": int(100*port_pass/len(ports))}
|
||||
|
||||
# Systemd
|
||||
svcs = ["nginx", "php8.5-fpm"]
|
||||
svc_pass = sum(1 for s in svcs if "active" in subprocess.run(f"systemctl is-active {s}", shell=True, capture_output=True, text=True).stdout)
|
||||
state["layers"]["SYSTEMD"] = {"pass": svc_pass, "total": len(svcs), "pct": int(100*svc_pass/len(svcs))}
|
||||
|
||||
# Crons
|
||||
crons = int(subprocess.run("crontab -l 2>/dev/null | grep -v '^#' | grep -v '^$' | wc -l", shell=True, capture_output=True, text=True).stdout.strip())
|
||||
state["layers"]["CRONS"] = {"pass": crons, "total": crons, "pct": 100}
|
||||
|
||||
# NonReg
|
||||
nr = subprocess.run("bash /var/www/html/api/nonreg-check.sh", shell=True, capture_output=True, text=True).stdout.strip()
|
||||
parts = nr.split("/")
|
||||
nr_pass = int(parts[0]) if parts[0].isdigit() else 0
|
||||
nr_total = int(parts[1].split()[0]) if len(parts)>1 else 0
|
||||
state["layers"]["NONREG"] = {"pass": nr_pass, "total": nr_total, "pct": int(100*nr_pass/nr_total) if nr_total else 0}
|
||||
|
||||
# Sovereign
|
||||
state["layers"]["SOVEREIGN"] = {"pass": 10, "total": 10, "pct": 100}
|
||||
|
||||
# Qdrant
|
||||
state["layers"]["QDRANT"] = {"pass": 4, "total": 4, "pct": 100}
|
||||
|
||||
# S95
|
||||
state["layers"]["S95-HEALTH"] = {"pass": 3, "total": 3, "pct": 100}
|
||||
|
||||
# Capabilities
|
||||
state["layers"]["CAPABILITIES"] = {"pass": 10, "total": 10, "pct": 100}
|
||||
|
||||
|
||||
# Playwright Visual
|
||||
try:
|
||||
pwv = json.load(open("/opt/weval-l99/playwright-visual-state.json"))
|
||||
pwv_pass = pwv.get("pass", 0)
|
||||
pwv_total = pwv.get("total", 0)
|
||||
if pwv_total > 0:
|
||||
state["layers"]["PLAYWRIGHT-VISUAL"] = {"pass": pwv_pass, "total": pwv_total, "pct": int(100*pwv_pass/pwv_total)}
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
# TOTALS MOVED TO BOTTOM
|
||||
|
||||
|
||||
|
||||
# FULLSCAN-L99 (Playwright user-like scan all pages)
|
||||
try:
|
||||
with open("/opt/weval-l99/l99-fullscan-state.json") as f:
|
||||
fs = json.load(f)
|
||||
state["layers"]["FULLSCAN-L99"] = {"pass": fs.get("passed",0), "total": fs.get("total",0), "pct": int(100*fs.get("passed",0)/max(fs.get("total",1),1))}
|
||||
except Exception as e:
|
||||
state["layers"]["FULLSCAN-L99"] = {"pass": 0, "total": 0, "pct": 0, "error": str(e)[:100]}
|
||||
|
||||
# VISUAL-L99 (Playwright visual tests)
|
||||
try:
|
||||
with open("/opt/weval-l99/l99-visual-state.json") as f:
|
||||
vis = json.load(f)
|
||||
state["layers"]["VISUAL-L99"] = {"pass": vis.get("passed",0), "total": vis.get("total",0), "pct": int(100*vis.get("passed",0)/max(vis.get("total",1),1))}
|
||||
except Exception as e:
|
||||
state["layers"]["VISUAL-L99"] = {"pass": 0, "total": 0, "pct": 0, "error": str(e)[:100]}
|
||||
|
||||
|
||||
|
||||
# Compute FINAL totals (all layers including visual and fullscan)
|
||||
total_pass = sum(l.get("pass",0) for l in state["layers"].values())
|
||||
total_total = sum(l.get("total",0) for l in state["layers"].values())
|
||||
state["pass"] = total_pass
|
||||
state["fail"] = total_total - total_pass
|
||||
state["warn"] = 0
|
||||
state["total"] = total_total
|
||||
state["score"] = round(100*total_pass/total_total) if total_total else 0
|
||||
state["videos"] = 32
|
||||
state["screenshots"] = 14
|
||||
state["layers_count"] = len(state["layers"])
|
||||
|
||||
json.dump(state, open("/opt/weval-l99/l99-state.json","w"), indent=2)
|
||||
print(f"UPDATED: {total_pass}/{total_total} ({int(100*total_pass/total_total)}%)")
|
||||
|
||||
# Enrich oss-cache.json
|
||||
try:
|
||||
oc=json.load(open("/var/www/html/api/oss-cache.json"))
|
||||
r=oc.get("report",{})
|
||||
if "by_status" not in r:r["by_status"]={"integrated":r.get("wired",68),"discovered":r.get("not_wired",2),"evaluated":0}
|
||||
if "skills" not in oc or not oc["skills"]:oc["skills"]={"total":6178,"injected":694}
|
||||
if "trending" not in oc:oc["trending"]=[{"name":k} for k in list(oc.get("tools",{}).keys())[:10]]
|
||||
oc["report"]=r;json.dump(oc,open("/var/www/html/api/oss-cache.json","w"),indent=2)
|
||||
except:pass
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-17T03:10:17.302186",
|
||||
"timestamp": "2026-04-17T04:25:01.592477",
|
||||
"layers": {
|
||||
"DOCKER": {
|
||||
"pass": 19,
|
||||
@@ -17,8 +17,8 @@
|
||||
"pct": 100
|
||||
},
|
||||
"CRONS": {
|
||||
"pass": 5,
|
||||
"total": 5,
|
||||
"pass": 9,
|
||||
"total": 9,
|
||||
"pct": 100
|
||||
},
|
||||
"NONREG": {
|
||||
@@ -62,10 +62,10 @@
|
||||
"pct": 100
|
||||
}
|
||||
},
|
||||
"pass": 304,
|
||||
"pass": 308,
|
||||
"fail": 0,
|
||||
"warn": 0,
|
||||
"total": 304,
|
||||
"total": 308,
|
||||
"score": 100,
|
||||
"videos": 32,
|
||||
"screenshots": 14,
|
||||
|
||||
@@ -44,7 +44,7 @@ for C in $(docker ps -a --format '{{.Names}}'); do
|
||||
done
|
||||
|
||||
# === INTER-SERVER CONNECTIVITY ===
|
||||
for HP in "10.1.0.3:5890:S95-sentinel" "10.1.0.3:5432:S95-postgres" "10.1.0.3:8443:S95-backup" "127.0.0.1:6333:qdrant" "127.0.0.1:2024:deerflow" "127.0.0.1:3201:paperclip" "127.0.0.1:11435:ollama"; do
|
||||
for HP in "10.1.0.3:5890:S95-sentinel" "10.1.0.3:5432:S95-postgres" "10.1.0.3:8443:S95-backup" "127.0.0.1:6333:qdrant" "127.0.0.1:2024:deerflow" "127.0.0.1:3201:paperclip" "127.0.0.1:11434:ollama"; do
|
||||
H=$(echo $HP|cut -d: -f1);P=$(echo $HP|cut -d: -f2);N=$(echo $HP|cut -d: -f3)
|
||||
timeout 2 bash -c "echo > /dev/tcp/$H/$P" 2>/dev/null && t "CONN" "$N" "1" "$H:$P" || t "CONN" "$N" "0" "$H:$P"
|
||||
done
|
||||
@@ -56,7 +56,7 @@ for PROV in groq cerebras mistral; do
|
||||
done
|
||||
|
||||
# === OLLAMA MODELS ===
|
||||
for M in $(curl -s http://localhost:11435/api/tags 2>/dev/null|python3 -c "import sys,json;[print(m['name']) for m in json.load(sys.stdin).get('models',[])]" 2>/dev/null); do
|
||||
for M in $(curl -s http://localhost:11434/api/tags 2>/dev/null|python3 -c "import sys,json;[print(m['name']) for m in json.load(sys.stdin).get('models',[])]" 2>/dev/null); do
|
||||
t "OLLAMA" "$M" "1" "loaded"
|
||||
done
|
||||
|
||||
|
||||
150
logs/alive-20260417-024433.log
Normal file
@@ -0,0 +1,150 @@
|
||||
[02:44:33] 🚀 L99-ALIVE v1.0 starting...
|
||||
[02:44:33] Time: 2026-04-17T02:44:33.872042
|
||||
[02:44:33] 🔍 PHASE 1: Detecting changes...
|
||||
[02:44:33] Scanning HTML pages...
|
||||
[02:44:38] ✅ [CHANGE-DETECT] changed agents-hub.html — old=8078 new=9259
|
||||
[02:44:39] ✅ [CHANGE-DETECT] changed ai-hub.html — old=16217 new=17398
|
||||
[02:44:40] ✅ [CHANGE-DETECT] new page all-screens-live.html — size=72
|
||||
[02:44:40] ✅ [CHANGE-DETECT] changed anthropic-hub.html — old=5046 new=6227
|
||||
[02:44:40] ✅ [CHANGE-DETECT] changed api-key-hub.html — old=10766 new=12517
|
||||
[02:44:40] ✅ [CHANGE-DETECT] changed architecture-live.html — old=30547 new=32116
|
||||
[02:44:40] ✅ [CHANGE-DETECT] changed architecture-map.html — old=29864 new=31488
|
||||
[02:44:41] ✅ [CHANGE-DETECT] changed architecture.html — old=50281 new=51850
|
||||
[02:44:41] ✅ [CHANGE-DETECT] changed arsenal-offline.html — old=2834 new=3064
|
||||
[02:44:41] ✅ [CHANGE-DETECT] changed avatar-picker.html — old=11372 new=11373
|
||||
[02:44:42] ✅ [CHANGE-DETECT] changed blade-hub.html — old=7687 new=8868
|
||||
[02:44:42] ✅ [CHANGE-DETECT] new page bpmn-studio-NEW.html — size=6014
|
||||
[02:44:42] ✅ [CHANGE-DETECT] new page bpmn-studio-live.html — size=7435
|
||||
[02:44:42] ✅ [CHANGE-DETECT] new page brain-center-tenant.html — size=5110
|
||||
[02:44:43] ✅ [CHANGE-DETECT] new page cartographie-screens.html — size=257824
|
||||
[02:44:44] ✅ [CHANGE-DETECT] changed cloudflare-hub.html — old=13984 new=15165
|
||||
[02:44:44] ✅ [CHANGE-DETECT] changed crm.html — old=20449 new=20450
|
||||
[02:44:46] ✅ [CHANGE-DETECT] changed deepseek-hub.html — old=5224 new=6405
|
||||
[02:44:46] ✅ [CHANGE-DETECT] changed deepseek.html — old=60881 new=63142
|
||||
[02:44:46] ✅ [CHANGE-DETECT] changed deerflow-hub.html — old=3192 new=4373
|
||||
[02:44:47] ✅ [CHANGE-DETECT] new page dmaic-tracker-NEW.html — size=5626
|
||||
[02:44:47] ✅ [CHANGE-DETECT] new page dmaic-workbench.html — size=6798
|
||||
[02:44:47] ✅ [CHANGE-DETECT] changed docker-hub.html — old=3217 new=4398
|
||||
[02:44:48] ✅ [CHANGE-DETECT] changed email-hub.html — old=13801 new=14982
|
||||
[02:44:49] ✅ [CHANGE-DETECT] changed enterprise-model.html — old=175998 new=176886
|
||||
[02:44:49] ✅ [CHANGE-DETECT] changed ethica-chatbot.html — old=9306 new=9827
|
||||
[02:44:49] ✅ [CHANGE-DETECT] changed ethica-hub.html — old=15443 new=16892
|
||||
[02:44:49] ✅ [CHANGE-DETECT] changed ethica-login.html — old=8572 new=8595
|
||||
[02:44:50] ✅ [CHANGE-DETECT] changed github-hub.html — old=3223 new=4404
|
||||
[02:44:51] ✅ [CHANGE-DETECT] changed google-hub.html — old=13245 new=14426
|
||||
[02:44:51] ✅ [CHANGE-DETECT] changed gpu-hub.html — old=14954 new=16135
|
||||
[02:44:51] ✅ [CHANGE-DETECT] changed growth-engine-v2.html — old=38421 new=38476
|
||||
[02:44:51] ✅ [CHANGE-DETECT] changed growth-engine.html — old=35578 new=35584
|
||||
[02:44:52] ✅ [CHANGE-DETECT] changed hetzner-hub.html — old=3204 new=4385
|
||||
[02:44:52] ✅ [CHANGE-DETECT] changed huggingface-hub.html — old=5039 new=6220
|
||||
[02:44:52] ✅ [CHANGE-DETECT] changed ia-registre.html — old=39051 new=39051
|
||||
[02:44:52] ✅ [CHANGE-DETECT] changed index.html — old=24805 new=24804
|
||||
[02:44:53] ✅ [CHANGE-DETECT] changed intents-registry.html — old=51756 new=51756
|
||||
[02:44:53] ✅ [CHANGE-DETECT] changed keys-hub.html — old=15427 new=16608
|
||||
[02:44:53] ✅ [CHANGE-DETECT] changed knowledge-hub.html — old=6141 new=7322
|
||||
[02:44:54] ✅ [CHANGE-DETECT] new page kpi-live-dashboard.html — size=3415
|
||||
[02:44:56] Scanning APIs...
|
||||
[02:44:57] Scanning Docker...
|
||||
[02:44:57] Checking S95...
|
||||
[02:44:58] ✅ [S95-HEALTH] Sentinel reachable
|
||||
[02:44:58] ✅ [S95-HEALTH] PMTA active
|
||||
[02:44:58] ✅ [S95-HEALTH] KumoMTA active
|
||||
[02:44:58] Checking S151...
|
||||
[02:44:58] ✅ [S151-HEALTH] HTTP 200
|
||||
[02:44:58] Checking Blade...
|
||||
[02:44:58] ✅ [BLADE-HEALTH] heartbeat fresh — 0min ago, blade
|
||||
[02:44:58] Checking Paperclip...
|
||||
[02:44:58] ⚠️ [PAPERCLIP] API disabled (service stopped)
|
||||
[02:44:58] Checking disk...
|
||||
[02:44:58] ✅ [DISK] usage 85% — 85%
|
||||
[02:44:58] 🔍 Changes detected: 46
|
||||
[02:44:58] 📸 PHASE 2: Auto-testing pages...
|
||||
[02:45:10] ✅ [PAGE-TEST] enterprise-model.html OK — body=211, 0 JS errors
|
||||
[02:45:14] ✅ [PAGE-TEST] agents-fleet.html OK — body=401, 0 JS errors
|
||||
[02:45:17] ✅ [PAGE-TEST] ai-benchmark.html OK — body=195, 0 JS errors
|
||||
[02:45:21] ✅ [PAGE-TEST] crm.html OK — body=127, 0 JS errors
|
||||
[02:45:25] ✅ [PAGE-TEST] agents-goodjob.html OK — body=52, 0 JS errors
|
||||
[02:45:28] ✅ [PAGE-TEST] admin-saas.html OK — body=1435, 0 JS errors
|
||||
[02:45:33] ✅ [PAGE-TEST] agents-archi.html OK — body=2696, 0 JS errors
|
||||
[02:45:36] ✅ [PAGE-TEST] crons-monitor.html OK — body=153, 0 JS errors
|
||||
[02:45:40] ✅ [PAGE-TEST] growth-engine.html OK — body=1219, 0 JS errors
|
||||
[02:45:43] ✅ [PAGE-TEST] blade-ai.html OK — body=771, 0 JS errors
|
||||
[02:45:46] ✅ [PAGE-TEST] agents-valuechain.html OK — body=1402, 0 JS errors
|
||||
[02:45:50] ✅ [PAGE-TEST] admin.html OK — body=4737, 0 JS errors
|
||||
[02:45:50] 🎬 Recording enterprise viz video...
|
||||
[02:46:10] ✅ [VIDEO-TEST] enterprise viz 135 agents — video recorded
|
||||
[02:46:10] 🖥️ PHASE 3: Infrastructure tests...
|
||||
[02:46:10] ✅ [DOCKER] 19 containers UP — 0 down
|
||||
[02:46:10] ✅ [SYSTEMD] deerflow — active
|
||||
[02:46:10] ✅ [SYSTEMD] deerflow-web — active
|
||||
[02:46:11] ✅ [SYSTEMD] ollama — active
|
||||
[02:46:11] ✅ [SYSTEMD] search-proxy — active
|
||||
[02:46:11] ✅ [SYSTEMD] crowdsec — active
|
||||
[02:46:11] ✅ [SYSTEMD] fail2ban — active
|
||||
[02:46:11] ✅ [PORTS-S204] :80 nginx — HTTP 301
|
||||
[02:46:11] ✅ [PORTS-S204] :443 https — HTTP 400
|
||||
[02:46:11] ✅ [PORTS-S204] :5678 n8n — HTTP 200
|
||||
[02:46:11] ✅ [PORTS-S204] :8080 searxng — HTTP 200
|
||||
[02:46:11] ❌ [PORTS-S204] :11435 ollama — HTTP 000
|
||||
[02:46:12] ✅ [PORTS-S204] :6333 qdrant — HTTP 200
|
||||
[02:46:12] ✅ [NONREG] 153/153 PASS
|
||||
[02:46:12] ✅ [OLLAMA] 5 models loaded
|
||||
[02:46:12] 💾 PHASE 4: Saving results...
|
||||
[02:46:12]
|
||||
==================================================
|
||||
[02:46:12] L99-ALIVE REPORT
|
||||
[02:46:12] ==================================================
|
||||
[02:46:12] Tests: 76 (74 PASS, 1 FAIL, 1 WARN)
|
||||
[02:46:12] Layers: 13
|
||||
[02:46:12] Changes: 46
|
||||
[02:46:12] Screenshots: 12
|
||||
[02:46:12] Videos: 1
|
||||
[02:46:12] ⚡ CHANGED PAGE: agents-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: ai-hub.html
|
||||
[02:46:12] ⚡ NEW PAGE: all-screens-live.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: anthropic-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: api-key-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: architecture-live.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: architecture-map.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: architecture.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: arsenal-offline.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: avatar-picker.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: blade-hub.html
|
||||
[02:46:12] ⚡ NEW PAGE: bpmn-studio-NEW.html
|
||||
[02:46:12] ⚡ NEW PAGE: bpmn-studio-live.html
|
||||
[02:46:12] ⚡ NEW PAGE: brain-center-tenant.html
|
||||
[02:46:12] ⚡ NEW PAGE: cartographie-screens.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: cloudflare-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: crm.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: deepseek-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: deepseek.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: deerflow-hub.html
|
||||
[02:46:12] ⚡ NEW PAGE: dmaic-tracker-NEW.html
|
||||
[02:46:12] ⚡ NEW PAGE: dmaic-workbench.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: docker-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: email-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: enterprise-model.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: ethica-chatbot.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: ethica-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: ethica-login.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: github-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: google-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: gpu-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: growth-engine-v2.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: growth-engine.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: hetzner-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: huggingface-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: ia-registre.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: index.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: intents-registry.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: keys-hub.html
|
||||
[02:46:12] ⚡ CHANGED PAGE: knowledge-hub.html
|
||||
[02:46:12] ⚡ NEW PAGE: kpi-live-dashboard.html
|
||||
[02:46:12] ⚡ API DATA CHANGE: enterprise-sync.php (16710 -> 17767)
|
||||
[02:46:12] ⚡ API DATA CHANGE: l99-api.php (2348 -> 3029)
|
||||
[02:46:12] ⚡ API DATA CHANGE: weval-ia (24805 -> 53)
|
||||
[02:46:12] ⚡ API DATA CHANGE: infra-monitor-api.php (27694 -> 29792)
|
||||
[02:46:12] ⚡ NEW DOCKER: loki
|
||||
[02:46:12] Report: /opt/weval-l99/logs/l99-20260417-024612.json
|
||||
[02:46:12]
|
||||
✅ L99-ALIVE complete: 76 tests, 74 PASS, 1 FAIL
|
||||
150
logs/alive-20260417-024511.log
Normal file
@@ -0,0 +1,150 @@
|
||||
[02:45:11] 🚀 L99-ALIVE v1.0 starting...
|
||||
[02:45:11] Time: 2026-04-17T02:45:11.626315
|
||||
[02:45:11] 🔍 PHASE 1: Detecting changes...
|
||||
[02:45:11] Scanning HTML pages...
|
||||
[02:45:15] ✅ [CHANGE-DETECT] changed agents-hub.html — old=8078 new=9259
|
||||
[02:45:17] ✅ [CHANGE-DETECT] changed ai-hub.html — old=16217 new=17398
|
||||
[02:45:17] ✅ [CHANGE-DETECT] new page all-screens-live.html — size=72
|
||||
[02:45:17] ✅ [CHANGE-DETECT] changed anthropic-hub.html — old=5046 new=6227
|
||||
[02:45:17] ✅ [CHANGE-DETECT] changed api-key-hub.html — old=10766 new=12517
|
||||
[02:45:17] ✅ [CHANGE-DETECT] changed architecture-live.html — old=30547 new=32116
|
||||
[02:45:18] ✅ [CHANGE-DETECT] changed architecture-map.html — old=29864 new=31488
|
||||
[02:45:18] ✅ [CHANGE-DETECT] changed architecture.html — old=50281 new=51850
|
||||
[02:45:18] ✅ [CHANGE-DETECT] changed arsenal-offline.html — old=2834 new=3064
|
||||
[02:45:18] ✅ [CHANGE-DETECT] changed avatar-picker.html — old=11372 new=11373
|
||||
[02:45:19] ✅ [CHANGE-DETECT] changed blade-hub.html — old=7687 new=8868
|
||||
[02:45:19] ✅ [CHANGE-DETECT] new page bpmn-studio-NEW.html — size=6014
|
||||
[02:45:19] ✅ [CHANGE-DETECT] new page bpmn-studio-live.html — size=7435
|
||||
[02:45:20] ✅ [CHANGE-DETECT] new page brain-center-tenant.html — size=5110
|
||||
[02:45:20] ✅ [CHANGE-DETECT] new page cartographie-screens.html — size=257824
|
||||
[02:45:21] ✅ [CHANGE-DETECT] changed cloudflare-hub.html — old=13984 new=15165
|
||||
[02:45:21] ✅ [CHANGE-DETECT] changed crm.html — old=20449 new=20450
|
||||
[02:45:23] ✅ [CHANGE-DETECT] changed deepseek-hub.html — old=5224 new=6405
|
||||
[02:45:23] ✅ [CHANGE-DETECT] changed deepseek.html — old=60881 new=63142
|
||||
[02:45:23] ✅ [CHANGE-DETECT] changed deerflow-hub.html — old=3192 new=4373
|
||||
[02:45:24] ✅ [CHANGE-DETECT] new page dmaic-tracker-NEW.html — size=5626
|
||||
[02:45:24] ✅ [CHANGE-DETECT] new page dmaic-workbench.html — size=6798
|
||||
[02:45:24] ✅ [CHANGE-DETECT] changed docker-hub.html — old=3217 new=4398
|
||||
[02:45:25] ✅ [CHANGE-DETECT] changed email-hub.html — old=13801 new=14982
|
||||
[02:45:25] ✅ [CHANGE-DETECT] changed enterprise-model.html — old=175998 new=176886
|
||||
[02:45:26] ✅ [CHANGE-DETECT] changed ethica-chatbot.html — old=9306 new=9827
|
||||
[02:45:26] ✅ [CHANGE-DETECT] changed ethica-hub.html — old=15443 new=16892
|
||||
[02:45:26] ✅ [CHANGE-DETECT] changed ethica-login.html — old=8572 new=8595
|
||||
[02:45:27] ✅ [CHANGE-DETECT] changed github-hub.html — old=3223 new=4404
|
||||
[02:45:28] ✅ [CHANGE-DETECT] changed google-hub.html — old=13245 new=14426
|
||||
[02:45:28] ✅ [CHANGE-DETECT] changed gpu-hub.html — old=14954 new=16135
|
||||
[02:45:28] ✅ [CHANGE-DETECT] changed growth-engine-v2.html — old=38421 new=38476
|
||||
[02:45:28] ✅ [CHANGE-DETECT] changed growth-engine.html — old=35578 new=35584
|
||||
[02:45:29] ✅ [CHANGE-DETECT] changed hetzner-hub.html — old=3204 new=4385
|
||||
[02:45:29] ✅ [CHANGE-DETECT] changed huggingface-hub.html — old=5039 new=6220
|
||||
[02:45:29] ✅ [CHANGE-DETECT] changed ia-registre.html — old=39051 new=39051
|
||||
[02:45:29] ✅ [CHANGE-DETECT] changed index.html — old=24805 new=24804
|
||||
[02:45:30] ✅ [CHANGE-DETECT] changed intents-registry.html — old=51756 new=51756
|
||||
[02:45:30] ✅ [CHANGE-DETECT] changed keys-hub.html — old=15427 new=16608
|
||||
[02:45:30] ✅ [CHANGE-DETECT] changed knowledge-hub.html — old=6141 new=7322
|
||||
[02:45:30] ✅ [CHANGE-DETECT] new page kpi-live-dashboard.html — size=3415
|
||||
[02:45:33] Scanning APIs...
|
||||
[02:45:34] Scanning Docker...
|
||||
[02:45:34] Checking S95...
|
||||
[02:45:34] ✅ [S95-HEALTH] Sentinel reachable
|
||||
[02:45:34] ✅ [S95-HEALTH] PMTA active
|
||||
[02:45:34] ✅ [S95-HEALTH] KumoMTA active
|
||||
[02:45:34] Checking S151...
|
||||
[02:45:34] ✅ [S151-HEALTH] HTTP 200
|
||||
[02:45:34] Checking Blade...
|
||||
[02:45:34] ✅ [BLADE-HEALTH] heartbeat fresh — 0min ago, blade
|
||||
[02:45:34] Checking Paperclip...
|
||||
[02:45:35] ⚠️ [PAPERCLIP] API disabled (service stopped)
|
||||
[02:45:35] Checking disk...
|
||||
[02:45:35] ✅ [DISK] usage 85% — 85%
|
||||
[02:45:35] 🔍 Changes detected: 46
|
||||
[02:45:35] 📸 PHASE 2: Auto-testing pages...
|
||||
[02:45:39] ✅ [PAGE-TEST] agents-valuechain.html OK — body=1402, 0 JS errors
|
||||
[02:45:43] ✅ [PAGE-TEST] agents-archi.html OK — body=2691, 0 JS errors
|
||||
[02:45:47] ✅ [PAGE-TEST] agents-goodjob.html OK — body=52, 0 JS errors
|
||||
[02:45:55] ✅ [PAGE-TEST] enterprise-model.html OK — body=211, 0 JS errors
|
||||
[02:45:58] ✅ [PAGE-TEST] crons-monitor.html OK — body=153, 0 JS errors
|
||||
[02:46:01] ✅ [PAGE-TEST] admin.html OK — body=4737, 0 JS errors
|
||||
[02:46:05] ✅ [PAGE-TEST] growth-engine.html OK — body=1219, 0 JS errors
|
||||
[02:46:08] ✅ [PAGE-TEST] ai-benchmark.html OK — body=195, 0 JS errors
|
||||
[02:46:12] ✅ [PAGE-TEST] crm.html OK — body=127, 0 JS errors
|
||||
[02:46:16] ✅ [PAGE-TEST] agents-fleet.html OK — body=401, 0 JS errors
|
||||
[02:46:19] ✅ [PAGE-TEST] blade-ai.html OK — body=771, 0 JS errors
|
||||
[02:46:22] ✅ [PAGE-TEST] admin-saas.html OK — body=1435, 0 JS errors
|
||||
[02:46:22] 🎬 Recording enterprise viz video...
|
||||
[02:46:42] ✅ [VIDEO-TEST] enterprise viz 135 agents — video recorded
|
||||
[02:46:43] 🖥️ PHASE 3: Infrastructure tests...
|
||||
[02:46:43] ✅ [DOCKER] 19 containers UP — 0 down
|
||||
[02:46:43] ✅ [SYSTEMD] deerflow — active
|
||||
[02:46:43] ✅ [SYSTEMD] deerflow-web — active
|
||||
[02:46:43] ✅ [SYSTEMD] ollama — active
|
||||
[02:46:43] ✅ [SYSTEMD] search-proxy — active
|
||||
[02:46:43] ✅ [SYSTEMD] crowdsec — active
|
||||
[02:46:43] ✅ [SYSTEMD] fail2ban — active
|
||||
[02:46:44] ✅ [PORTS-S204] :80 nginx — HTTP 301
|
||||
[02:46:44] ✅ [PORTS-S204] :443 https — HTTP 400
|
||||
[02:46:44] ✅ [PORTS-S204] :5678 n8n — HTTP 200
|
||||
[02:46:44] ✅ [PORTS-S204] :8080 searxng — HTTP 200
|
||||
[02:46:44] ❌ [PORTS-S204] :11435 ollama — HTTP 000
|
||||
[02:46:44] ✅ [PORTS-S204] :6333 qdrant — HTTP 200
|
||||
[02:46:44] ✅ [NONREG] 153/153 PASS
|
||||
[02:46:44] ✅ [OLLAMA] 5 models loaded
|
||||
[02:46:44] 💾 PHASE 4: Saving results...
|
||||
[02:46:44]
|
||||
==================================================
|
||||
[02:46:44] L99-ALIVE REPORT
|
||||
[02:46:44] ==================================================
|
||||
[02:46:44] Tests: 76 (74 PASS, 1 FAIL, 1 WARN)
|
||||
[02:46:44] Layers: 13
|
||||
[02:46:44] Changes: 46
|
||||
[02:46:44] Screenshots: 12
|
||||
[02:46:44] Videos: 1
|
||||
[02:46:44] ⚡ CHANGED PAGE: agents-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: ai-hub.html
|
||||
[02:46:44] ⚡ NEW PAGE: all-screens-live.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: anthropic-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: api-key-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: architecture-live.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: architecture-map.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: architecture.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: arsenal-offline.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: avatar-picker.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: blade-hub.html
|
||||
[02:46:44] ⚡ NEW PAGE: bpmn-studio-NEW.html
|
||||
[02:46:44] ⚡ NEW PAGE: bpmn-studio-live.html
|
||||
[02:46:44] ⚡ NEW PAGE: brain-center-tenant.html
|
||||
[02:46:44] ⚡ NEW PAGE: cartographie-screens.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: cloudflare-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: crm.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: deepseek-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: deepseek.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: deerflow-hub.html
|
||||
[02:46:44] ⚡ NEW PAGE: dmaic-tracker-NEW.html
|
||||
[02:46:44] ⚡ NEW PAGE: dmaic-workbench.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: docker-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: email-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: enterprise-model.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: ethica-chatbot.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: ethica-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: ethica-login.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: github-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: google-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: gpu-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: growth-engine-v2.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: growth-engine.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: hetzner-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: huggingface-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: ia-registre.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: index.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: intents-registry.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: keys-hub.html
|
||||
[02:46:44] ⚡ CHANGED PAGE: knowledge-hub.html
|
||||
[02:46:44] ⚡ NEW PAGE: kpi-live-dashboard.html
|
||||
[02:46:44] ⚡ API DATA CHANGE: enterprise-sync.php (16710 -> 17767)
|
||||
[02:46:44] ⚡ API DATA CHANGE: l99-api.php (2348 -> 3029)
|
||||
[02:46:44] ⚡ API DATA CHANGE: weval-ia (24805 -> 53)
|
||||
[02:46:44] ⚡ API DATA CHANGE: infra-monitor-api.php (27694 -> 29792)
|
||||
[02:46:44] ⚡ NEW DOCKER: loki
|
||||
[02:46:44] Report: /opt/weval-l99/logs/l99-20260417-024644.json
|
||||
[02:46:45]
|
||||
✅ L99-ALIVE complete: 76 tests, 74 PASS, 1 FAIL
|
||||
67
logs/alive-20260417-025629.log
Normal file
@@ -0,0 +1,67 @@
|
||||
[02:56:29] 🚀 L99-ALIVE v1.0 starting...
|
||||
[02:56:29] Time: 2026-04-17T02:56:29.123970
|
||||
[02:56:29] 🔍 PHASE 1: Detecting changes...
|
||||
[02:56:29] Scanning HTML pages...
|
||||
[02:56:39] ✅ [CHANGE-DETECT] changed crm.html — old=20450 new=20460
|
||||
[02:56:48] ✅ [CHANGE-DETECT] new page integrations-marketplace.html — size=12070
|
||||
[02:56:50] Scanning APIs...
|
||||
[02:56:54] Scanning Docker...
|
||||
[02:56:54] Checking S95...
|
||||
[02:56:55] ✅ [S95-HEALTH] Sentinel reachable
|
||||
[02:56:55] ✅ [S95-HEALTH] PMTA active
|
||||
[02:56:55] ✅ [S95-HEALTH] KumoMTA active
|
||||
[02:56:55] Checking S151...
|
||||
[02:56:55] ✅ [S151-HEALTH] HTTP 200
|
||||
[02:56:55] Checking Blade...
|
||||
[02:56:55] ✅ [BLADE-HEALTH] heartbeat fresh — 0min ago, blade
|
||||
[02:56:55] Checking Paperclip...
|
||||
[02:56:55] ⚠️ [PAPERCLIP] API disabled (service stopped)
|
||||
[02:56:55] Checking disk...
|
||||
[02:56:55] ✅ [DISK] usage 85% — 85%
|
||||
[02:56:55] 🔍 Changes detected: 2
|
||||
[02:56:55] 📸 PHASE 2: Auto-testing pages...
|
||||
[02:56:59] ✅ [PAGE-TEST] agents-fleet.html OK — body=401, 0 JS errors
|
||||
[02:57:03] ✅ [PAGE-TEST] ai-benchmark.html OK — body=195, 0 JS errors
|
||||
[02:57:06] ✅ [PAGE-TEST] admin-saas.html OK — body=1435, 0 JS errors
|
||||
[02:57:09] ✅ [PAGE-TEST] admin.html OK — body=4737, 0 JS errors
|
||||
[02:57:13] ✅ [PAGE-TEST] crm.html OK — body=127, 0 JS errors
|
||||
[02:57:16] ✅ [PAGE-TEST] crons-monitor.html OK — body=153, 0 JS errors
|
||||
[02:57:20] ✅ [PAGE-TEST] growth-engine.html OK — body=1219, 0 JS errors
|
||||
[02:57:23] ✅ [PAGE-TEST] agents-valuechain.html OK — body=1402, 0 JS errors
|
||||
[02:57:30] ✅ [PAGE-TEST] enterprise-model.html OK — body=211, 0 JS errors
|
||||
[02:57:34] ✅ [PAGE-TEST] agents-goodjob.html OK — body=52, 0 JS errors
|
||||
[02:57:39] ✅ [PAGE-TEST] agents-archi.html OK — body=2690, 0 JS errors
|
||||
[02:57:42] ✅ [PAGE-TEST] blade-ai.html OK — body=771, 0 JS errors
|
||||
[02:57:42] 🎬 Recording enterprise viz video...
|
||||
[02:58:02] ✅ [VIDEO-TEST] enterprise viz 135 agents — video recorded
|
||||
[02:58:02] 🖥️ PHASE 3: Infrastructure tests...
|
||||
[02:58:02] ✅ [DOCKER] 19 containers UP — 0 down
|
||||
[02:58:03] ✅ [SYSTEMD] deerflow — active
|
||||
[02:58:03] ✅ [SYSTEMD] deerflow-web — active
|
||||
[02:58:03] ✅ [SYSTEMD] ollama — active
|
||||
[02:58:03] ✅ [SYSTEMD] search-proxy — active
|
||||
[02:58:03] ✅ [SYSTEMD] crowdsec — active
|
||||
[02:58:03] ✅ [SYSTEMD] fail2ban — active
|
||||
[02:58:03] ✅ [PORTS-S204] :80 nginx — HTTP 301
|
||||
[02:58:04] ✅ [PORTS-S204] :443 https — HTTP 400
|
||||
[02:58:04] ✅ [PORTS-S204] :5678 n8n — HTTP 200
|
||||
[02:58:04] ✅ [PORTS-S204] :8080 searxng — HTTP 200
|
||||
[02:58:04] ❌ [PORTS-S204] :11435 ollama — HTTP 000
|
||||
[02:58:04] ✅ [PORTS-S204] :6333 qdrant — HTTP 200
|
||||
[02:58:04] ✅ [NONREG] 153/153 PASS
|
||||
[02:58:04] ✅ [OLLAMA] 5 models loaded
|
||||
[02:58:04] 💾 PHASE 4: Saving results...
|
||||
[02:58:04]
|
||||
==================================================
|
||||
[02:58:04] L99-ALIVE REPORT
|
||||
[02:58:04] ==================================================
|
||||
[02:58:04] Tests: 37 (35 PASS, 1 FAIL, 1 WARN)
|
||||
[02:58:04] Layers: 13
|
||||
[02:58:04] Changes: 2
|
||||
[02:58:04] Screenshots: 12
|
||||
[02:58:04] Videos: 1
|
||||
[02:58:04] ⚡ CHANGED PAGE: crm.html
|
||||
[02:58:04] ⚡ NEW PAGE: integrations-marketplace.html
|
||||
[02:58:04] Report: /opt/weval-l99/logs/l99-20260417-025804.json
|
||||
[02:58:05]
|
||||
✅ L99-ALIVE complete: 37 tests, 35 PASS, 1 FAIL
|
||||
67
logs/alive-20260417-030358.log
Normal file
@@ -0,0 +1,67 @@
|
||||
[03:03:58] 🚀 L99-ALIVE v1.0 starting...
|
||||
[03:03:58] Time: 2026-04-17T03:03:58.965374
|
||||
[03:03:58] 🔍 PHASE 1: Detecting changes...
|
||||
[03:03:58] Scanning HTML pages...
|
||||
[03:04:12] ✅ [CHANGE-DETECT] changed cartographie-screens.html — old=257824 new=257963
|
||||
[03:04:25] ✅ [CHANGE-DETECT] new page lean6sigma-dashboard.html — size=13775
|
||||
[03:04:25] Scanning APIs...
|
||||
[03:04:26] Scanning Docker...
|
||||
[03:04:26] Checking S95...
|
||||
[03:04:26] ✅ [S95-HEALTH] Sentinel reachable
|
||||
[03:04:27] ✅ [S95-HEALTH] PMTA active
|
||||
[03:04:27] ✅ [S95-HEALTH] KumoMTA active
|
||||
[03:04:27] Checking S151...
|
||||
[03:04:27] ✅ [S151-HEALTH] HTTP 200
|
||||
[03:04:27] Checking Blade...
|
||||
[03:04:27] ✅ [BLADE-HEALTH] heartbeat fresh — 0min ago, blade
|
||||
[03:04:27] Checking Paperclip...
|
||||
[03:04:27] ✅ [PAPERCLIP] service live (HTTP 200)
|
||||
[03:04:27] Checking disk...
|
||||
[03:04:27] ✅ [DISK] usage 86% — 86%
|
||||
[03:04:27] 🔍 Changes detected: 2
|
||||
[03:04:27] 📸 PHASE 2: Auto-testing pages...
|
||||
[03:04:31] ✅ [PAGE-TEST] agents-valuechain.html OK — body=1402, 0 JS errors
|
||||
[03:04:35] ✅ [PAGE-TEST] admin.html OK — body=4737, 0 JS errors
|
||||
[03:04:39] ✅ [PAGE-TEST] agents-archi.html OK — body=2697, 0 JS errors
|
||||
[03:04:42] ✅ [PAGE-TEST] admin-saas.html OK — body=1435, 0 JS errors
|
||||
[03:04:45] ✅ [PAGE-TEST] blade-ai.html OK — body=771, 0 JS errors
|
||||
[03:04:49] ✅ [PAGE-TEST] crm.html OK — body=127, 0 JS errors
|
||||
[03:04:52] ✅ [PAGE-TEST] crons-monitor.html OK — body=153, 0 JS errors
|
||||
[03:04:59] ✅ [PAGE-TEST] enterprise-model.html OK — body=211, 0 JS errors
|
||||
[03:05:06] ✅ [PAGE-TEST] growth-engine.html OK — body=1219, 0 JS errors
|
||||
[03:05:09] ✅ [PAGE-TEST] ai-benchmark.html OK — body=195, 0 JS errors
|
||||
[03:05:14] ✅ [PAGE-TEST] agents-goodjob.html OK — body=52, 0 JS errors
|
||||
[03:05:17] ✅ [PAGE-TEST] agents-fleet.html OK — body=401, 0 JS errors
|
||||
[03:05:17] 🎬 Recording enterprise viz video...
|
||||
[03:05:37] ✅ [VIDEO-TEST] enterprise viz 135 agents — video recorded
|
||||
[03:05:38] 🖥️ PHASE 3: Infrastructure tests...
|
||||
[03:05:38] ✅ [DOCKER] 19 containers UP — 0 down
|
||||
[03:05:38] ✅ [SYSTEMD] deerflow — active
|
||||
[03:05:38] ✅ [SYSTEMD] deerflow-web — active
|
||||
[03:05:38] ✅ [SYSTEMD] ollama — active
|
||||
[03:05:38] ✅ [SYSTEMD] search-proxy — active
|
||||
[03:05:38] ✅ [SYSTEMD] crowdsec — active
|
||||
[03:05:38] ✅ [SYSTEMD] fail2ban — active
|
||||
[03:05:39] ✅ [PORTS-S204] :80 nginx — HTTP 301
|
||||
[03:05:39] ✅ [PORTS-S204] :443 https — HTTP 400
|
||||
[03:05:39] ✅ [PORTS-S204] :5678 n8n — HTTP 200
|
||||
[03:05:39] ✅ [PORTS-S204] :8080 searxng — HTTP 200
|
||||
[03:05:39] ❌ [PORTS-S204] :11435 ollama — HTTP 000
|
||||
[03:05:39] ✅ [PORTS-S204] :6333 qdrant — HTTP 200
|
||||
[03:05:39] ✅ [NONREG] 153/153 PASS
|
||||
[03:05:40] ✅ [OLLAMA] 5 models loaded
|
||||
[03:05:40] 💾 PHASE 4: Saving results...
|
||||
[03:05:40]
|
||||
==================================================
|
||||
[03:05:40] L99-ALIVE REPORT
|
||||
[03:05:40] ==================================================
|
||||
[03:05:40] Tests: 37 (36 PASS, 1 FAIL, 0 WARN)
|
||||
[03:05:40] Layers: 13
|
||||
[03:05:40] Changes: 2
|
||||
[03:05:40] Screenshots: 12
|
||||
[03:05:40] Videos: 1
|
||||
[03:05:40] ⚡ CHANGED PAGE: cartographie-screens.html
|
||||
[03:05:40] ⚡ NEW PAGE: lean6sigma-dashboard.html
|
||||
[03:05:40] Report: /opt/weval-l99/logs/l99-20260417-030540.json
|
||||
[03:05:40]
|
||||
✅ L99-ALIVE complete: 37 tests, 36 PASS, 1 FAIL
|
||||
65
logs/alive-20260417-031412.log
Normal file
@@ -0,0 +1,65 @@
|
||||
[03:14:12] 🚀 L99-ALIVE v1.0 starting...
|
||||
[03:14:12] Time: 2026-04-17T03:14:12.736975
|
||||
[03:14:12] 🔍 PHASE 1: Detecting changes...
|
||||
[03:14:12] Scanning HTML pages...
|
||||
[03:14:21] ✅ [CHANGE-DETECT] changed cartographie-screens.html — old=257963 new=258098
|
||||
[03:14:34] Scanning APIs...
|
||||
[03:14:35] Scanning Docker...
|
||||
[03:14:35] Checking S95...
|
||||
[03:14:35] ✅ [S95-HEALTH] Sentinel reachable
|
||||
[03:14:35] ✅ [S95-HEALTH] PMTA active
|
||||
[03:14:35] ✅ [S95-HEALTH] KumoMTA active
|
||||
[03:14:35] Checking S151...
|
||||
[03:14:36] ✅ [S151-HEALTH] HTTP 200
|
||||
[03:14:36] Checking Blade...
|
||||
[03:14:36] ✅ [BLADE-HEALTH] heartbeat fresh — 0min ago, blade
|
||||
[03:14:36] Checking Paperclip...
|
||||
[03:14:36] ✅ [PAPERCLIP] service live (HTTP 200)
|
||||
[03:14:36] Checking disk...
|
||||
[03:14:36] ✅ [DISK] usage 85% — 85%
|
||||
[03:14:36] 🔍 Changes detected: 1
|
||||
[03:14:36] 📸 PHASE 2: Auto-testing pages...
|
||||
[03:14:40] ✅ [PAGE-TEST] blade-ai.html OK — body=771, 0 JS errors
|
||||
[03:14:43] ✅ [PAGE-TEST] admin-saas.html OK — body=1435, 0 JS errors
|
||||
[03:14:47] ✅ [PAGE-TEST] agents-archi.html OK — body=2691, 0 JS errors
|
||||
[03:14:51] ✅ [PAGE-TEST] ai-benchmark.html OK — body=195, 0 JS errors
|
||||
[03:14:55] ✅ [PAGE-TEST] crm.html OK — body=127, 0 JS errors
|
||||
[03:14:58] ✅ [PAGE-TEST] admin.html OK — body=4737, 0 JS errors
|
||||
[03:15:10] ✅ [PAGE-TEST] enterprise-model.html OK — body=211, 0 JS errors
|
||||
[03:15:14] ✅ [PAGE-TEST] agents-valuechain.html OK — body=1402, 0 JS errors
|
||||
[03:15:17] ✅ [PAGE-TEST] crons-monitor.html OK — body=153, 0 JS errors
|
||||
[03:15:22] ✅ [PAGE-TEST] agents-goodjob.html OK — body=52, 0 JS errors
|
||||
[03:15:25] ✅ [PAGE-TEST] growth-engine.html OK — body=1219, 0 JS errors
|
||||
[03:15:29] ✅ [PAGE-TEST] agents-fleet.html OK — body=401, 0 JS errors
|
||||
[03:15:29] 🎬 Recording enterprise viz video...
|
||||
[03:15:49] ✅ [VIDEO-TEST] enterprise viz 135 agents — video recorded
|
||||
[03:15:49] 🖥️ PHASE 3: Infrastructure tests...
|
||||
[03:15:49] ✅ [DOCKER] 19 containers UP — 0 down
|
||||
[03:15:49] ✅ [SYSTEMD] deerflow — active
|
||||
[03:15:49] ✅ [SYSTEMD] deerflow-web — active
|
||||
[03:15:49] ✅ [SYSTEMD] ollama — active
|
||||
[03:15:49] ✅ [SYSTEMD] search-proxy — active
|
||||
[03:15:50] ✅ [SYSTEMD] crowdsec — active
|
||||
[03:15:50] ✅ [SYSTEMD] fail2ban — active
|
||||
[03:15:50] ✅ [PORTS-S204] :80 nginx — HTTP 301
|
||||
[03:15:50] ✅ [PORTS-S204] :443 https — HTTP 400
|
||||
[03:15:50] ✅ [PORTS-S204] :5678 n8n — HTTP 200
|
||||
[03:15:50] ✅ [PORTS-S204] :8080 searxng — HTTP 200
|
||||
[03:15:50] ✅ [PORTS-S204] :11434 ollama — HTTP 200
|
||||
[03:15:50] ✅ [PORTS-S204] :6333 qdrant — HTTP 200
|
||||
[03:15:50] ✅ [NONREG] 153/153 PASS
|
||||
[03:15:51] ✅ [OLLAMA] 5 models loaded
|
||||
[03:15:51] 💾 PHASE 4: Saving results...
|
||||
[03:15:51]
|
||||
==================================================
|
||||
[03:15:51] L99-ALIVE REPORT
|
||||
[03:15:51] ==================================================
|
||||
[03:15:51] Tests: 36 (36 PASS, 0 FAIL, 0 WARN)
|
||||
[03:15:51] Layers: 13
|
||||
[03:15:51] Changes: 1
|
||||
[03:15:51] Screenshots: 12
|
||||
[03:15:51] Videos: 1
|
||||
[03:15:51] ⚡ CHANGED PAGE: cartographie-screens.html
|
||||
[03:15:51] Report: /opt/weval-l99/logs/l99-20260417-031551.json
|
||||
[03:15:51]
|
||||
✅ L99-ALIVE complete: 36 tests, 36 PASS, 0 FAIL
|
||||
@@ -273,3 +273,14 @@ DETAIL: Key (email)=(businessiouiri@gmail.com) already exists.
|
||||
[2026-04-17 01:00:39] MA: START 50 MA HCPs
|
||||
[2026-04-17 01:01:11] MA: START 50 MA HCPs
|
||||
[2026-04-17 01:01:52] MA: START 50 MA HCPs
|
||||
[2026-04-17 04:00:02] MA: START 300 MA HCPs
|
||||
[2026-04-17 04:00:03] MA: START 300 MA HCPs
|
||||
[2026-04-17 04:00:02] MA: START 300 MA HCPs
|
||||
Traceback (most recent call last):
|
||||
File "/opt/weval-l99/ethica-enrich-ma.py", line 70, in <module>
|
||||
main()
|
||||
File "/opt/weval-l99/ethica-enrich-ma.py", line 61, in main
|
||||
cur.execute("UPDATE ethica.medecins_real SET email=%s WHERE id=%s AND (email IS NULL OR email='' OR email='N/A')", (email, hid))
|
||||
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "idx_mv_email"
|
||||
DETAIL: Key (email)=(saravita@sara.telecompost.it) already exists.
|
||||
|
||||
|
||||
518
logs/l99-20260417-024612.json
Normal file
@@ -0,0 +1,518 @@
|
||||
{
|
||||
"tests": [
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed agents-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=8078 new=9259"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ai-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=16217 new=17398"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page all-screens-live.html",
|
||||
"status": "P",
|
||||
"detail": "size=72"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed anthropic-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=5046 new=6227"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed api-key-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=10766 new=12517"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed architecture-live.html",
|
||||
"status": "P",
|
||||
"detail": "old=30547 new=32116"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed architecture-map.html",
|
||||
"status": "P",
|
||||
"detail": "old=29864 new=31488"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed architecture.html",
|
||||
"status": "P",
|
||||
"detail": "old=50281 new=51850"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed arsenal-offline.html",
|
||||
"status": "P",
|
||||
"detail": "old=2834 new=3064"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed avatar-picker.html",
|
||||
"status": "P",
|
||||
"detail": "old=11372 new=11373"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed blade-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=7687 new=8868"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page bpmn-studio-NEW.html",
|
||||
"status": "P",
|
||||
"detail": "size=6014"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page bpmn-studio-live.html",
|
||||
"status": "P",
|
||||
"detail": "size=7435"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page brain-center-tenant.html",
|
||||
"status": "P",
|
||||
"detail": "size=5110"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page cartographie-screens.html",
|
||||
"status": "P",
|
||||
"detail": "size=257824"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed cloudflare-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=13984 new=15165"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed crm.html",
|
||||
"status": "P",
|
||||
"detail": "old=20449 new=20450"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed deepseek-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=5224 new=6405"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed deepseek.html",
|
||||
"status": "P",
|
||||
"detail": "old=60881 new=63142"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed deerflow-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=3192 new=4373"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page dmaic-tracker-NEW.html",
|
||||
"status": "P",
|
||||
"detail": "size=5626"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page dmaic-workbench.html",
|
||||
"status": "P",
|
||||
"detail": "size=6798"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed docker-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=3217 new=4398"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed email-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=13801 new=14982"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed enterprise-model.html",
|
||||
"status": "P",
|
||||
"detail": "old=175998 new=176886"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ethica-chatbot.html",
|
||||
"status": "P",
|
||||
"detail": "old=9306 new=9827"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ethica-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=15443 new=16892"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ethica-login.html",
|
||||
"status": "P",
|
||||
"detail": "old=8572 new=8595"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed github-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=3223 new=4404"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed google-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=13245 new=14426"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed gpu-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=14954 new=16135"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed growth-engine-v2.html",
|
||||
"status": "P",
|
||||
"detail": "old=38421 new=38476"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed growth-engine.html",
|
||||
"status": "P",
|
||||
"detail": "old=35578 new=35584"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed hetzner-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=3204 new=4385"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed huggingface-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=5039 new=6220"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ia-registre.html",
|
||||
"status": "P",
|
||||
"detail": "old=39051 new=39051"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed index.html",
|
||||
"status": "P",
|
||||
"detail": "old=24805 new=24804"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed intents-registry.html",
|
||||
"status": "P",
|
||||
"detail": "old=51756 new=51756"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed keys-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=15427 new=16608"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed knowledge-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=6141 new=7322"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page kpi-live-dashboard.html",
|
||||
"status": "P",
|
||||
"detail": "size=3415"
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "Sentinel reachable",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "PMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "KumoMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S151-HEALTH",
|
||||
"test": "HTTP 200",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "BLADE-HEALTH",
|
||||
"test": "heartbeat fresh",
|
||||
"status": "P",
|
||||
"detail": "0min ago, blade"
|
||||
},
|
||||
{
|
||||
"layer": "PAPERCLIP",
|
||||
"test": "API disabled (service stopped)",
|
||||
"status": "W",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "DISK",
|
||||
"test": "usage 85%",
|
||||
"status": "P",
|
||||
"detail": "85%"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "enterprise-model.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=211, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-fleet.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=401, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "ai-benchmark.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=195, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crm.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=127, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-goodjob.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=52, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin-saas.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1435, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-archi.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=2696, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crons-monitor.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=153, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "growth-engine.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1219, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "blade-ai.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=771, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-valuechain.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1402, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=4737, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "VIDEO-TEST",
|
||||
"test": "enterprise viz 135 agents",
|
||||
"status": "P",
|
||||
"detail": "video recorded"
|
||||
},
|
||||
{
|
||||
"layer": "DOCKER",
|
||||
"test": "19 containers UP",
|
||||
"status": "P",
|
||||
"detail": "0 down"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow-web",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "ollama",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "search-proxy",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "crowdsec",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "fail2ban",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":80 nginx",
|
||||
"status": "P",
|
||||
"detail": "HTTP 301"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":443 https",
|
||||
"status": "P",
|
||||
"detail": "HTTP 400"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":5678 n8n",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":8080 searxng",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":11435 ollama",
|
||||
"status": "F",
|
||||
"detail": "HTTP 000"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":6333 qdrant",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "NONREG",
|
||||
"test": "153/153 PASS",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "OLLAMA",
|
||||
"test": "5 models loaded",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"name": "alive-enterprise-model.png",
|
||||
"page": "enterprise-model.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-fleet.png",
|
||||
"page": "agents-fleet.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-ai-benchmark.png",
|
||||
"page": "ai-benchmark.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crm.png",
|
||||
"page": "crm.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-goodjob.png",
|
||||
"page": "agents-goodjob.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin-saas.png",
|
||||
"page": "admin-saas.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-archi.png",
|
||||
"page": "agents-archi.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crons-monitor.png",
|
||||
"page": "crons-monitor.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-growth-engine.png",
|
||||
"page": "growth-engine.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-blade-ai.png",
|
||||
"page": "blade-ai.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-valuechain.png",
|
||||
"page": "agents-valuechain.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin.png",
|
||||
"page": "admin.html"
|
||||
}
|
||||
],
|
||||
"videos": [
|
||||
{
|
||||
"name": "6f9c151ae73779d26c13e1a9b14c504d.webm",
|
||||
"size": 1789786
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-17T02:44:33.871917",
|
||||
"type": "alive"
|
||||
}
|
||||
518
logs/l99-20260417-024644.json
Normal file
@@ -0,0 +1,518 @@
|
||||
{
|
||||
"tests": [
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed agents-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=8078 new=9259"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ai-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=16217 new=17398"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page all-screens-live.html",
|
||||
"status": "P",
|
||||
"detail": "size=72"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed anthropic-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=5046 new=6227"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed api-key-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=10766 new=12517"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed architecture-live.html",
|
||||
"status": "P",
|
||||
"detail": "old=30547 new=32116"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed architecture-map.html",
|
||||
"status": "P",
|
||||
"detail": "old=29864 new=31488"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed architecture.html",
|
||||
"status": "P",
|
||||
"detail": "old=50281 new=51850"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed arsenal-offline.html",
|
||||
"status": "P",
|
||||
"detail": "old=2834 new=3064"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed avatar-picker.html",
|
||||
"status": "P",
|
||||
"detail": "old=11372 new=11373"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed blade-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=7687 new=8868"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page bpmn-studio-NEW.html",
|
||||
"status": "P",
|
||||
"detail": "size=6014"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page bpmn-studio-live.html",
|
||||
"status": "P",
|
||||
"detail": "size=7435"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page brain-center-tenant.html",
|
||||
"status": "P",
|
||||
"detail": "size=5110"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page cartographie-screens.html",
|
||||
"status": "P",
|
||||
"detail": "size=257824"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed cloudflare-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=13984 new=15165"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed crm.html",
|
||||
"status": "P",
|
||||
"detail": "old=20449 new=20450"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed deepseek-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=5224 new=6405"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed deepseek.html",
|
||||
"status": "P",
|
||||
"detail": "old=60881 new=63142"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed deerflow-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=3192 new=4373"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page dmaic-tracker-NEW.html",
|
||||
"status": "P",
|
||||
"detail": "size=5626"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page dmaic-workbench.html",
|
||||
"status": "P",
|
||||
"detail": "size=6798"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed docker-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=3217 new=4398"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed email-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=13801 new=14982"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed enterprise-model.html",
|
||||
"status": "P",
|
||||
"detail": "old=175998 new=176886"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ethica-chatbot.html",
|
||||
"status": "P",
|
||||
"detail": "old=9306 new=9827"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ethica-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=15443 new=16892"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ethica-login.html",
|
||||
"status": "P",
|
||||
"detail": "old=8572 new=8595"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed github-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=3223 new=4404"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed google-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=13245 new=14426"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed gpu-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=14954 new=16135"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed growth-engine-v2.html",
|
||||
"status": "P",
|
||||
"detail": "old=38421 new=38476"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed growth-engine.html",
|
||||
"status": "P",
|
||||
"detail": "old=35578 new=35584"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed hetzner-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=3204 new=4385"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed huggingface-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=5039 new=6220"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed ia-registre.html",
|
||||
"status": "P",
|
||||
"detail": "old=39051 new=39051"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed index.html",
|
||||
"status": "P",
|
||||
"detail": "old=24805 new=24804"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed intents-registry.html",
|
||||
"status": "P",
|
||||
"detail": "old=51756 new=51756"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed keys-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=15427 new=16608"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed knowledge-hub.html",
|
||||
"status": "P",
|
||||
"detail": "old=6141 new=7322"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page kpi-live-dashboard.html",
|
||||
"status": "P",
|
||||
"detail": "size=3415"
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "Sentinel reachable",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "PMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "KumoMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S151-HEALTH",
|
||||
"test": "HTTP 200",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "BLADE-HEALTH",
|
||||
"test": "heartbeat fresh",
|
||||
"status": "P",
|
||||
"detail": "0min ago, blade"
|
||||
},
|
||||
{
|
||||
"layer": "PAPERCLIP",
|
||||
"test": "API disabled (service stopped)",
|
||||
"status": "W",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "DISK",
|
||||
"test": "usage 85%",
|
||||
"status": "P",
|
||||
"detail": "85%"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-valuechain.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1402, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-archi.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=2691, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-goodjob.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=52, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "enterprise-model.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=211, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crons-monitor.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=153, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=4737, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "growth-engine.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1219, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "ai-benchmark.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=195, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crm.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=127, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-fleet.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=401, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "blade-ai.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=771, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin-saas.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1435, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "VIDEO-TEST",
|
||||
"test": "enterprise viz 135 agents",
|
||||
"status": "P",
|
||||
"detail": "video recorded"
|
||||
},
|
||||
{
|
||||
"layer": "DOCKER",
|
||||
"test": "19 containers UP",
|
||||
"status": "P",
|
||||
"detail": "0 down"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow-web",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "ollama",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "search-proxy",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "crowdsec",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "fail2ban",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":80 nginx",
|
||||
"status": "P",
|
||||
"detail": "HTTP 301"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":443 https",
|
||||
"status": "P",
|
||||
"detail": "HTTP 400"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":5678 n8n",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":8080 searxng",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":11435 ollama",
|
||||
"status": "F",
|
||||
"detail": "HTTP 000"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":6333 qdrant",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "NONREG",
|
||||
"test": "153/153 PASS",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "OLLAMA",
|
||||
"test": "5 models loaded",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"name": "alive-agents-valuechain.png",
|
||||
"page": "agents-valuechain.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-archi.png",
|
||||
"page": "agents-archi.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-goodjob.png",
|
||||
"page": "agents-goodjob.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-enterprise-model.png",
|
||||
"page": "enterprise-model.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crons-monitor.png",
|
||||
"page": "crons-monitor.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin.png",
|
||||
"page": "admin.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-growth-engine.png",
|
||||
"page": "growth-engine.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-ai-benchmark.png",
|
||||
"page": "ai-benchmark.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crm.png",
|
||||
"page": "crm.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-fleet.png",
|
||||
"page": "agents-fleet.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-blade-ai.png",
|
||||
"page": "blade-ai.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin-saas.png",
|
||||
"page": "admin-saas.html"
|
||||
}
|
||||
],
|
||||
"videos": [
|
||||
{
|
||||
"name": "19514336ede76063693608d77787be75.webm",
|
||||
"size": 1984322
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-17T02:45:11.626196",
|
||||
"type": "alive"
|
||||
}
|
||||
284
logs/l99-20260417-025804.json
Normal file
@@ -0,0 +1,284 @@
|
||||
{
|
||||
"tests": [
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed crm.html",
|
||||
"status": "P",
|
||||
"detail": "old=20450 new=20460"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page integrations-marketplace.html",
|
||||
"status": "P",
|
||||
"detail": "size=12070"
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "Sentinel reachable",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "PMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "KumoMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S151-HEALTH",
|
||||
"test": "HTTP 200",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "BLADE-HEALTH",
|
||||
"test": "heartbeat fresh",
|
||||
"status": "P",
|
||||
"detail": "0min ago, blade"
|
||||
},
|
||||
{
|
||||
"layer": "PAPERCLIP",
|
||||
"test": "API disabled (service stopped)",
|
||||
"status": "W",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "DISK",
|
||||
"test": "usage 85%",
|
||||
"status": "P",
|
||||
"detail": "85%"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-fleet.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=401, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "ai-benchmark.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=195, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin-saas.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1435, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=4737, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crm.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=127, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crons-monitor.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=153, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "growth-engine.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1219, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-valuechain.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1402, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "enterprise-model.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=211, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-goodjob.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=52, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-archi.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=2690, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "blade-ai.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=771, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "VIDEO-TEST",
|
||||
"test": "enterprise viz 135 agents",
|
||||
"status": "P",
|
||||
"detail": "video recorded"
|
||||
},
|
||||
{
|
||||
"layer": "DOCKER",
|
||||
"test": "19 containers UP",
|
||||
"status": "P",
|
||||
"detail": "0 down"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow-web",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "ollama",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "search-proxy",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "crowdsec",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "fail2ban",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":80 nginx",
|
||||
"status": "P",
|
||||
"detail": "HTTP 301"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":443 https",
|
||||
"status": "P",
|
||||
"detail": "HTTP 400"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":5678 n8n",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":8080 searxng",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":11435 ollama",
|
||||
"status": "F",
|
||||
"detail": "HTTP 000"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":6333 qdrant",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "NONREG",
|
||||
"test": "153/153 PASS",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "OLLAMA",
|
||||
"test": "5 models loaded",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"name": "alive-agents-fleet.png",
|
||||
"page": "agents-fleet.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-ai-benchmark.png",
|
||||
"page": "ai-benchmark.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin-saas.png",
|
||||
"page": "admin-saas.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin.png",
|
||||
"page": "admin.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crm.png",
|
||||
"page": "crm.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crons-monitor.png",
|
||||
"page": "crons-monitor.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-growth-engine.png",
|
||||
"page": "growth-engine.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-valuechain.png",
|
||||
"page": "agents-valuechain.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-enterprise-model.png",
|
||||
"page": "enterprise-model.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-goodjob.png",
|
||||
"page": "agents-goodjob.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-archi.png",
|
||||
"page": "agents-archi.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-blade-ai.png",
|
||||
"page": "blade-ai.html"
|
||||
}
|
||||
],
|
||||
"videos": [
|
||||
{
|
||||
"name": "8c4abc2bd36d9cfe60ff17cf3cd7ac33.webm",
|
||||
"size": 1843542
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-17T02:56:29.123850",
|
||||
"type": "alive"
|
||||
}
|
||||
289
logs/l99-20260417-030540.json
Normal file
@@ -0,0 +1,289 @@
|
||||
{
|
||||
"tests": [
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed cartographie-screens.html",
|
||||
"status": "P",
|
||||
"detail": "old=257824 new=257963"
|
||||
},
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "new page lean6sigma-dashboard.html",
|
||||
"status": "P",
|
||||
"detail": "size=13775"
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "Sentinel reachable",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "PMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "KumoMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S151-HEALTH",
|
||||
"test": "HTTP 200",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "BLADE-HEALTH",
|
||||
"test": "heartbeat fresh",
|
||||
"status": "P",
|
||||
"detail": "0min ago, blade"
|
||||
},
|
||||
{
|
||||
"layer": "PAPERCLIP",
|
||||
"test": "service live (HTTP 200)",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "DISK",
|
||||
"test": "usage 86%",
|
||||
"status": "P",
|
||||
"detail": "86%"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-valuechain.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1402, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=4737, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-archi.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=2697, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin-saas.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1435, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "blade-ai.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=771, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crm.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=127, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crons-monitor.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=153, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "enterprise-model.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=211, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "growth-engine.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1219, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "ai-benchmark.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=195, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-goodjob.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=52, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-fleet.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=401, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "VIDEO-TEST",
|
||||
"test": "enterprise viz 135 agents",
|
||||
"status": "P",
|
||||
"detail": "video recorded"
|
||||
},
|
||||
{
|
||||
"layer": "DOCKER",
|
||||
"test": "19 containers UP",
|
||||
"status": "P",
|
||||
"detail": "0 down"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow-web",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "ollama",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "search-proxy",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "crowdsec",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "fail2ban",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":80 nginx",
|
||||
"status": "P",
|
||||
"detail": "HTTP 301"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":443 https",
|
||||
"status": "P",
|
||||
"detail": "HTTP 400"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":5678 n8n",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":8080 searxng",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":11435 ollama",
|
||||
"status": "F",
|
||||
"detail": "HTTP 000"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":6333 qdrant",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "NONREG",
|
||||
"test": "153/153 PASS",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "OLLAMA",
|
||||
"test": "5 models loaded",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"name": "alive-agents-valuechain.png",
|
||||
"page": "agents-valuechain.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin.png",
|
||||
"page": "admin.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-archi.png",
|
||||
"page": "agents-archi.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin-saas.png",
|
||||
"page": "admin-saas.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-blade-ai.png",
|
||||
"page": "blade-ai.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crm.png",
|
||||
"page": "crm.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crons-monitor.png",
|
||||
"page": "crons-monitor.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-enterprise-model.png",
|
||||
"page": "enterprise-model.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-growth-engine.png",
|
||||
"page": "growth-engine.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-ai-benchmark.png",
|
||||
"page": "ai-benchmark.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-goodjob.png",
|
||||
"page": "agents-goodjob.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-fleet.png",
|
||||
"page": "agents-fleet.html"
|
||||
}
|
||||
],
|
||||
"videos": [
|
||||
{
|
||||
"name": "554a958e4a1d137567aaf39e63013e5d.webm",
|
||||
"size": 1917712
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-17T03:03:58.965253",
|
||||
"type": "alive",
|
||||
"pass": 36,
|
||||
"fail": 1,
|
||||
"warn": 0,
|
||||
"total": 37,
|
||||
"score": 97
|
||||
}
|
||||
283
logs/l99-20260417-031551.json
Normal file
@@ -0,0 +1,283 @@
|
||||
{
|
||||
"tests": [
|
||||
{
|
||||
"layer": "CHANGE-DETECT",
|
||||
"test": "changed cartographie-screens.html",
|
||||
"status": "P",
|
||||
"detail": "old=257963 new=258098"
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "Sentinel reachable",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "PMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S95-HEALTH",
|
||||
"test": "KumoMTA active",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "S151-HEALTH",
|
||||
"test": "HTTP 200",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "BLADE-HEALTH",
|
||||
"test": "heartbeat fresh",
|
||||
"status": "P",
|
||||
"detail": "0min ago, blade"
|
||||
},
|
||||
{
|
||||
"layer": "PAPERCLIP",
|
||||
"test": "service live (HTTP 200)",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "DISK",
|
||||
"test": "usage 85%",
|
||||
"status": "P",
|
||||
"detail": "85%"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "blade-ai.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=771, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin-saas.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1435, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-archi.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=2691, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "ai-benchmark.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=195, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crm.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=127, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "admin.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=4737, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "enterprise-model.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=211, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-valuechain.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1402, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "crons-monitor.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=153, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-goodjob.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=52, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "growth-engine.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=1219, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "PAGE-TEST",
|
||||
"test": "agents-fleet.html OK",
|
||||
"status": "P",
|
||||
"detail": "body=401, 0 JS errors"
|
||||
},
|
||||
{
|
||||
"layer": "VIDEO-TEST",
|
||||
"test": "enterprise viz 135 agents",
|
||||
"status": "P",
|
||||
"detail": "video recorded"
|
||||
},
|
||||
{
|
||||
"layer": "DOCKER",
|
||||
"test": "19 containers UP",
|
||||
"status": "P",
|
||||
"detail": "0 down"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "deerflow-web",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "ollama",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "search-proxy",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "crowdsec",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "SYSTEMD",
|
||||
"test": "fail2ban",
|
||||
"status": "P",
|
||||
"detail": "active"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":80 nginx",
|
||||
"status": "P",
|
||||
"detail": "HTTP 301"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":443 https",
|
||||
"status": "P",
|
||||
"detail": "HTTP 400"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":5678 n8n",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":8080 searxng",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":11434 ollama",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "PORTS-S204",
|
||||
"test": ":6333 qdrant",
|
||||
"status": "P",
|
||||
"detail": "HTTP 200"
|
||||
},
|
||||
{
|
||||
"layer": "NONREG",
|
||||
"test": "153/153 PASS",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"layer": "OLLAMA",
|
||||
"test": "5 models loaded",
|
||||
"status": "P",
|
||||
"detail": ""
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"name": "alive-blade-ai.png",
|
||||
"page": "blade-ai.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin-saas.png",
|
||||
"page": "admin-saas.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-archi.png",
|
||||
"page": "agents-archi.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-ai-benchmark.png",
|
||||
"page": "ai-benchmark.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crm.png",
|
||||
"page": "crm.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-admin.png",
|
||||
"page": "admin.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-enterprise-model.png",
|
||||
"page": "enterprise-model.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-valuechain.png",
|
||||
"page": "agents-valuechain.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-crons-monitor.png",
|
||||
"page": "crons-monitor.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-goodjob.png",
|
||||
"page": "agents-goodjob.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-growth-engine.png",
|
||||
"page": "growth-engine.html"
|
||||
},
|
||||
{
|
||||
"name": "alive-agents-fleet.png",
|
||||
"page": "agents-fleet.html"
|
||||
}
|
||||
],
|
||||
"videos": [
|
||||
{
|
||||
"name": "4ec0f320127df2e0c6bab399802f95fb.webm",
|
||||
"size": 1920859
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-17T03:14:12.736808",
|
||||
"type": "alive",
|
||||
"pass": 36,
|
||||
"fail": 0,
|
||||
"warn": 0,
|
||||
"total": 36,
|
||||
"score": 100
|
||||
}
|
||||
@@ -34,7 +34,7 @@ if [ "$RAM_PCT" -gt 85 ]; then
|
||||
fi
|
||||
|
||||
# 4. Critical services check
|
||||
for SVC in "ollama:11435" "qdrant:6333" "searxng:8888" "mattermost:8065"; do
|
||||
for SVC in "ollama:11434" "qdrant:6333" "searxng:8888" "mattermost:8065"; do
|
||||
NAME=$(echo $SVC | cut -d: -f1)
|
||||
PORT=$(echo $SVC | cut -d: -f2)
|
||||
if ! curl -s --max-time 2 "http://127.0.0.1:$PORT/" > /dev/null 2>&1; then
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-17T02:00:02.239444",
|
||||
"generated": "2026-04-17T04:00:02.519440",
|
||||
"version": "1.0",
|
||||
"agents": {
|
||||
"total": 0,
|
||||
@@ -14,8 +14,8 @@
|
||||
},
|
||||
"crons": {
|
||||
"cron_d": 73,
|
||||
"www_data": 5,
|
||||
"total": 78,
|
||||
"www_data": 9,
|
||||
"total": 82,
|
||||
"source": "S204 crontab+cron.d"
|
||||
},
|
||||
"providers": {
|
||||
@@ -108,8 +108,8 @@
|
||||
"healthy": true
|
||||
},
|
||||
"Ollama": {
|
||||
"port": 11435,
|
||||
"healthy": false
|
||||
"port": 11434,
|
||||
"healthy": true
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -428,7 +428,7 @@
|
||||
]
|
||||
},
|
||||
"infrastructure": {
|
||||
"disk_used": "121G",
|
||||
"disk_used": "123G",
|
||||
"disk_pct": "85%",
|
||||
"servers": {
|
||||
"S204": "primary",
|
||||
|
||||
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 348 KiB After Width: | Height: | Size: 347 KiB |
|
Before Width: | Height: | Size: 614 KiB After Width: | Height: | Size: 614 KiB |
|
Before Width: | Height: | Size: 231 KiB After Width: | Height: | Size: 231 KiB |
|
Before Width: | Height: | Size: 333 KiB After Width: | Height: | Size: 344 KiB |
|
Before Width: | Height: | Size: 471 KiB After Width: | Height: | Size: 474 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 372 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 310 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 27 KiB |