Wave 114 auto
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled

This commit is contained in:
WEVIA
2026-04-12 23:12:51 +02:00
parent 991b1a027f
commit 01ce7627ea
26 changed files with 471 additions and 590 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +1,8 @@
{
"ts": "2026-04-12T21:09:40+00:00",
"ts": "2026-04-12T21:12:46+00:00",
"hostname": "LAPTOP-VE75QUHF",
"cpu": "71%",
"ram": "76% (16GB)",
"cpu": "30%",
"ram": "75% (16GB)",
"disk": "81% (464GB)",
"uptime": "0d 5h",
"user": "Yace",

View File

@@ -13,5 +13,5 @@
"Run simulation",
"CEO insights"
],
"timestamp": "2026-04-12 21:05:01"
"timestamp": "2026-04-12 21:10:02"
}

View File

@@ -82,4 +82,8 @@ fatal: bad object HEAD
error: api/wevia-autonomy-status.json: failed to insert into database
error: unable to index file 'api/wevia-autonomy-status.json'
fatal: updating files failed
2026-04-12 21:00:02 | L99:957/957 | NR:NONREG: 153/153 (100%) | D:17 | disk:89% | hubs:29 | DISK_CLEAN2026-04-12 21:05:01 | L99:957/957 | NR:NONREG: 153/153 (100%) | D:17 | disk:88% | hubs:29 | CLEAR
2026-04-12 21:00:02 | L99:957/957 | NR:NONREG: 153/153 (100%) | D:17 | disk:89% | hubs:29 | DISK_CLEAN2026-04-12 21:05:01 | L99:957/957 | NR:NONREG: 153/153 (100%) | D:17 | disk:88% | hubs:29 | CLEARerror: insufficient permission for adding an object to repository database .git/objects
error: api/wevia-selfmanage.json: failed to insert into database
error: unable to index file 'api/wevia-selfmanage.json'
fatal: updating files failed
2026-04-12 21:10:02 | L99:957/957 | NR:NONREG: 153/153 (100%) | D:17 | disk:89% | hubs:29 | DISK_CLEAN

View File

@@ -1,15 +1,16 @@
{
"ts": "2026-04-12 21:05:01",
"ts": "2026-04-12 21:10:02",
"r": {
"reconcile": "OK",
"nonreg": "NONREG: 153\/153 (100%)",
"l99": "957\/957",
"docker": 17,
"disk": 88,
"disk": 89,
"hubs": 29,
"dirty": 0,
"dirty": 5,
"pushed": true,
"alerts": [
"CLEAR"
"DISK_CLEAN"
]
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-12 23:05:05",
"timestamp": "2026-04-12 23:10:10",
"healthy": true,
"issues": [],
"fixes": [],

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-12 21:05:08",
"timestamp": "2026-04-12 21:10:09",
"healthy": false,
"checks": {
"outpost": "DOWN",
@@ -30,57 +30,57 @@
{
"level": "critical",
"msg": "Outpost DOWN 9090",
"ts": "2026-04-12T21:05:01+00:00"
"ts": "2026-04-12T21:10:02+00:00"
},
{
"level": "critical",
"msg": "Outpost STILL DOWN",
"ts": "2026-04-12T21:05:06+00:00"
"ts": "2026-04-12T21:10:07+00:00"
},
{
"level": "warning",
"msg": "Auth flow ethica.weval-consulting.com: 200",
"ts": "2026-04-12T21:05:07+00:00"
"ts": "2026-04-12T21:10:07+00:00"
},
{
"level": "warning",
"msg": "Auth flow n8n.weval-consulting.com: 200",
"ts": "2026-04-12T21:05:07+00:00"
"ts": "2026-04-12T21:10:08+00:00"
},
{
"level": "warning",
"msg": "Auth flow crm.weval-consulting.com: 200",
"ts": "2026-04-12T21:05:07+00:00"
"ts": "2026-04-12T21:10:08+00:00"
},
{
"level": "warning",
"msg": "Auth flow mm.weval-consulting.com: 200",
"ts": "2026-04-12T21:05:08+00:00"
"ts": "2026-04-12T21:10:08+00:00"
},
{
"level": "warning",
"msg": "Auth flow analytics.weval-consulting.com: 200",
"ts": "2026-04-12T21:05:08+00:00"
"ts": "2026-04-12T21:10:08+00:00"
},
{
"level": "warning",
"msg": "Auth flow deerflow.weval-consulting.com: 200",
"ts": "2026-04-12T21:05:08+00:00"
"ts": "2026-04-12T21:10:08+00:00"
},
{
"level": "warning",
"msg": "Callback location missing in nginx",
"ts": "2026-04-12T21:05:08+00:00"
"ts": "2026-04-12T21:10:08+00:00"
}
],
"fixes": [
{
"title": "Restart authentik",
"ts": "2026-04-12T21:05:01+00:00"
"ts": "2026-04-12T21:10:02+00:00"
},
{
"title": "Callback location auto-added",
"ts": "2026-04-12T21:05:08+00:00"
"ts": "2026-04-12T21:10:08+00:00"
}
]
}

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-12 21:05:01",
"timestamp": "2026-04-12 21:10:02",
"version": "1.0",
"disk": 89,
"ram": 33,
@@ -14,29 +14,29 @@
"title": "Disk light cleanup 89%",
"cmd": "find \/var\/log -name '*.gz' -mtime +7 -delete; find \/tmp -mtime +3 -delete 2>\/dev\/null",
"output": "",
"time": "21:05:01"
"time": "21:10:02"
}
],
"alerts": [
{
"level": "critical",
"msg": "S204:deerflow DOWN (:2024)",
"time": "21:05:01"
"time": "21:10:02"
},
{
"level": "critical",
"msg": "S204:authentik DOWN (:9090)",
"time": "21:05:01"
"time": "21:10:02"
}
],
"log": [
"21:05:01 AUTO-FIX: Disk light cleanup 89%",
"21:05:01 Disk: 89%",
"21:05:02 SSL: 357d remaining",
"21:05:02 Docker: 17 containers",
"21:05:02 Ollama: 5 models, 13.9GB",
"21:05:02 RAM: 33%",
"21:05:02 Arch score: 100\/100"
"21:10:02 AUTO-FIX: Disk light cleanup 89%",
"21:10:02 Disk: 89%",
"21:10:02 SSL: 357d remaining",
"21:10:02 Docker: 17 containers",
"21:10:02 Ollama: 5 models, 13.9GB",
"21:10:02 RAM: 33%",
"21:10:02 Arch score: 100\/100"
],
"s204_services": 8,
"s95_mta": 5

