This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
"Run simulation",
|
||||
"CEO insights"
|
||||
],
|
||||
"timestamp": "2026-04-12 21:05:01"
|
||||
"timestamp": "2026-04-12 21:10:02"
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-12 23:05:05",
|
||||
"timestamp": "2026-04-12 23:10:10",
|
||||
"healthy": true,
|
||||
"issues": [],
|
||||
"fixes": [],
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"ts":"23:08","status":"offline"}
|
||||
{"ts":"23:12","status":"offline"}
|
||||
|
||||
69
api/wevia-dynamic-resolver.php
Normal file
69
api/wevia-dynamic-resolver.php
Normal 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'],
|
||||
];
|
||||
}
|
||||
@@ -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}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
{"ts": "23:05", "status": "ok"}
|
||||
{"ts": "23:10", "status": "ok"}
|
||||
@@ -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"}
|
||||
]
|
||||
|
||||
8
generated/dashboard-20260412-211038/README.md
Normal file
8
generated/dashboard-20260412-211038/README.md
Normal 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
|
||||
2
generated/dashboard-20260412-211038/api.php
Normal file
2
generated/dashboard-20260412-211038/api.php
Normal 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
|
||||
1
generated/dashboard-20260412-211038/index.html
Normal file
1
generated/dashboard-20260412-211038/index.html
Normal 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,
|
||||
197
generated/dashboard-20260412-211038/schema.sql
Normal file
197
generated/dashboard-20260412-211038/schema.sql
Normal 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
|
||||
@@ -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]
|
||||
@@ -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>
|
||||
@@ -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}`);
|
||||
});
|
||||
@@ -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
|
||||
}
|
||||
@@ -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();
|
||||
@@ -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;
|
||||
@@ -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; }
|
||||
Reference in New Issue
Block a user