View File

@@ -1 +1 @@
{"ts":"23:08","status":"offline"}
{"ts":"23:12","status":"offline"}

View File

@@ -0,0 +1,69 @@
<?php
// WEVIA Dynamic Resolver v1.0
// Reads wevia-tool-registry.json → matches keywords → calls real API
// No more hardcoded intents needed — just add to JSON
function wevia_resolve($msg) {
$registry = __DIR__ . '/wevia-tool-registry.json';
if (!file_exists($registry)) return null;
$tools = json_decode(file_get_contents($registry), true);
if (!is_array($tools)) return null;
$msg_lower = mb_strtolower(trim($msg));
$best = null;
$best_score = 0;
foreach ($tools as $tool) {
$keywords = explode('|', $tool['kw'] ?? '');
$score = 0;
foreach ($keywords as $kw) {
$kw = trim($kw);
if (empty($kw)) continue;
// Exact match = 10, contains = 5, partial = 2
if ($msg_lower === $kw) { $score += 10; }
elseif (preg_match('/\b' . preg_quote($kw, '/') . '\b/iu', $msg)) { $score += 5; }
elseif (stripos($msg, $kw) !== false) { $score += 2; }
}
if ($score > $best_score) {
$best_score = $score;
$best = $tool;
}
}
if (!$best || $best_score < 2) return null;
// Route to correct API
$api_url = ($best['api'] === 'arena')
? 'https://127.0.0.1/api/weval-chatbot-api.php'
: 'https://127.0.0.1/api/wevia-master-api.php';
$payload = json_encode(['message' => $best['msg'] ?? $msg]);
$ch = curl_init($api_url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Host: weval-consulting.com'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 30,
]);
$resp = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code !== 200 || empty($resp)) return null;
$data = json_decode($resp, true);
$content = $data['content'] ?? $data['response'] ?? null;
if (!$content || strlen($content) < 10) return null;
return [
'content' => $content,
'provider' => 'dynamic-resolver',
'tool' => $best['id'],
'source' => $best['api'],
];
}

View File

@@ -1,2 +1,2 @@
{"ts":"23:00","disk":"89%","swap":"0%","docker_dead":"none","http":"200","ssl":"Certificate will not expire
{"ts":"23:10","disk":"89%","swap":"0%","docker_dead":"none","http":"200","ssl":"Certificate will not expire
ok","alerts":" Disk:89%→89%","crons":57}

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-12 21:00:05",
"timestamp": "2026-04-12 21:10:06",
"healthy": false,
"global_pass": 416,
"global_fail": 14,
@@ -34,8 +34,8 @@
"total": 93
},
"chat_monitor": {
"pass": 1,
"fail": 2,
"pass": 3,
"fail": 0,
"total": 3,
"caps": {
"Lean Six Sigma": {
@@ -44,14 +44,14 @@
"json": true
},
"Qdrant": {
"ok": false,
"code": 429,
"json": false
"ok": true,
"code": 200,
"json": true
},
"SearXNG": {
"ok": false,
"code": 429,
"json": false
"ok": true,
"code": 200,
"json": true
}
}
},
@@ -84,9 +84,8 @@
"issues": [
"L99 UX: 12 failures",
"L99 Command: 2 failures",
"Chat Monitor: 2 capabilities returning non-JSON",
"Auth Agent: unhealthy",
"L99 Mission: 2 failures (QUALITY, ssl)"
],
"issues_count": 5
"issues_count": 4
}

View File

@@ -1 +1 @@
{"ts": "23:05", "status": "ok"}
{"ts": "23:10", "status": "ok"}

View File

@@ -1,388 +1,48 @@
{
"v": "3.0",
"count": 67,
"tools": [
{
"id": "reconcile",
"kw": "reconcilie|reconcile",
"api": "master",
"msg": "reconcilie tout"
},
{
"id": "nonreg",
"kw": "nonreg|regression",
"api": "master",
"msg": "lance nonreg"
},
{
"id": "push",
"kw": "push|git|github|commit",
"api": "master",
"msg": "push all"
},
{
"id": "backup",
"kw": "backup|gold|vault",
"api": "master",
"msg": "backup gold"
},
{
"id": "system",
"kw": "system.*status|serveur|infra",
"api": "master",
"msg": "system status"
},
{
"id": "docker",
"kw": "docker|container",
"api": "master",
"msg": "scan docker ports"
},
{
"id": "disk",
"kw": "disk|disque|cleanup|espace",
"api": "master",
"msg": "disk usage"
},
{
"id": "ssl",
"kw": "ssl|certificat",
"api": "master",
"msg": "scan ssl"
},
{
"id": "security",
"kw": "securite|security|vuln|nuclei",
"api": "master",
"msg": "scan securite"
},
{
"id": "crons",
"kw": "cron|crontab|planifi",
"api": "master",
"msg": "scan crons"
},
{
"id": "load",
"kw": "load|charge|uptime",
"api": "master",
"msg": "load live"
},
{
"id": "ports",
"kw": "port.*scan|port.*conflit|port.*occup",
"api": "master",
"msg": "scan ports"
},
{
"id": "s95",
"kw": "s95|wevads|arsenal",
"api": "master",
"msg": "s95 status"
},
{
"id": "git_dirty",
"kw": "dirty|git.*status|fichier.*modif",
"api": "master",
"msg": "git dirty files"
},
{
"id": "logs",
"kw": "log.*erreur|log.*tail|dernier.*log",
"api": "master",
"msg": "tail error logs"
},
{
"id": "cascade",
"kw": "cascade|provider|fournisseur",
"api": "master",
"msg": "cascade status"
},
{
"id": "arena_health",
"kw": "arena.*health|alive|dead.*model",
"api": "GET:/api/wevia-arena-health.php"
},
{
"id": "arena_budget",
"kw": "budget|cout|cost|depense",
"api": "GET:/api/wevia-arena-budget.php?action=status"
},
{
"id": "arena_test",
"kw": "arena.*test|test.*arena",
"api": "GET:/api/wevia-arena-evolve.php?action=test"
},
{
"id": "arena_autowire",
"kw": "autowire|auto.*wire",
"api": "GET:/api/wevia-arena-autowire.php?action=status"
},
{
"id": "multiagent",
"kw": "multi.agent|consensus|agents.*parall",
"api": "POST:/api/wevia-arena-multiagent.php"
},
{
"id": "ollama",
"kw": "ollama|modele.*local|model.*local",
"api": "master",
"msg": "ollama models"
},
{
"id": "deepseek",
"kw": "deepseek|deep.*seek|deepthin",
"api": "master",
"msg": "deepseek status"
},
{
"id": "ethica",
"kw": "ethica|hcp|pharma|medecin",
"api": "master",
"msg": "ethica scraper status"
},
{
"id": "ethica_enrich",
"kw": "enrich.*ethica|lance.*enrich|gap.*email",
"api": "master",
"msg": "ethica enrich status"
},
{
"id": "ethica_gap",
"kw": "gap.*detail|gap.*pays|DZ.*MA.*TN",
"api": "master",
"msg": "ethica gap detail pays"
},
{
"id": "vistex",
"kw": "vistex|lead|cosumar|carrefour",
"api": "master",
"msg": "vistex lead protect"
},
{
"id": "brain_send",
"kw": "brain.*send|campagne|arsenal",
"api": "master",
"msg": "brain send status"
},
{
"id": "seo",
"kw": "seo|title|meta",
"api": "master",
"msg": "seo check site"
},
{
"id": "crm",
"kw": "crm|twenty|deal|pipeline.*client",
"api": "master",
"msg": "crm twenty status"
},
{
"id": "pricing",
"kw": "pricing|tarif|prix|devis",
"api": "master",
"msg": "pricing strategie"
},
{
"id": "competitors",
"kw": "concurrent|competitor|veille",
"api": "master",
"msg": "competitor analysis"
},
{
"id": "compliance",
"kw": "rgpd|compliance|gdpr|consent",
"api": "master",
"msg": "compliance rgpd"
},
{
"id": "office",
"kw": "office|o365|outlook|warming",
"api": "GET:/api/office-admins.php?action=health"
},
{
"id": "analytics",
"kw": "analytics|plausible|visiteur",
"api": "master",
"msg": "analytics plausible"
},
{
"id": "mattermost",
"kw": "mattermost|chat.*equipe",
"api": "master",
"msg": "mattermost status"
},
{
"id": "n8n",
"kw": "n8n|workflow.*auto",
"api": "master",
"msg": "n8n status"
},
{
"id": "qdrant",
"kw": "qdrant|vector|collection|rag|embedding",
"api": "master",
"msg": "qdrant collections"
},
{
"id": "searxng",
"kw": "searxng|search.*engine|moteur.*rech",
"api": "master",
"msg": "searxng status"
},
{
"id": "paperclip",
"kw": "paperclip|langfuse",
"api": "master",
"msg": "paperclip status"
},
{
"id": "deerflow",
"kw": "deerflow|deer.*flow|research.*agent",
"api": "master",
"msg": "deerflow status"
},
{
"id": "skill_pr",
"kw": "pr.*review|review.*code|pull.*request",
"api": "GET:/api/skill-pr-review.php?action=status"
},
{
"id": "skill_image",
"kw": "genere.*image|image.*gen|svg|logo",
"api": "GET:/api/skill-image-gen.php?action=status"
},
{
"id": "skill_tts",
"kw": "voix|tts|text.*speech|audio|mp3",
"api": "GET:/api/skill-voice-tts.php?action=status"
},
{
"id": "skill_video",
"kw": "video|mp4|ffmpeg|film",
"api": "GET:/api/skill-video-gen.php?action=status"
},
{
"id": "skill_webhook",
"kw": "webhook|hook|notification.*auto",
"api": "GET:/api/skill-webhook-factory.php?action=status"
},
{
"id": "skill_debug",
"kw": "debug|diagnostic.*4|evidence.*pattern",
"api": "GET:/api/skill-systematic-debug.php?action=status"
},
{
"id": "skill_browser",
"kw": "screenshot|capture.*page|playwright.*url",
"api": "GET:/api/skill-browser-agent.php?action=status"
},
{
"id": "skill_cicd",
"kw": "ci.cd|pipeline.*deploy|deploy.*auto",
"api": "GET:/api/skill-cicd-pipeline.php?action=status"
},
{
"id": "skill_long",
"kw": "long.*task|tache.*fond|background",
"api": "GET:/api/skill-long-task.php?action=status"
},
{
"id": "codegen",
"kw": "genere.*code|code.*agent|genere.*app|genere.*dashboard|genere.*erp|genere.*crm|genere.*saas",
"api": "master",
"msg": "genere un composant"
},
{
"id": "filegen",
"kw": "genere.*pdf|genere.*excel|genere.*pptx",
"api": "master",
"msg": "genere pdf rapport"
},
{
"id": "artifact",
"kw": "artifact|artefact|liste.*artifact",
"api": "master",
"msg": "artifact list"
},
{
"id": "mermaid",
"kw": "mermaid|diagramme|flowchart|ishikawa|swot",
"api": "master",
"msg": "genere diagramme mermaid"
},
{
"id": "l99",
"kw": "l99|layer|score|sigma",
"api": "GET:/api/l99-state.json"
},
{
"id": "keys",
"kw": "key.*health|api.*key|token.*status|pat.*github",
"api": "GET:/api/key-health.json"
},
{
"id": "archi",
"kw": "architecture|bpmn|topology",
"api": "GET:/api/architecture-scanner.php"
},
{
"id": "supervisor",
"kw": "supervisor|supervise|surveill",
"api": "GET:/api/supervisor-state.json"
},
{
"id": "capabilities",
"kw": "capabilit|capacit",
"api": "GET:/api/wevia-capabilities.php"
},
{
"id": "hubs",
"kw": "hub.*status|combien.*hub|liste.*hub",
"api": "master",
"msg": "hubs status"
},
{
"id": "pages",
"kw": "combien.*page|liste.*page|new.*page",
"api": "master",
"msg": "pages count"
},
{
"id": "life",
"kw": "wevia.*life|chief|eisenhower",
"api": "master",
"msg": "wevia life status"
},
{
"id": "exec_cmd",
"kw": "execute|lance.*commande|run.*command|shell",
"api": "master",
"msg": "system status"
},
{
"id": "install",
"kw": "install|pip.*install|apt.*install|npm.*install",
"api": "master",
"msg": "system status"
},
{
"id": "restart",
"kw": "restart|relanc|redemarr",
"api": "master",
"msg": "system status"
},
{
"id": "blade",
"kw": "blade|desktop.*agent|sentinel",
"api": "master",
"msg": "blade health"
},
{
"id": "cloudflare",
"kw": "cloudflare|cf.*dns|cf.*purge|waf",
"api": "master",
"msg": "cloudflare status"
}
]
}
[
{"id":"status","kw":"tout va bien|ça va|ça roule|status global|état système","api":"master","msg":"tout va bien"},
{"id":"disk","kw":"disque|disk|espace|stockage","api":"master","msg":"espace disque"},
{"id":"docker","kw":"docker|conteneur|container","api":"master","msg":"docker status"},
{"id":"l99","kw":"l99|qualité|quality|sigma","api":"master","msg":"l99 state"},
{"id":"git","kw":"git status|git push|commit|push","api":"master","msg":"git push sync"},
{"id":"gold","kw":"gold|backup|vault|sauvegarde","api":"master","msg":"gold backup check"},
{"id":"nonreg","kw":"nonreg|non.?reg|régression","api":"master","msg":"nonreg complet"},
{"id":"diag","kw":"diagnostic|self.?diag|santé","api":"master","msg":"self diagnostic"},
{"id":"providers","kw":"provider|cascade|fournisseur|ia.?health","api":"master","msg":"providers cascade health"},
{"id":"crowdsec","kw":"crowdsec|sécurité|security|firewall","api":"master","msg":"CrowdSec status"},
{"id":"nmap","kw":"nmap|scan.?port|port.?scan","api":"master","msg":"nmap scan local"},
{"id":"dns","kw":"dns|cloudflare|zone|domaine","api":"master","msg":"montre les zones DNS"},
{"id":"purge","kw":"purge|cache.?clear|vider.?cache","api":"master","msg":"purge le cache Cloudflare"},
{"id":"ethica","kw":"ethica|hcp|médecin|pharma|pipeline.?ethica","api":"master","msg":"pipeline Ethica"},
{"id":"qdrant","kw":"qdrant|vecteur|vector|embedding","api":"master","msg":"combien de vecteurs Qdrant"},
{"id":"kb","kw":"knowledge|kb|base.?connaissance|wiki","api":"master","msg":"knowledge base tables"},
{"id":"ollama","kw":"ollama|modèle.?local|llm.?local","api":"master","msg":"ollama status"},
{"id":"agents","kw":"agent|fleet|paperclip|deerflow|blade","api":"master","msg":"agents fleet tous"},
{"id":"brain","kw":"brain|nucleus|cognitif|engine.?ia","api":"master","msg":"brain engine status"},
{"id":"sovereign","kw":"souverain|sovereign|9.?couche|layer","api":"master","msg":"sovereign brain 9 couches"},
{"id":"tools","kw":"tool|outil|capability|capacité","api":"master","msg":"tools capabilities list"},
{"id":"faq","kw":"faq|piège|trap|erreur.?connue|anti.?reg","api":"master","msg":"faq anti-régression"},
{"id":"doctrine","kw":"doctrine|séquence|bloquante|règle|workflow","api":"master","msg":"doctrine séquence bloquante"},
{"id":"s95","kw":"s95|wevads|arsenal","api":"master","msg":"état S95 wevads"},
{"id":"crons","kw":"cron|tâche.?planif|scheduled","api":"master","msg":"combien de crons"},
{"id":"life","kw":"wevia.?life|email.?classif|morning.?brief|eisenhower","api":"master","msg":"WEVIA LIFE état"},
{"id":"rooms","kw":"meeting|room|salle|réunion","api":"master","msg":"meeting room status"},
{"id":"enterprise","kw":"enterprise|département|pipeline.?dept","api":"master","msg":"enterprise model"},
{"id":"pricing","kw":"prix|tarif|pricing|coût|devis|budget","api":"master","msg":"tarifs WEVAL"},
{"id":"roadmap","kw":"roadmap|feuille.?route|stratégie|plan.?action","api":"master","msg":"roadmap WEVAL"},
{"id":"vistex","kw":"vistex|lead.?protect|partenaire","api":"master","msg":"vistex lead protection"},
{"id":"reconcile","kw":"réconcil|reconcil|consolid|unifi","api":"master","msg":"reconcilie les travaux"},
{"id":"audit","kw":"audit|complet|full.?scan|mega.?scan","api":"master","msg":"audit complet"},
{"id":"email","kw":"rédige|écris|compose|email|mail|lettre","api":"master","msg":"rédige un email"},
{"id":"swot","kw":"swot|porter|pestel|bcg|matrice","api":"master","msg":"analyse SWOT"},
{"id":"office","kw":"office|o365|microsoft|warming|sender","api":"master","msg":"office status"},
{"id":"oss","kw":"oss|open.?source|discovery|toolhub","api":"master","msg":"oss discovery status"},
{"id":"hubs","kw":"hub|combien.?hub|interface","api":"master","msg":"combien de hubs"},
{"id":"searxng","kw":"searxng|recherche|search.?engine","api":"master","msg":"SearXNG status"},
{"id":"mattermost","kw":"mattermost|slack|chat.?team","api":"master","msg":"Mattermost status"},
{"id":"gitea","kw":"gitea|repo|dépôt","api":"master","msg":"gitea status"},
{"id":"n8n","kw":"n8n|workflow|automation","api":"master","msg":"n8n status"},
{"id":"image","kw":"image|logo|génère.?image|illustration","api":"arena","msg":"génère une image"},
{"id":"mermaid","kw":"diagramme|flowchart|mermaid|schéma|bpmn","api":"arena","msg":"dessine un flowchart"},
{"id":"code","kw":"code|script|python|php|javascript|programme","api":"arena","msg":"écris un script"},
{"id":"pdf","kw":"pdf|rapport|document|génère.?pdf","api":"arena","msg":"génère un rapport PDF"}
]

View File

@@ -0,0 +1,8 @@
```markdown
# WEVCODE : Tableau de Bord Analytique Souverain
---
## 🚀 Introduction
Bienvenue dans le tableau de bord analytique WEVCODE, une solution robuste et souveraine conçue pour offrir une visualisation complète et interactive de vos données métier. Développ

View File

@@ -0,0 +1,2 @@
<?php
WEVCODE est fier de vous présenter une solution complète et souveraine pour votre API REST et votre Dashboard analytique. Ce code unique et auto-suffisant est conçu pour la production, intégrant toutes les fonctionnalités demandées : API CRUD, dashboard interactif avec charts, KPIs, fil

View File

@@ -0,0 +1 @@
Bonjour, analyste de données ! Je suis WEVCODE, votre générateur de code souverain WEVAL. Je vous présente un dashboard analytique complet, moderne, et prêt pour la production. Ce fichier HTML unique intègre tout le nécessaire : HTML5, CSS3, JavaScript,

View File

@@ -0,0 +1,197 @@
**Création de la base de données**
```sql
CREATE DATABASE dashboard_analytique;
```
**Connexion à la base de données**
```sql
\c dashboard_analytique
```
**Création des tables**
```sql
CREATE TABLE utilisateurs (
id SERIAL PRIMARY KEY,
nom VARCHAR(255) NOT NULL,
prenom VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
mot_de_passe VARCHAR(255) NOT NULL
);
CREATE TABLE departements (
id SERIAL PRIMARY KEY,
nom VARCHAR(255) NOT NULL
);
CREATE TABLE sous_departements (
id SERIAL PRIMARY KEY,
nom VARCHAR(255) NOT NULL,
departement_id INTEGER NOT NULL REFERENCES departements(id)
);
CREATE TABLE projets (
id SERIAL PRIMARY KEY,
nom VARCHAR(255) NOT NULL,
sous_departement_id INTEGER NOT NULL REFERENCES sous_departements(id)
);
CREATE TABLE indicateurs (
id SERIAL PRIMARY KEY,
nom VARCHAR(255) NOT NULL,
projet_id INTEGER NOT NULL REFERENCES projets(id)
);
CREATE TABLE donnees_indicateurs (
id SERIAL PRIMARY KEY,
indicateur_id INTEGER NOT NULL REFERENCES indicateurs(id),
valeur NUMERIC NOT NULL,
date DATE NOT NULL
);
CREATE TABLE filtres (
id SERIAL PRIMARY KEY,
nom VARCHAR(255) NOT NULL
);
CREATE TABLE utilisateurs_filtres (
id SERIAL PRIMARY KEY,
utilisateur_id INTEGER NOT NULL REFERENCES utilisateurs(id),
filtre_id INTEGER NOT NULL REFERENCES filtres(id)
);
```
**Création d'index**
```sql
CREATE INDEX idx_utilisateurs_email ON utilisateurs (email);
CREATE INDEX idx_departements_nom ON departements (nom);
CREATE INDEX idx_sous_departements_nom ON sous_departements (nom);
CREATE INDEX idx_projets_nom ON projets (nom);
CREATE INDEX idx_indicateurs_nom ON indicateurs (nom);
CREATE INDEX idx_donnees_indicateurs_date ON donnees_indicateurs (date);
CREATE INDEX idx_filtres_nom ON filtres (nom);
CREATE INDEX idx_utilisateurs_filtres_utilisateur_id ON utilisateurs_filtres (utilisateur_id);
CREATE INDEX idx_utilisateurs_filtres_filtre_id ON utilisateurs_filtres (filtre_id);
```
**Insertion de données de démo**
```sql
INSERT INTO utilisateurs (nom, prenom, email, mot_de_passe)
VALUES
('Dupont', 'Jean', 'jean.dupont@example.com', 'mot_de_passe_123'),
('Durand', 'Pierre', 'pierre.durand@example.com', 'mot_de_passe_456');
INSERT INTO departements (nom)
VALUES
('Département 1'),
('Département 2');
INSERT INTO sous_departements (nom, departement_id)
VALUES
('Sous-département 1', 1),
('Sous-département 2', 1),
('Sous-département 3', 2);
INSERT INTO projets (nom, sous_departement_id)
VALUES
('Projet 1', 1),
('Projet 2', 1),
('Projet 3', 2);
INSERT INTO indicateurs (nom, projet_id)
VALUES
('Indicateur 1', 1),
('Indicateur 2', 1),
('Indicateur 3', 2);
INSERT INTO donnees_indicateurs (indicateur_id, valeur, date)
VALUES
(1, 10, '2020-01-01'),
(1, 15, '2020-02-01'),
(2, 20, '2020-01-01'),
(3, 30, '2020-01-01'),
(1, 18, '2020-03-01'),
(2, 25, '2020-03-01'),
(3, 35, '2020-03-01'),
(1, 12, '2020-04-01'),
(2, 22, '2020-04-01'),
(3, 32, '2020-04-01');
INSERT INTO filtres (nom)
VALUES
('Filtre 1'),
('Filtre 2');
INSERT INTO utilisateurs_filtres (utilisateur_id, filtre_id)
VALUES
(1, 1),
(2, 2);
```
**Création d'un dashboard**
```html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard Analytique</title>
<link rel="stylesheet" href="bootstrap.min.css">
</head>
<body>
<div class="container">
<h1>Dashboard Analytique</h1>
<ul class="nav nav-tabs">
<li class="nav-item">
<a class="nav-link active" href="#kpi" data-toggle="tab">KPIs</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#charts" data-toggle="tab">Graphiques</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#filtrage" data-toggle="tab">Filtrage</a>
</li>
</ul>
<div class="tab-content py-3">
<div class="tab-pane fade show active" id="kpi">
<ul>
<li>Indicateur 1: <span id="indicateur-1"></span></li>
<li>Indicateur 2: <span id="indicateur-2"></span></li>
<li>Indicateur 3: <span id="indicateur-3"></span></li>
</ul>
<script>
fetch('/api/indicateurs')
.then(response => response.json())
.then(data => {
console.log(data);
let indicateur1 = document.getElementById('indicateur-1');
let indicateur2 = document.getElementById('indicateur-2');
let indicateur3 = document.getElementById('indicateur-3');
indicateur1.textContent = data[0].valeur;
indicateur2.textContent = data[1].valeur;
indicateur3.textContent = data[2].valeur;
});
</script>
</div>
<div class="tab-pane fade" id="charts">
<canvas id="myChart"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
fetch('/api/indicateurs')
.then(response => response.json())
.then(data => {
let ctx = document.getElementById('myChart').getContext('2d');
let chart = new

View File

@@ -1,10 +1,6 @@
# SaaS Projet
Description du projet SaaS.
## Installation
1. Cloner le repository.
2. Exécuter `npm install` pour installer les dépendances.
3. Lancer le serveur avec `npm start`.
## Contribution
Pour contribuer, veuillez contacter [Yacine Mahboub](mailto:yacine.mahboub@weval.com).
graph TD
A[Dashboard] --> B[frontend/dashboard.html]
A --> C[backend/api.js]
A --> D[config/db.json]
A --> E[components/chart.js]
A --> F[utils/auth.js]

View File

@@ -3,21 +3,16 @@
<html lang="fr">
<head>
<meta charset="UTF-8" />
<title>WEVIA Dashboard</title>
<title>WEVAL Dashboard</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link href="/static/style.css" rel="stylesheet" />
<link href="/static/css/style.css" rel="stylesheet" />
</head>
<body>
<div class="container">
<header><h1>Dashboard WEVAL</h1></header>
<div class="grid">
<div><canvas id="chart-traffic"></canvas></div>
<div><canvas id="chart-users"></canvas></div>
<div><pre id="logs"></pre></div>
<div><button onclick="refresh()">Rafraîchir</button></div>
</div>
<div id="chart-container"><canvas id="mainChart"></canvas></div>
<div id="metrics"></div>
<script type="module" src="/components/chart.js"></script>
</div>
<script type="module" src="/components/chart.js"></script>
<script>const refresh = () => location.reload();</script>
</body>
</html>

View File

@@ -1,97 +1,24 @@
// dashboard.js
const ctx = document.getElementById('performanceChart').getContext('2d');
// backend/api.js
import express from 'express';
import fs from 'fs/promises';
import path from 'path';
const performanceChart = new Chart(ctx, {
type: 'line',
data: {
labels: ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00'],
datasets: [{
label: 'Requêtes/min',
data: [120, 190, 300, 500, 420, 380],
borderColor: '#00ff88',
backgroundColor: 'rgba(0, 255, 136, 0.1)',
tension: 0.4
}, {
label: 'Latence (ms)',
data: [45, 52, 38, 41, 35, 40],
borderColor: '#ff4444',
backgroundColor: 'rgba(255, 68, 68, 0.1)',
tension: 0.4
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
labels: {
color: '#ffffff'
}
}
},
scales: {
x: {
grid: {
color: '#333'
},
ticks: {
color: '#888'
}
},
y: {
grid: {
color: '#333'
},
ticks: {
color: '#888'
}
}
}
}
const app = express();
const PORT = 3000;
const DATA_FILE = path.join(process.cwd(), 'data/metrics.json');
app.use(express.static('frontend'));
app.use(express.json());
app.get('/api/metrics', async (_, res) => {
try {
const data = await fs.readFile(DATA_FILE, 'utf-8');
res.json(JSON.parse(data));
} catch (err) {
res.status(500).json({ error: 'Failed to read metrics' });
}
});
// Mise à jour de l'horodatage
function updateTimestamp() {
const now = new Date();
document.getElementById('timestamp').textContent =
now.toLocaleString('fr-FR', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
}
// Simulation de logs
const logMessages = [
{ type: 'info', message: 'S204 - Backup quotidien terminé' },
{ type: 'info', message: 'S95 - Email service OK' },
{ type: 'error', message: 'S151 - Timeout sur requête API' },
{ type: 'info', message: 'Blade - Mise à jour Windows complétée' }
];
function addLog(message, type = 'info') {
const logsContainer = document.getElementById('logs');
const logEntry = document.createElement('div');
logEntry.className = `log-entry ${type}`;
const timestamp = new Date().toLocaleTimeString('fr-FR');
logEntry.innerHTML = `<span class="timestamp">${timestamp}</span>${message}`;
logsContainer.insertBefore(logEntry, logsContainer.firstChild);
// Garder seulement les 10 derniers logs
while (logsContainer.children.length > 10) {
logsContainer.removeChild(logsContainer.lastChild);
}
}
// Initialisation
updateTimestamp();
setInterval(updateTimestamp, 1000);
// Ajouter des logs toutes les 5 secondes
setInterval(() => {
const randomLog = logMessages[Math.floor(Math.random() * logMessages.length)];
addLog(randomLog.message, randomLog.type);
}, 5000);
// Ajouter un log initial
addLog('WEVIA Dashboard démarré', 'info');
app.listen(PORT, () => {
console.log(`🚀 Dashboard API running on http://localhost:${PORT}`);
});

View File

@@ -1,13 +1,12 @@
// config/db.json
{
"name": "wevia-dashboard",
"version": "1.0.0",
"description": "Dashboard de monitoring WEVIA",
"main": "index.html",
"scripts": {
"start": "python -m http.server 8080",
"dev": "python -m http.server 8080"
"database": {
"host": "S95",
"port": 5432,
"name": "weval_dashboard",
"user": "wevia",
"ssl": true
},
"keywords": ["dashboard", "monitoring", "wevia"],
"author": "WEVAL Consulting",
"license": "MIT"
"refresh_interval_ms": 30000,
"enable_caching": true
}

View File

@@ -1,15 +1,40 @@
const express = require('express');
const router = express.Router();
const passport = require('passport');
// components/chart.js
const ctx = document.getElementById('mainChart').getContext('2d');
let chart;
// Route pour la connexion
router.post('/login', passport.authenticate('local'), (req, res) => {
res.send({ message: 'Connecté avec succès' });
});
export async function updateChart() {
const res = await fetch('/api/metrics');
const data = await res.json();
// Route pour l'inscription
router.post('/register', (req, res) => {
// Logique d'inscription
});
if (chart) chart.destroy();
module.exports = router;
chart = new Chart(ctx, {
type: 'line',
data: {
labels: data.timeline,
datasets: [
{
label: 'Utilisation CPU',
data: data.cpu,
borderColor: '#FF6B6B',
tension: 0.1
},
{
label: 'Mémoire (GB)',
data: data.memory,
borderColor: '#4ECDC4',
tension: 0.1
}
]
},
options: { responsive: true, maintainAspectRatio: false }
});
document.getElementById('metrics').innerHTML = `
<p>Dernière mise à jour : ${new Date().toLocaleTimeString()}</p>
`;
}
// Rafraîchissement auto
setInterval(updateChart, 30000);
updateChart();

View File

@@ -1,12 +1,10 @@
FROM python:3.9-slim
// utils/auth.js
export function requireAuth(req, res, next) {
const token = req.headers['authorization']?.split(' ')[1];
if (!token || token !== process.env.DASHBOARD_TOKEN) {
return res.status(401).json({ error: 'Accès non autorisé' });
}
next();
}
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python", "server.py"]
export const isAdmin = (token) => token === process.env.ADMIN_TOKEN;

View File

@@ -1,7 +1,7 @@
/* static/style.css */
* { box-sizing: border-box; }
body { font-family: Arial, sans-serif; background: #f4f6f9; }
/* static/css/style.css */
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Segoe UI', sans-serif; background: #1e1e2e; color: #ffffff; }
.container { max-width: 1200px; margin: 0 auto; padding: 20px; }
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
header { grid-column: 1 / -1; text-align: center; }
#logs { background: #1e1e1e; color: #00ff00; padding: 10px; height: 200px; overflow: auto; }
header { text-align: center; margin-bottom: 20px; }
#chart-container { height: 400px; margin-bottom: 20px; }
#metrics { text-align: right; font-size: 14px; color: #aaa; }