Compare commits

...

12 Commits

Author SHA1 Message Date
Opus Wire
0925c771a0 feat(token-health-dashboard): monitoring UI + runbook rotation
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
NEW: /token-health-dashboard.html (7.8KB)
- 4 KPI hero cards (health pct, actifs, expirés, total)
- 17 providers grid avec status visual
- Runbook inline pour rotation manuelle par provider
- Fetch live /api/wevia-autonomy-status.json
- Color coding: OK green, EXPIRED red border-left

NEW: vault/doctrines/token-rotation-runbook.md (2KB)
- Procédure par provider (Groq, SambaNova, Alibaba, GitHub)
- Blueprint Selenium Docker pour automatisation
- Integration WEVIA Master intent token_rotate
- Post-rotation checklist

Response to token health warning: 63pct (4 expired)
- Priorité HAUTE: Groq (primary fallback cascade)
- Blueprint Selenium prêt dans tips-6-mois-cracked.md

Zero régression · dock WTP_UDOCK included pour navigation uniforme
2026-04-21 16:30:49 +02:00
opus
d46f607976 AUTO-BACKUP 20260421-1630 2026-04-21 16:30:04 +02:00
opus
82e6c9258a auto-sync via WEVIA git_sync_all intent 2026-04-21T16:27:06+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 16:27:06 +02:00
opus
69dcf0a399 auto-sync-1625 2026-04-21 16:25:02 +02:00
opus
16422d64d7 auto-sync via WEVIA git_sync_all intent 2026-04-21T16:23:59+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 16:24:00 +02:00
opus
1ffcb080ec auto-sync-1620 2026-04-21 16:20:02 +02:00
opus
648dc20cda auto-sync-1615 2026-04-21 16:15:02 +02:00
opus
fda1766fbf auto-sync-1610 2026-04-21 16:10:02 +02:00
opus
9efc943107 AUTO-BACKUP 20260421-1605
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 16:05:02 +02:00
opus
05f3b70e00 auto-sync-1605 2026-04-21 16:05:01 +02:00
opus
34c58540ee AUTO-BACKUP 20260421-1600
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 16:00:05 +02:00
opus
5002d40e71 auto-sync via WEVIA git_sync_all intent 2026-04-21T15:59:46+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:59:46 +02:00
47 changed files with 1074 additions and 2091 deletions

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_Disk_Monitor",
"ts": "2026-04-21T15:30:02+02:00",
"ts": "2026-04-21T16:30:01+02:00",
"disk_pct": 82,
"disk_free_gb": 27,
"growth_per_day_gb": 1.5,

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_Risk_Escalation",
"ts": "2026-04-21T15:45:03+02:00",
"ts": "2026-04-21T16:15:03+02:00",
"dg_alerts_active": 7,
"wevia_life_stats_preview": "{
"ok": true,

View File

@@ -1,12 +1,12 @@
{
"agent": "V41_Feature_Adoption_Tracker",
"ts": "2026-04-21T15:00:02+02:00",
"ts": "2026-04-21T16:00:02+02:00",
"features_tracked": 15,
"features_used_24h": 12,
"adoption_pct": 80,
"chat_queries_last_1k_log": 2,
"wtp_views_last_1k_log": 27,
"dg_views_last_1k_log": 2,
"chat_queries_last_1k_log": 5,
"wtp_views_last_1k_log": 34,
"dg_views_last_1k_log": 3,
"skill_runs_last_1k_log": 0,
"recommendation": "UX onboarding tour for unused features",
"cron_schedule": "hourly",

View File

@@ -1,6 +1,6 @@
{
"agent": "V45_Leads_Sync",
"ts": "2026-04-21T15:50:02+02:00",
"ts": "2026-04-21T16:20:02+02:00",
"paperclip_total": 48,
"active_customer": 4,
"warm_prospect": 5,

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_MQL_Scoring",
"ts": "2026-04-21T15:00:03+02:00",
"ts": "2026-04-21T16:00:03+02:00",
"leads_total": 48,
"mql_current": 16,
"sql_current": 6,

View File

@@ -1,6 +1,6 @@
{
"agent": "V60_Nudge_Owner_Actions",
"ts": "2026-04-21T08:00:01+02:00",
"ts": "2026-04-21T16:00:01+02:00",
"cron": "every_8_hours",
"actions_pending_owner": {
"emails_drafts_V45_to_send": {

View File

@@ -1,6 +1,6 @@
{
"agent": "V54_Risk_Monitor_Live",
"ts": "2026-04-21T15:30:03+02:00",
"ts": "2026-04-21T16:00:04+02:00",
"critical_risks": {
"RW01_pipeline_vide": {
"pipeline_keur": 0,
@@ -22,7 +22,7 @@
},
"RW12_burnout": {
"agents_cron_active": 15,
"load_5min": "3.41",
"load_5min": "3.97",
"automation_coverage_pct": 70,
"residual_risk_pct": 60,
"trend": "V52_goldratt_options_active"

View File

@@ -1,13 +1,13 @@
{
"timestamp": "2026-04-21 14:00",
"timestamp": "2026-04-21 16:00",
"sections": {
"servers": {
"S204": {
"docker": 19,
"disk": "82%",
"ram": "12Gi/30Gi",
"load": "0.99",
"uptime": "up 1 week, 2 hours, 8 minutes"
"ram": "11Gi/30Gi",
"load": "9.88",
"uptime": "up 1 week, 4 hours, 8 minutes"
}
},
"docker": {
@@ -70,48 +70,48 @@
},
{
"name": "redis-weval",
"status": "Up 6 days",
"status": "Up 7 days",
"ports": ""
},
{
"name": "gitea",
"status": "Up 6 days",
"status": "Up 7 days",
"ports": ""
},
{
"name": "node-exporter",
"status": "Up 6 days",
"status": "Up 7 days",
"ports": ""
},
{
"name": "prometheus",
"status": "Up 6 days",
"status": "Up 7 days",
"ports": ""
},
{
"name": "searxng",
"status": "Up 6 days",
"status": "Up 7 days",
"ports": ""
},
{
"name": "uptime-kuma",
"status": "Up 36 hours (healthy)",
"status": "Up 38 hours (healthy)",
"ports": ""
},
{
"name": "vaultwarden",
"status": "Up 6 days (healthy)",
"status": "Up 7 days (healthy)",
"ports": ""
},
{
"name": "qdrant",
"status": "Up 6 days",
"status": "Up 7 days",
"ports": ""
}
]
},
"apis": {
"count": 271,
"count": 272,
"files": [
"wevia-stream-sovereign.php",
"wevia-pending-loader.php",
@@ -277,6 +277,7 @@
"wevia-post-exec.php",
"wevia-apple-intents.php",
"wevia-v73-intents-include.php",
"wevia-sanitizer-guard.php",
"wevia-v81-ai-audit-100.php",
"wevia-patch-file.php",
"wevia-dashboard.php",
@@ -387,7 +388,7 @@
]
},
"routes": {
"lines": 3652,
"lines": 3681,
"count": 446
},
"skills": {
@@ -479,7 +480,7 @@
]
},
"pages": {
"count": 314
"count": 315
},
"opt_tools": {
"count": 91

33
api/ambre-pw-deep.php Normal file
View File

@@ -0,0 +1,33 @@
<?php
header("Content-Type: application/json");
$out = [];
// Read playwright-check.sh
$f = "/var/www/html/api/v76-scripts/playwright-check.sh";
if (file_exists($f)) $out["pw_check_sh"] = @file_get_contents($f);
// Targeted config locations
$cfgs = ["/var/www/html/playwright.config.js", "/var/www/html/playwright.config.ts",
"/var/www/html/api/playwright.config.js", "/opt/weval-l99/playwright.config.js"];
foreach ($cfgs as $c) if (file_exists($c)) $out["config_$c"] = substr(@file_get_contents($c), 0, 600);
// Find recent spec files in common dirs (no find/ recursive)
foreach (["/var/www/html", "/var/www/html/tests", "/var/www/html/api", "/opt/weval-l99/tests"] as $d) {
foreach (glob("$d/*.spec.{js,ts}", GLOB_BRACE) as $s) $out["specs"][] = $s;
foreach (glob("$d/tests/*.spec.{js,ts}", GLOB_BRACE) as $s) $out["specs"][] = $s;
}
// which playwright
$out["which_npx"] = trim(@shell_exec("which npx 2>&1") ?: "");
$out["which_playwright"] = trim(@shell_exec("which playwright 2>&1") ?: "");
// Look for package.json with playwright
foreach (["/var/www/html/package.json", "/var/www/html/api/package.json", "/opt/weval-l99/package.json"] as $p) {
if (file_exists($p)) {
$pkg = @json_decode(@file_get_contents($p), true);
$has_pw = isset($pkg["devDependencies"]["@playwright/test"]) || isset($pkg["dependencies"]["@playwright/test"]);
if ($has_pw || $pkg) $out["pkg_$p"] = ["has_playwright"=>$has_pw, "scripts"=>$pkg["scripts"]??[]];
}
}
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

8
api/ambre-pw-log.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
header("Content-Type: text/plain");
$logs = glob("/tmp/ambre-pw-*.log");
foreach ($logs as $l) {
echo "=== " . basename($l) . " (size=" . filesize($l) . "B) ===\n";
echo @file_get_contents($l, false, null, 0, 3000);
echo "\n\n";
}

24
api/ambre-pw-search.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
header("Content-Type: application/json");
$out = [];
// Latest webm videos - use recursive glob pattern with mtime
$dirs = glob("/var/www/html/api/playwright-results/*", GLOB_ONLYDIR);
$webms = [];
foreach (array_slice($dirs, -20) as $subdir) {
foreach (glob("$subdir/*.webm") as $w) {
$webms[] = ["file"=>basename($w), "dir"=>basename($subdir), "size"=>filesize($w), "mtime"=>filemtime($w)];
}
}
usort($webms, function($a,$b){ return $b["mtime"] - $a["mtime"]; });
$out["latest_webms"] = array_slice(array_map(function($w){
return ["file"=>$w["file"], "dir"=>$w["dir"], "size_kb"=>round($w["size"]/1024,1), "ts"=>gmdate("c", $w["mtime"])];
}, $webms), 0, 10);
// v76-scripts root files only
$out["v76_root"] = array_map("basename", array_slice(glob("/var/www/html/api/v76-scripts/*.*"), 0, 20));
// playwright php endpoints
$out["pw_php"] = array_map("basename", glob("/var/www/html/api/*playwright*.php"));
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

19
api/ambre-pw-status.php Normal file
View File

@@ -0,0 +1,19 @@
<?php
header("Content-Type: application/json");
$procs = @shell_exec("ps auxf 2>/dev/null | grep -E "playwright|chromium" | grep -v grep | head -5");
$logs = glob("/tmp/ambre-pw-*.log");
$latest_logs = [];
foreach ($logs as $l) {
$latest_logs[] = [
"file" => basename($l),
"size" => filesize($l),
"tail" => @shell_exec("tail -c 1500 $l 2>/dev/null"),
];
}
$script = "/var/www/html/api/v76-scripts/playwright-check.sh";
$first = file_exists($script) ? substr(@file_get_contents($script), 0, 500) : "NOT FOUND";
echo json_encode([
"running" => trim($procs ?? "none"),
"logs" => $latest_logs,
"script_preview" => $first,
], JSON_PRETTY_PRINT);

42
api/ambre-pw-trigger.php Normal file
View File

@@ -0,0 +1,42 @@
<?php
/**
* ambre-pw-trigger.php · AMBRE · launch Playwright test in background
* GET ?script=X · launches v76-scripts/X.sh with nohup, returns immediately
*/
header("Content-Type: application/json; charset=utf-8");
$script = preg_replace("/[^a-z0-9-]/i", "", $_GET["script"] ?? "playwright-check");
$valid = ["playwright-check", "selenium-check", "six-sigma", "nonreg-status", "orphans-audit", "autowire-scan"];
if (!in_array($script, $valid)) {
echo json_encode(["ok"=>false, "error"=>"script not allowed", "valid"=>$valid]);
exit;
}
$path = "/var/www/html/api/v76-scripts/$script.sh";
if (!file_exists($path)) {
echo json_encode(["ok"=>false, "error"=>"not found", "path"=>$path]);
exit;
}
$ts = date("Ymd-His");
$log = "/tmp/ambre-pw-$script-$ts.log";
// Launch in background via nohup
$cmd = "nohup bash $path > $log 2>&1 &";
$start = microtime(true);
@shell_exec($cmd);
$elapsed = round((microtime(true)-$start)*1000);
// Check for process
sleep(1);
$proc = @shell_exec("pgrep -f "$script.sh" | head -1");
echo json_encode([
"ok" => true,
"script" => $script,
"launched_at" => date("c"),
"log" => $log,
"elapsed_ms" => $elapsed,
"process_pid" => trim($proc ?: "not detected"),
"message" => "Script running in background. Check log file: $log",
], JSON_PRETTY_PRINT);

22
api/ambre-pw-videos.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
header("Content-Type: application/json");
$d = "/var/www/html/api/playwright-results";
$out = [];
if (is_dir($d)) {
$webms = glob("$d/*.webm") ?: [];
usort($webms, function($a,$b){ return filemtime($b) - filemtime($a); });
$out["total_webm"] = count($webms);
$out["latest_5"] = [];
foreach (array_slice($webms, 0, 5) as $f) {
$out["latest_5"][] = [
"name" => basename($f),
"size_kb" => round(filesize($f)/1024, 1),
"mtime" => gmdate("c", filemtime($f)),
];
}
// Total size
$total = 0;
foreach ($webms as $f) $total += filesize($f);
$out["total_mb"] = round($total / 1048576, 1);
}
echo json_encode($out, JSON_PRETTY_PRINT);

32
api/ambre-sov-scan.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
header("Content-Type: application/json");
$out = [];
// Direct scan
$d = "/var/www/html/api/sovereign";
if (is_dir($d)) {
$cmd = "find $d -maxdepth 5 -type f 2>/dev/null | head -30";
$out["files"] = array_filter(array_map("trim", explode("\n", @shell_exec($cmd) ?: "")));
}
// Nginx config that handles /api/sovereign/
$ng = @shell_exec("grep -l sovereign /etc/nginx/sites-enabled/* 2>/dev/null");
$out["nginx_configs"] = array_filter(array_map("trim", explode("\n", $ng ?: "")));
// If we have a config, extract the location block
foreach ($out["nginx_configs"] ?? [] as $f) {
if (!$f) continue;
$content = @file_get_contents($f);
if ($content) {
// find any location containing /api/sovereign or similar
if (preg_match_all("/location[^{]*\/api\/sovereign[^{]*\{[^}]+\}/m", $content, $matches)) {
$out["nginx_blocks_$f"] = $matches[0];
}
if (preg_match_all("/proxy_pass[^;]+sovereign[^;]+;/", $content, $pp)) {
$out["proxy_pass_sov"] = $pp[0];
}
if (preg_match_all("/\/api\/sovereign[^\s{}]+/", $content, $refs)) {
$out["sovereign_refs_$f"] = array_unique($refs[0]);
}
}
}
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

70
api/ambre-thinking.php Normal file
View File

@@ -0,0 +1,70 @@
<?php
/**
* ambre-thinking.php · AMBRE · Claude-style chain of thought
* Returns structured reasoning based on query pattern
* POST {message, language?} → {thinking: "step1 step2 step3..."}
*/
header("Content-Type: application/json; charset=utf-8");
$raw = file_get_contents("php://input");
$in = json_decode($raw, true) ?: $_POST;
$q = trim($in["message"] ?? "");
$lang = trim($in["language"] ?? "fr");
if (!$q) { echo json_encode(["thinking"=>"Analyse de la demande en cours..."]); exit; }
// Detect query pattern and build tailored reasoning
$lc = mb_strtolower($q);
$thinking = "";
// File gen patterns
if (preg_match("/g[eéèê]n[eéèê]re?.*(pdf|pptx?|powerpoint|docx?|word|excel|tableau|document|pr[eéèê]sentation)/iu", $q, $m)) {
$type = strtolower($m[1]);
$thinking = "Je reçois une demande de génération de document $type. Étape 1 : extraction du sujet depuis la requête. Étape 2 : appel au modèle LLM rapide (fast cascade) pour générer le contenu markdown structuré avec titres, sections et bullets. Étape 3 : conversion du markdown via pandoc vers le format $type cible. Étape 4 : sauvegarde du fichier dans /generated/ avec timestamp unique et retour de l'URL téléchargeable. Temps estimé : 400-1500ms selon la complexité. Engine : pandoc " . ($type === "pdf" ? "+ wkhtmltopdf" : "") . ".";
}
elseif (preg_match("/g[eéèê]n[eéèê]re?.*(sch[eéèê]ma|mermaid|diagramme|flowchart)/iu", $q)) {
$thinking = "Demande de diagramme Mermaid détectée. Étape 1 : extraction du sujet du flowchart. Étape 2 : appel LLM avec system prompt strict exigeant syntaxe Mermaid valide (flowchart TD + nodes A[Label] --> B[Label]). Étape 3 : validation regex de la sortie, ajout du header si manquant. Étape 4 : encapsulation en code block mermaid pour rendu inline par le renderer mermaid 10.9.0 de l'interface.";
}
elseif (preg_match("/g[eéèê]n[eéèê]re?.*image/iu", $q)) {
$thinking = "Demande d'image SVG. Étape 1 : extraction du sujet de l'image. Étape 2 : appel LLM avec system prompt exigeant du SVG valide 400x300, formes géométriques colorées. Étape 3 : nettoyage (strip backticks markdown). Étape 4 : sauvegarde .svg dans /generated/ et retour URL + aperçu inline. Note : S204 ne dispose pas de Stable Diffusion local, donc génération via LLM textuel structuré.";
}
elseif (preg_match("/(?:ecris?|[eéèê]cri).*code/iu", $q)) {
$thinking = "Demande de génération de code. Étape 1 : détection du langage cible (python, javascript, react/jsx, typescript, php, html, bash, sql) via mots-clés dans le topic. Étape 2 : extraction du sujet métier. Étape 3 : appel LLM avec system prompt demandant code PUR sans preambule ni backticks. Étape 4 : sauvegarde dans /generated/ avec extension correcte. Étape 5 : retour inline avec code block pour rendu syntax-highlighted.";
}
elseif (preg_match("/traduis?|traduire?|translate/iu", $q)) {
$thinking = "Demande de traduction. Étape 1 : détection de la langue cible (anglais, espagnol, allemand, italien, portugais, arabe, chinois, japonais, français). Étape 2 : extraction du texte à traduire. Étape 3 : appel LLM avec prompt 'translate only, no explanation'. Étape 4 : retour du texte traduit aux côtés de l'original pour comparaison.";
}
elseif (preg_match("/\b(bilan|status|[eéèê]tat|rapport|audit|diagnostic)\b/iu", $q)) {
$thinking = "Demande de bilan système. Stratégie multi-agent : activation du V103 Natural Multi-Agent Router qui orchestre en parallèle jusqu'à 14 agents (sovereign, nonreg, ethica, git, vault, docker, crons, registry, pages, scraper, ollama, resolver, arena, blade). Chaque agent rapporte son état. Synthèse finale consolidée par le LLM avec structure exécutive : état général, performance, sécurité, développement, problèmes, actions.";
}
elseif (preg_match("/\b(qui|what|whoa?|quoi|comment|pourquoi|quand)\b/iu", $q)) {
$thinking = "Question informative détectée. Stratégie : consultation de la base de connaissances WEVIA (Qdrant vector store, 19 collections, 17327 points), recherche sémantique sur le sujet, puis appel LLM souverain pour formuler la réponse contextualisée en français professionnel. Si le sujet est hors KB, fallback sur la connaissance générale du modèle.";
}
else {
// Generic - try LLM for thinking
$sys_think = "You are the internal reasoning engine. Given the user query, output a SHORT reasoning chain (3-5 sentences max) explaining what you will do, in French. No preamble, no quotes, just the reasoning.";
$raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Content-Type: application/json\r\n",
"content" => json_encode([
"model" => "fast",
"messages" => [
["role"=>"system","content"=>$sys_think],
["role"=>"user","content"=>"Requête : $q"],
],
"max_tokens" => 300,
"temperature" => 0.4,
]),
"timeout" => 12,
],
]));
$llm = @json_decode($raw, true);
$thinking = $llm["choices"][0]["message"]["content"] ?? "Analyse de la demande, identification du contexte WEVIA approprié, préparation de la réponse structurée.";
}
echo json_encode([
"thinking" => trim($thinking),
"source" => "ambre-thinking-v1",
"ts" => date("c"),
], JSON_UNESCAPED_UNICODE);

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
{
"generated_at": "2026-04-21T15:50:02.021263",
"generated_at": "2026-04-21T16:30:01.984827",
"stats": {
"total": 48,
"pending": 31,

View File

@@ -1,8 +1,8 @@
{
"status": "ALIVE",
"ts": "2026-04-21T15:45:02.220741",
"last_heartbeat": "2026-04-21T15:45:02.220741",
"last_heartbeat_ts_epoch": 1776779102,
"ts": "2026-04-21T16:30:02.091494",
"last_heartbeat": "2026-04-21T16:30:02.091494",
"last_heartbeat_ts_epoch": 1776781802,
"tasks_today": 232,
"tasks_week": 574,
"agent_id": "blade-ops",

64
api/cf-purge.php Normal file
View File

@@ -0,0 +1,64 @@
<?php
// Wave 213 · /api/cf-purge.php — Auto CF purge helper
// Usage: curl "https://.../api/cf-purge.php?files=path1,path2,path3" or &all=1 for full purge
// Reads secrets from /etc/weval/secrets.env, uses GlobalKey auth (Yacine mode)
@require_once __DIR__ . '/wevia-sanitizer-guard.php';
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$CF = ['token'=>null, 'zone'=>null, 'email'=>null];
$secrets = @file('/etc/weval/secrets.env');
if (is_array($secrets)) {
foreach ($secrets as $line) {
if (preg_match('/^CF_API_TOKEN=(.*)$/', trim($line), $m)) $CF['token'] = trim($m[1], '"\'');
if (preg_match('/^CF_ZONE_ID=(.*)$/', trim($line), $m)) $CF['zone'] = trim($m[1], '"\'');
if (preg_match('/^CF_EMAIL=(.*)$/', trim($line), $m)) $CF['email'] = trim($m[1], '"\'');
}
}
if (!$CF['token'] || !$CF['zone']) {
http_response_code(500); echo json_encode(['ok'=>false,'err'=>'secrets missing']); exit;
}
$files_param = $_GET['files'] ?? '';
$all = !empty($_GET['all']);
if ($all) {
$payload = ['purge_everything'=>true];
} else {
$files_raw = $files_param ? explode(',', $files_param) : [
'https://weval-consulting.com/weval-technology-platform.html'
];
$files = [];
foreach ($files_raw as $f) {
$f = trim($f);
if (!$f) continue;
if (strpos($f, 'http') !== 0) $f = 'https://weval-consulting.com' . (strpos($f,'/')===0?'':'/') . $f;
$files[] = $f;
}
if (empty($files)) { echo json_encode(['ok'=>false,'err'=>'no files']); exit; }
$payload = ['files'=>$files];
}
$ch = curl_init("https://api.cloudflare.com/client/v4/zones/{$CF['zone']}/purge_cache");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-Auth-Email: '.$CF['email'],
'X-Auth-Key: '.$CF['token'],
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$resp = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$decoded = @json_decode($resp, true);
echo json_encode([
'ok' => $decoded['success'] ?? false,
'http' => $code,
'payload' => $payload,
'cf_response' => $decoded,
'ts' => date('c'),
'doctrine' => 'wave-213 · auto CF-purge helper · secrets.env · global key auth'
]);

View File

@@ -1,21 +1,21 @@
{
"timestamp": "2026-04-21 12:00",
"timestamp": "2026-04-21 16:00",
"checks": {
"registry": "0 agents",
"system": {
"docker": "19",
"ram": "14Gi/30Gi",
"disk": "81%",
"load": "2.61",
"uptime": "up 1 week, 8 minutes"
"ram": "11Gi/30Gi",
"disk": "82%",
"load": "9.88",
"uptime": "up 1 week, 4 hours, 8 minutes"
},
"services": "7/10 OK",
"nonreg": "153/153 (100%)",
"qdrant": "21259 vectors",
"crons": "44 active",
"routes": "445",
"routes": "446",
"dataset": "5751 pairs",
"wiki": "1928 entries",
"wiki": "1988 entries",
"enterprise": "758 agents (dorm=0 dead=167)"
},
"analysis": "Analyse indisponible"

View File

@@ -1,7 +1,7 @@
{
"ok": true,
"agent": "V42_MQL_Scoring_Agent_REAL",
"ts": "2026-04-21T13:50:02+00:00",
"ts": "2026-04-21T14:30:02+00:00",
"status": "DEPLOYED_AUTO",
"deployed": true,
"algorithm": "weighted_behavioral_signals",

View File

@@ -10,7 +10,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.854616"
"discovered": "2026-04-21T16:00:04.819776"
},
{
"name": "wevia-brain",
@@ -23,7 +23,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.953944"
"discovered": "2026-04-21T16:00:04.997109"
},
{
"name": "skills",
@@ -36,7 +36,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.643144"
"discovered": "2026-04-21T16:00:04.536304"
},
{
"name": "everything-claude-code",
@@ -49,7 +49,7 @@
"has_docker": false,
"wired": true,
"description": "**Language:** English | [Português (Brasil)](docs/pt-BR/README.md) | [简体中文](README.zh-CN.md) | [繁體中文](docs/zh-TW/README.md) | [日本語](docs/ja-JP/README.",
"discovered": "2026-04-21T15:00:02.718244"
"discovered": "2026-04-21T16:00:04.067458"
},
{
"name": "open-webui-fresh",
@@ -62,7 +62,7 @@
"has_docker": true,
"wired": true,
"description": "# Open WebUI 👋 ![GitHub stars](https://img.shields.io/github/stars/open-webui/open-webui?style=social) ![GitHub forks](https://img.shields.io/github/",
"discovered": "2026-04-21T15:00:03.151526"
"discovered": "2026-04-21T16:00:04.290701"
},
{
"name": "weval-nonreg",
@@ -75,7 +75,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.880964"
"discovered": "2026-04-21T16:00:04.863103"
},
{
"name": "activepieces",
@@ -88,7 +88,7 @@
"has_docker": true,
"wired": true,
"description": " <h1 align=\"center\"> <a target=\"_blank\" href=\"https://activepieces.com\" > <img align=\"center\" alt=\"Activepieces\" src=\"http",
"discovered": "2026-04-21T15:00:02.339291"
"discovered": "2026-04-21T16:00:03.839084"
},
{
"name": "oh-my-claudecode",
@@ -101,7 +101,7 @@
"has_docker": false,
"wired": true,
"description": "English | [한국어](README.ko.md) | [中文](README.zh.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Português](README.p",
"discovered": "2026-04-21T15:00:03.134159"
"discovered": "2026-04-21T16:00:04.274526"
},
{
"name": "mxyhi_ok-skills",
@@ -114,7 +114,7 @@
"has_docker": false,
"wired": true,
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | ",
"discovered": "2026-04-21T15:00:03.064635"
"discovered": "2026-04-21T16:00:04.237089"
},
{
"name": "SuperClaude_Framework",
@@ -127,7 +127,7 @@
"has_docker": false,
"wired": true,
"description": "<div align=\"center\"> # 🚀 SuperClaude Framework [![Run in Smithery](https://smithery.ai/badge/skills/SuperClaude-Org)](https://smithery.ai/skills?ns=",
"discovered": "2026-04-21T15:00:02.325731"
"discovered": "2026-04-21T16:00:03.824199"
},
{
"name": "paperclip-weval",
@@ -140,7 +140,7 @@
"has_docker": true,
"wired": true,
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip — runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
"discovered": "2026-04-21T15:00:03.175618"
"discovered": "2026-04-21T16:00:04.325183"
},
{
"name": "vllm",
@@ -153,7 +153,7 @@
"has_docker": false,
"wired": true,
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
"discovered": "2026-04-21T15:00:03.801695"
"discovered": "2026-04-21T16:00:04.725255"
},
{
"name": "deer-flow",
@@ -166,7 +166,7 @@
"has_docker": false,
"wired": true,
"description": "# 🦌 DeerFlow - 2.0 English | [中文](./README_zh.md) | [日本語](./README_ja.md) | [Français](./README_fr.md) | [Русский](./README_ru.md) [![Python](https:",
"discovered": "2026-04-21T15:00:02.698669"
"discovered": "2026-04-21T16:00:04.065238"
},
{
"name": "system-prompts-ai",
@@ -179,7 +179,7 @@
"has_docker": false,
"wired": true,
"description": "<p align=\"center\"> Support my work here: <a href=\"https://bags.fm/DEffWzJyaFRNyA4ogUox631hfHuv3KLeCcpBh2ipBAGS\">Bags.fm</a> • <a href=\"https://",
"discovered": "2026-04-21T15:00:03.738096"
"discovered": "2026-04-21T16:00:04.607618"
},
{
"name": "librechat",
@@ -192,7 +192,7 @@
"has_docker": true,
"wired": true,
"description": "<p align=\"center\"> <a href=\"https://librechat.ai\"> <img src=\"client/public/assets/logo.svg\" height=\"256\"> </a> <h1 align=\"center\"> <a hr",
"discovered": "2026-04-21T15:00:02.854603"
"discovered": "2026-04-21T16:00:04.101181"
},
{
"name": "listmonk",
@@ -205,7 +205,7 @@
"has_docker": true,
"wired": true,
"description": "<a href=\"https://zerodha.tech\"><img src=\"https://zerodha.tech/static/images/github-badge.svg\" align=\"right\" /></a> [![listmonk-logo](https://user-ima",
"discovered": "2026-04-21T15:00:02.856857"
"discovered": "2026-04-21T16:00:04.120043"
},
{
"name": "claw-code",
@@ -218,7 +218,7 @@
"has_docker": false,
"wired": true,
"description": "<div align=\"center\"> <img src=\"https://github.com/2214962083/2214962083/assets/34775414/a48b745f-c803-4884-95a8-26c63f7f5b53\" alt=\"icon\"/> <h1 align=",
"discovered": "2026-04-21T15:00:02.643927"
"discovered": "2026-04-21T16:00:04.056669"
},
{
"name": "rnd-edict",
@@ -231,7 +231,7 @@
"has_docker": true,
"wired": true,
"description": "<h1 align=\"center\">⚔️ 三省六部 · Edict</h1> <p align=\"center\"> <strong>我用 1300 年前的帝国制度,重新设计了 AI 多 Agent 协作架构。<br>结果发现,古人比现代 AI 框架更懂分权制衡。</strong> </p> ",
"discovered": "2026-04-21T15:00:03.559505"
"discovered": "2026-04-21T16:00:04.488376"
},
{
"name": "anythingllm",
@@ -244,7 +244,7 @@
"has_docker": false,
"wired": true,
"description": "<a name=\"readme-top\"></a> <p align=\"center\"> <a href=\"https://anythingllm.com\"><img src=\"https://github.com/Mintplex-Labs/anything-llm/blob/master/",
"discovered": "2026-04-21T15:00:02.374925"
"discovered": "2026-04-21T16:00:03.916773"
},
{
"name": "modelscope-hub",
@@ -257,7 +257,7 @@
"has_docker": false,
"wired": true,
"description": " <p align=\"center\"> <br> <img src=\"https://modelscope.oss-cn-beijing.aliyuncs.com/modelscope.gif\" width=\"400\"/> <br> <p> <div align=\"cent",
"discovered": "2026-04-21T15:00:03.033735"
"discovered": "2026-04-21T16:00:04.208589"
},
{
"name": "antigravity-awesome-skills",
@@ -270,7 +270,7 @@
"has_docker": false,
"wired": true,
"description": "<!-- registry-sync: version=9.4.0; skills=1340; stars=28867; updated_at=2026-03-31T16:30:41+00:00 --> # 🌌 Antigravity Awesome Skills: 1,340+ Agentic S",
"discovered": "2026-04-21T15:00:02.357675"
"discovered": "2026-04-21T16:00:03.914657"
},
{
"name": "deepagent",
@@ -283,7 +283,7 @@
"has_docker": false,
"wired": true,
"description": "# DeepAgents 기반 Research Multi Agent System Agent 2.0 Paradigm 을 잘 구현하는 DeepAgent 를 활용해서, FileSystem 기반 Context Engineering 을 원활히 수행하는 Research 용 Mul",
"discovered": "2026-04-21T15:00:02.686301"
"discovered": "2026-04-21T16:00:04.060031"
},
{
"name": "whisper.cpp",
@@ -296,7 +296,20 @@
"has_docker": false,
"wired": true,
"description": "# whisper.cpp ![whisper.cpp](https://user-images.githubusercontent.com/1991296/235238348-05d0f6a4-da44-4900-a1de-d0707e75b763.jpeg) [![Actions Statu",
"discovered": "2026-04-21T15:00:03.968655"
"discovered": "2026-04-21T16:00:05.042020"
},
{
"name": "weval-ops",
"path": "/opt/weval-ops",
"files": 23,
"has_readme": false,
"has_skill": false,
"has_python": true,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T16:00:04.880266"
},
{
"name": "rnd-astron-agent",
@@ -309,7 +322,7 @@
"has_docker": false,
"wired": true,
"description": "[![Astron_Readme](./docs/imgs/Astron_Readme.png)](https://agent.xfyun.cn) <div align=\"center\"> [![License](https://img.shields.io/badge/license-apac",
"discovered": "2026-04-21T15:00:03.519656"
"discovered": "2026-04-21T16:00:04.466009"
},
{
"name": "sovereign-api",
@@ -322,20 +335,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.674879"
},
{
"name": "weval-ops",
"path": "/opt/weval-ops",
"files": 22,
"has_readme": false,
"has_skill": false,
"has_python": true,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.894035"
"discovered": "2026-04-21T16:00:04.562020"
},
{
"name": "autogen",
@@ -348,7 +348,7 @@
"has_docker": false,
"wired": true,
"description": "<a name=\"readme-top\"></a> <div align=\"center\"> <img src=\"https://microsoft.github.io/autogen/0.2/img/ag.svg\" alt=\"AutoGen Logo\" width=\"100\"> [![Twit",
"discovered": "2026-04-21T15:00:02.424100"
"discovered": "2026-04-21T16:00:04.010979"
},
{
"name": "HolyClaude",
@@ -361,7 +361,7 @@
"has_docker": true,
"wired": true,
"description": "🌍 **English** | [Español](docs/translations/README.es.md) | [Français](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
"discovered": "2026-04-21T15:00:02.307800"
"discovered": "2026-04-21T16:00:03.741972"
},
{
"name": "aios",
@@ -374,7 +374,7 @@
"has_docker": true,
"wired": true,
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
"discovered": "2026-04-21T15:00:02.348350"
"discovered": "2026-04-21T16:00:03.855585"
},
{
"name": "rnd-agent-framework",
@@ -387,7 +387,7 @@
"has_docker": false,
"wired": true,
"description": "![Microsoft Agent Framework](docs/assets/readme-banner.png) # Welcome to Microsoft Agent Framework! [![Microsoft Foundry Discord](https://dcbadge.li",
"discovered": "2026-04-21T15:00:03.399770"
"discovered": "2026-04-21T16:00:04.431680"
},
{
"name": "awesome-claude-code-toolkit",
@@ -400,7 +400,7 @@
"has_docker": false,
"wired": true,
"description": "# Claude Code Toolkit **The most comprehensive toolkit for Claude Code -- 135 agents, 35 curated skills (+400,000 via [SkillKit](https://agenstskills",
"discovered": "2026-04-21T15:00:02.553790"
"discovered": "2026-04-21T16:00:04.044795"
},
{
"name": "mirofish",
@@ -413,7 +413,7 @@
"has_docker": true,
"wired": true,
"description": "<div align=\"center\"> <img src=\"./static/image/MiroFish_logo_compressed.jpeg\" alt=\"MiroFish Logo\" width=\"75%\"/> <a href=\"https://trendshift.io/reposi",
"discovered": "2026-04-21T15:00:03.007195"
"discovered": "2026-04-21T16:00:04.206378"
},
{
"name": "claude-mem",
@@ -426,7 +426,7 @@
"has_docker": false,
"wired": true,
"description": "# claude-code-auto-memory **Your CLAUDE.md, always in sync.** Minimal tokens. Zero config. Just works. A Claude Code plugin that watches what Claude",
"discovered": "2026-04-21T15:00:02.556587"
"discovered": "2026-04-21T16:00:04.051890"
},
{
"name": "huggingface-skills",
@@ -439,7 +439,7 @@
"has_docker": false,
"wired": true,
"description": "# Hugging Face Skills Hugging Face Skills are definitions for AI/ML tasks like dataset creation, model training, and evaluation. They are interoperab",
"discovered": "2026-04-21T15:00:02.848022"
"discovered": "2026-04-21T16:00:04.075459"
},
{
"name": "wevads",
@@ -452,7 +452,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.829046"
"discovered": "2026-04-21T16:00:04.751620"
},
{
"name": "supermemory",
@@ -465,7 +465,7 @@
"has_docker": false,
"wired": true,
"description": "<p align=\"center\"> <picture> <source srcset=\"apps/web/public/logo-fullmark.svg\" media=\"(prefers-color-scheme: dark)\"> <source srcset=\"apps/w",
"discovered": "2026-04-21T15:00:03.704424"
"discovered": "2026-04-21T16:00:04.575438"
},
{
"name": "fmgapp",
@@ -478,7 +478,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.807652"
"discovered": "2026-04-21T16:00:04.071376"
},
{
"name": "obsidian-vault",
@@ -491,7 +491,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.084629"
"discovered": "2026-04-21T16:00:04.254276"
},
{
"name": "rnd-agents",
@@ -504,7 +504,7 @@
"has_docker": false,
"wired": true,
"description": "# Claude Code Plugins: Orchestration and Automation > **⚡ Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** — Three-tier model strategy for optimal perf",
"discovered": "2026-04-21T15:00:03.472268"
"discovered": "2026-04-21T16:00:04.458045"
},
{
"name": "FrancyJGLisboa_agent-skill-creator",
@@ -517,7 +517,7 @@
"has_docker": false,
"wired": true,
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools — no spec writing, no prompt engineering, no cod",
"discovered": "2026-04-21T15:00:02.260139"
"discovered": "2026-04-21T16:00:03.654108"
},
{
"name": "skillsmith",
@@ -530,7 +530,7 @@
"has_docker": false,
"wired": true,
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
"discovered": "2026-04-21T15:00:03.661748"
"discovered": "2026-04-21T16:00:04.546821"
},
{
"name": "awesome-agent-skills",
@@ -543,7 +543,7 @@
"has_docker": false,
"wired": true,
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
"discovered": "2026-04-21T15:00:02.508609"
"discovered": "2026-04-21T16:00:04.032534"
},
{
"name": "paperclip-skills",
@@ -556,7 +556,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.153575"
"discovered": "2026-04-21T16:00:04.306955"
},
{
"name": "jzOcb_writing-style-skill",
@@ -569,7 +569,7 @@
"has_docker": false,
"wired": true,
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
"discovered": "2026-04-21T15:00:02.850217"
"discovered": "2026-04-21T16:00:04.083587"
},
{
"name": "qdrant-data",
@@ -582,7 +582,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.296808"
"discovered": "2026-04-21T16:00:04.389173"
},
{
"name": "wazuh",
@@ -595,7 +595,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.815902"
"discovered": "2026-04-21T16:00:04.736401"
},
{
"name": "plausible",
@@ -608,7 +608,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.229857"
"discovered": "2026-04-21T16:00:04.342191"
},
{
"name": "pmta",
@@ -621,7 +621,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.250756"
"discovered": "2026-04-21T16:00:04.355029"
},
{
"name": "render-configs",
@@ -634,7 +634,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.354310"
"discovered": "2026-04-21T16:00:04.408294"
},
{
"name": "searxng",
@@ -647,7 +647,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.608100"
"discovered": "2026-04-21T16:00:04.515442"
},
{
"name": "weval-guardian",
@@ -660,7 +660,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.845315"
"discovered": "2026-04-21T16:00:04.798671"
},
{
"name": "weval-litellm",
@@ -673,7 +673,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.865731"
"discovered": "2026-04-21T16:00:04.838732"
},
{
"name": "weval-security",
@@ -686,7 +686,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.930563"
"discovered": "2026-04-21T16:00:04.963419"
},
{
"name": "archive",
@@ -699,7 +699,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.391402"
"discovered": "2026-04-21T16:00:03.953415"
},
{
"name": "loki",
@@ -712,7 +712,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.900227"
"discovered": "2026-04-21T16:00:04.161645"
},
{
"name": "ruflo",
@@ -725,7 +725,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.579813"
"discovered": "2026-04-21T16:00:04.507898"
},
{
"name": "twenty",
@@ -738,7 +738,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.742361"
"discovered": "2026-04-21T16:00:04.616634"
},
{
"name": "weval-crewai",
@@ -751,7 +751,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.837298"
"discovered": "2026-04-21T16:00:04.772973"
},
{
"name": "weval-plugins",
@@ -764,7 +764,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.896211"
"discovered": "2026-04-21T16:00:04.900134"
},
{
"name": "weval-radar",
@@ -777,7 +777,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.911292"
"discovered": "2026-04-21T16:00:04.918896"
},
{
"name": "weval-scrapy",
@@ -790,7 +790,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.925391"
"discovered": "2026-04-21T16:00:04.943506"
},
{
"name": "langfuse",
@@ -803,7 +803,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.852309"
"discovered": "2026-04-21T16:00:04.086570"
},
{
"name": "litellm",
@@ -816,7 +816,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.859023"
"discovered": "2026-04-21T16:00:04.126567"
},
{
"name": "mattermost-docker",
@@ -829,7 +829,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.902358"
"discovered": "2026-04-21T16:00:04.180697"
},
{
"name": "prometheus",
@@ -842,7 +842,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.269652"
"discovered": "2026-04-21T16:00:04.375182"
},
{
"name": "twenty-compose",
@@ -855,7 +855,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.772465"
"discovered": "2026-04-21T16:00:04.666219"
},
{
"name": "weval-ux",
@@ -868,7 +868,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.938236"
"discovered": "2026-04-21T16:00:04.979610"
},
{
"name": "wevia-integrity",
@@ -881,7 +881,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.961488"
"discovered": "2026-04-21T16:00:05.022215"
},
{
"name": "DiffusionDB",
@@ -894,7 +894,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.244817"
"discovered": "2026-04-21T16:00:03.583864"
},
{
"name": "LTX-Video",
@@ -907,7 +907,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.313417"
"discovered": "2026-04-21T16:00:03.808120"
},
{
"name": "localai",
@@ -920,7 +920,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:02.861061"
"discovered": "2026-04-21T16:00:04.148879"
},
{
"name": "wevia-finetune",
@@ -933,6 +933,6 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.959419"
"discovered": "2026-04-21T16:00:05.013075"
}
]

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-21T15:30:11",
"timestamp": "2026-04-21T16:00:17",
"features": {
"total": 36,
"pass": 35
@@ -13,7 +13,7 @@
"score": 97.2,
"log": [
"=== UX AGENT v1.0 ===",
"Time: 2026-04-21 15:30:02",
"Time: 2026-04-21 16:00:01",
" core: 4/4",
" layout: 3/4",
" interaction: 6/6",

View File

@@ -1,7 +1,7 @@
{
"ok": true,
"version": "V83-business-kpi",
"ts": "2026-04-21T13:54:03+00:00",
"ts": "2026-04-21T14:29:43+00:00",
"summary": {
"total_categories": 8,
"total_kpis": 64,

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-21 10:00:02",
"timestamp": "2026-04-21 14:00:02",
"frameworks": [
{
"name": "Lean Six Sigma",
@@ -13,7 +13,7 @@
{
"name": "Monitoring",
"ok": true,
"detail": "70 crons"
"detail": "75 crons"
},
{
"name": "Quality>95",
@@ -46,7 +46,7 @@
{
"name": "Change Mgmt",
"ok": true,
"detail": "3758 commits\/7d"
"detail": "3629 commits\/7d"
},
{
"name": "SLA Monitor",
@@ -74,7 +74,7 @@
{
"name": "Process monitor",
"ok": true,
"detail": "70 crons"
"detail": "75 crons"
},
{
"name": "Continuous improvement",
@@ -135,7 +135,7 @@
{
"name": "Disk<85%",
"ok": true,
"detail": "81%"
"detail": "82%"
},
{
"name": "Local inference",
@@ -153,7 +153,7 @@
{
"name": "CI\/CD",
"ok": true,
"detail": "3758 commits"
"detail": "3629 commits"
},
{
"name": "Auto testing",
@@ -163,7 +163,7 @@
{
"name": "DevOps",
"ok": true,
"detail": "70 pipelines"
"detail": "75 pipelines"
},
{
"name": "Retrospective",

View File

@@ -0,0 +1,17 @@
<?php
return array(
'name' => 'cf_purge_wtp',
'triggers' => array(
0 => 'cf purge',
1 => 'cloudflare purge',
2 => 'purge cf',
3 => 'purge wtp',
4 => 'refresh cf cache',
5 => 'invalidate cf',
),
'cmd' => 'curl -sS --max-time 10 "https://weval-consulting.com/api/cf-purge.php?files=/weval-technology-platform.html"',
'status' => 'WAVE_213',
'created_at' => '2026-04-21T14:27:00+00:00',
'source' => 'opus-wave-213-auto-cf-purge',
'description' => 'Purge Cloudflare cache for WTP via /api/cf-purge.php helper'
);

View File

@@ -0,0 +1,4 @@
def test():
assert 1 == 1, "La valeur de 1 est différente de 1"
test()

View File

@@ -0,0 +1,23 @@
# final
# La Fin : Une Nouvelle Début
## Introduction
La fin est un terme qui peut avoir de nombreuses significations, selon le contexte dans lequel il est utilisé. Dans ce document, nous allons explorer les différentes facettes de la fin, en commençant par la terminaison d'un projet ou d'une période.
## Les Diverses Formes de Fin
* **Fin d'un projet** : La fin d'un projet marque la fin de la phase de réalisation et la mise en place de solutions pour répondre aux besoins et objectifs initiaux.
* **Fin d'une période** : La fin d'une période, comme la fin d'une année scolaire ou professionnelle, marque la fin d'un cycle et l'ouverture d'un nouveau chapitre.
* **Fin de vie** : La fin de vie est un terme utilisé pour décrire la fin de la vie d'une personne ou d'un animal.
## Les Conséquences de la Fin
* **La clôture d'un cycle** : La fin marque la clôture d'un cycle, permettant ainsi de réfléchir sur les expériences vécues et de préparer les futurs défis.
* **Les changements** : La fin peut également entraîner des changements dans la vie quotidienne, tels que la perte d'un emploi ou la fin d'un lien amical.
* **Les opportunités** : Malgré les difficultés, la fin peut également offrir des opportunités de croissance et de développement personnel.
## Conclusion
La fin est un terme complexe qui peut avoir de nombreuses significations. Qu'il s'agisse de la fin d'un projet, d'une période ou de la vie, il est essentiel de reconnaître les conséquences et les opportunités qui en découlent. En acceptant et en intégrant la fin dans notre vie quotidienne, nous pouvons nous adapter et nous développer pour affronter les défis du futur.

Binary file not shown.

View File

@@ -0,0 +1,29 @@
# final
# Le Concept de Final
## Définition
Le terme "final" est utilisé pour désigner une étape ou un résultat qui marque la fin d'un processus, d'un projet ou d'un cycle de vie. Il s'agit d'un point d'arrêt ou d'un accomplissement qui met un terme à une période de travail, de développement ou de progression.
## Types de Final
* **Final d'un projet** : il s'agit de la dernière étape d'un projet, marquant la fin de la phase de conception, de réalisation et de livraison.
* **Final d'un cycle de vie** : il s'agit de la fin d'une période de croissance, de développement ou de progression, comme par exemple la fin d'une année scolaire ou professionnelle.
* **Final d'un processus** : il s'agit de la dernière étape d'un processus, comme par exemple la finalisation d'un rapport, d'un rapport de gestion ou d'un document de synthèse.
## Exemples de Final
* **Final d'un projet de construction** : la livraison des clés de la propriété à l'acheteur.
* **Final d'un cycle de vie académique** : la remise des diplômes aux diplômés.
* **Final d'un processus de développement** : la mise en production d'un nouveau produit ou service.
## Conséquences d'un Final
* **Fin d'une phase de travail** : la fin d'une phase de travail ou de développement marque la fin d'une période de travail intense.
* **Début d'une nouvelle phase** : la fin d'une phase de travail ou de développement marque souvent le début d'une nouvelle phase, comme par exemple la phase de maintenance ou de suivi.
* **Évaluation et bilan** : la fin d'une phase de travail ou de développement offre l'occasion de faire l'évaluation et le bilan de ce qui a été réalisé.
## Conclusion
Le concept de final est essentiel pour comprendre les différentes étapes et les conséquences qui les accompagnent. Il permet de marquer la fin d'un processus, d'un projet ou d'un cycle de vie, et de passer à une nouvelle phase de travail ou de développement. La compréhension du concept de final est donc cruciale pour les professionnels et les particuliers qui travaillent sur des projets ou des cycles de vie.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,79 @@
# final
**Rapport Final de Projet**
==========================
**Résumé**
----------
Ce rapport présente les résultats de notre projet de recherche sur l'impact de la technologie sur l'efficacité des entreprises. Après une période de 6 mois de collecte de données et d'analyse, nous avons pu établir un portrait complet de l'évolution de la productivité et de la rentabilité des entreprises dans le secteur tertiaire.
**Table des Matières**
---------------------
1. [Introduction](#introduction)
2. [Méthodologie](#méthodologie)
3. [Résultats](#résultats)
4. [Discussion](#discussion)
5. [Conclusion](#conclusion)
6. [Références](#références)
**Introduction**
---------------
Le secteur tertiaire a connu une évolution significative ces dernières années, notamment en raison de l'adoption de la technologie dans les entreprises. L'objectif de ce projet est de comprendre l'impact de la technologie sur l'efficacité des entreprises dans ce secteur.
### Objectifs
* Évaluer l'impact de la technologie sur la productivité des entreprises
* Analyser l'impact de la technologie sur la rentabilité des entreprises
* Identifier les facteurs clés qui influencent l'adoption de la technologie dans les entreprises
**Méthodologie**
----------------
La collecte de données a été effectuée grâce à des entretiens avec des responsables de 20 entreprises du secteur tertiaire. Les données ont été analysées à l'aide de techniques statistiques.
### Échantillon
* 20 entreprises du secteur tertiaire
* Taille moyenne de l'échantillon : 500 employés
**Résultats**
------------
Les résultats de l'étude sont présentés ci-dessous.
| Indicateur | Moyenne | Écart-type |
| --- | --- | --- |
| Productivité | 15% | 5% |
| Rentabilité | 20% | 10% |
### Analyse des résultats
* La productivité des entreprises a augmenté de 15% en moyenne après l'adoption de la technologie.
* La rentabilité des entreprises a augmenté de 20% en moyenne après l'adoption de la technologie.
**Discussion**
--------------
Les résultats de l'étude suggèrent que l'adoption de la technologie a un impact positif sur la productivité et la rentabilité des entreprises dans le secteur tertiaire.
### Limitations
* L'échantillon est limité à 20 entreprises.
* Les données ont été collectées uniquement grâce à des entretiens.
**Conclusion**
--------------
L'adoption de la technologie a un impact positif sur la productivité et la rentabilité des entreprises dans le secteur tertiaire. Cependant, il est important de prendre en compte les limitations de l'étude et de poursuivre les recherches pour une compréhension plus approfondie de l'impact de la technologie sur les entreprises.
**Références**
--------------
* [1] Nom de l'auteur, Titre de l'article, Nom de la publication, Année de publication.
* [2] Nom de l'auteur, Titre de l'article, Nom de la publication, Année de publication.
[1]: https://www.google.com
[2]: https://www.google.com

View File

@@ -0,0 +1,30 @@
# final
# Introduction
* Définition du final : terme utilisé pour décrire la dernière étape d'un processus, d'un projet ou d'un événement
* Importance du final dans divers domaines (sport, cinéma, éducation, etc.)
# Le Final dans le Sport
* Exemples de finales de grands événements (Mondial de football, Tour de France, etc.)
* Importance de la pression et de la confiance dans les finales
* Stratégies utilisées pour gagner les finales (tactique, motivation, etc.)
# Le Final dans le Cinéma
* Exemples de finales de films célèbres (Star Wars, La Guerre des Étoiles, etc.)
* Importance de la tension et de l'émotion dans les finales de films
* Techniques utilisées pour créer des finales impactantes (musique, montage, etc.)
# Le Final dans l'Éducation
* Exemples de finales de projets scolaires ou universitaires
* Importance de la présentation et de la communication dans les finales
* Conseils pour réussir les finales dans l'éducation (préparation, révision, etc.)
# Le Final dans la Vie Personnelle
* Exemples de finales de relations amoureuses ou professionnelles
* Importance de la conclusion et de la clarté dans les finales de la vie personnelle
* Conseils pour gérer les finales de la vie personnelle (communication, empathie, etc.)
# Conclusion
* Résumé des points clés sur le final dans divers domaines
* Importance de bien gérer les finales pour atteindre les objectifs
* Appel à l'action pour appliquer les conseils pour réussir les finales

Binary file not shown.

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
<rect x="50" y="50" width="100" height="200" rx="10" fill="#FF0000" />
<rect x="170" y="50" width="100" height="200" rx="10" fill="#00FF00" />
<rect x="290" y="50" width="100" height="200" rx="10" fill="#0000FF" />
<ellipse cx="200" cy="250" rx="50" ry="75" fill="#FFFF00" />
<polygon points="100,100 150,150 100,150" fill="#FF00FF" />
<line x1="50" y1="250" x2="350" y2="250" stroke="#FFFFFF" stroke-width="5" />
<text x="200" y="280" font-size="24" font-family="Arial" fill="#000000">FINAL</text>
</svg>

After

Width:  |  Height:  |  Size: 582 B

View File

@@ -0,0 +1,39 @@
# strategie Q3
# Stratégie Q3
## Présentation
La troisième trimestre (Q3) est une période critique pour les entreprises, marquée par des objectifs à atteindre et des défis à relever. Dans ce document, nous présentons notre stratégie pour Q3, qui vise à atteindre nos objectifs de croissance et de développement.
## Objectifs Q3
* **Augmentation des ventes** : 15% par rapport au Q2
* **Développement de nouveaux produits** : lancement de 2 nouveaux produits dans le marché
* **Amélioration de la satisfaction client** : 90% de satisfaction client au Q3
## Stratégie Marketing
* **Campagnes publicitaires** : lancement de 2 campagnes publicitaires ciblées pour atteindre les objectifs de vente
* **Contenu de qualité** : création de contenu de qualité pour attirer et fidéliser les clients
* **Réseaux sociaux** : augmentation de la présence sur les réseaux sociaux pour améliorer la visibilité et la communication avec les clients
## Stratégie Commerciale
* **Prix compétitifs** : mise en place de prix compétitifs pour attirer les clients
* **Promotions et offres** : mise en place de promotions et offres pour fidéliser les clients
* **Partenariats** : conclusion de partenariats avec des entreprises pour améliorer la gamme de produits et services
## Stratégie Opérationnelle
* **Amélioration de l'efficacité** : mise en place de processus plus efficaces pour améliorer la productivité
* **Réduction des coûts** : mise en place de mesures pour réduire les coûts sans affecter la qualité des produits
* **Investissement dans la formation** : investissement dans la formation des employés pour améliorer leurs compétences
## Suivi et Évaluation
* **Rapports réguliers** : présentation de rapports réguliers pour suivre les progrès et les résultats
* **Révisions et ajustements** : mise en place de révisions et ajustements pour s'assurer que la stratégie est sur la bonne voie
* **Récompenses et sanctions** : mise en place de récompenses et sanctions pour inciter les employés à atteindre les objectifs
En suivant cette stratégie, nous sommes convaincus que nous pourrons atteindre nos objectifs de croissance et de développement pour Q3. Nous nous engageons à travailler dur pour atteindre ces objectifs et à améliorer notre performance continue.

View File

@@ -0,0 +1,62 @@
# test continue
# Test Continue
=====================================
Le test continue est une approche de gestion des tests qui consiste à intégrer les tests dans le processus de développement continu. Cela permet de détecter les erreurs et les bugs dès que possible, afin de garantir la qualité du produit.
## Qu'est-ce que le test continue ?
### Définition
Le test continue est un processus qui consiste à exécuter les tests automatiquement après chaque changement dans le code source. Cela permet de détecter les erreurs et les bugs dès que possible, avant que le code ne soit intégré dans la version finale.
### Avantages
* Améliore la qualité du produit
* Réduit les coûts de correction des bugs
* Augmente la productivité
* Améliore la confiance des clients
## Exemples de test continue
### Intégration continue (CI)
L'intégration continue est un outil qui permet d'exécuter les tests automatiquement après chaque changement dans le code source. Cela peut être réalisé à l'aide de différents outils tels que Jenkins, Travis CI, CircleCI, etc.
### Déploiement continu (CD)
Le déploiement continu est un processus qui consiste à déployer le code dans un environnement de production après chaque changement. Cela permet de garantir que le code est toujours à jour et fonctionnel.
### Exemples de frameworks de test continue
* JUnit
* TestNG
* PyUnit
* Cucumber
## Comment mettre en place un test continue
### Étape 1 : Définir les objectifs
Définir les objectifs du test continue, tels que l'amélioration de la qualité du produit ou la réduction des coûts de correction des bugs.
### Étape 2 : Sélectionner les outils
Sélectionner les outils nécessaires pour mettre en place le test continue, tels que Jenkins, Travis CI, CircleCI, etc.
### Étape 3 : Définir les tests
Définir les tests à exécuter automatiquement après chaque changement dans le code source.
### Étape 4 : Intégrer les tests
Intégrer les tests dans le processus de développement continu.
### Étape 5 : Suivre les résultats
Suivre les résultats des tests et prendre des mesures correctives en cas de bugs détectés.
## Conclusion
Le test continue est une approche de gestion des tests qui consiste à intégrer les tests dans le processus de développement continu. Cela permet de détecter les erreurs et les bugs dès que possible, afin de garantir la qualité du produit. Il est important de mettre en place un test continue pour améliorer la qualité du produit, réduire les coûts de correction des bugs et augmenter la productivité.

Binary file not shown.

View File

@@ -0,0 +1,109 @@
# tuto
**Tuto : Comment Créer un Document Professionnel en Word**
# Introduction
=====================================
Bienvenue dans ce tuto sur la création d'un document professionnel en Word. Dans cet article, nous allons vous guider étape par étape pour créer un document complet et professionnel.
## Prérequis
---------------
Avant de commencer, assurez-vous d'avoir les compétences de base en Word et d'avoir installé le logiciel sur votre ordinateur.
## Étape 1 : Créer un Nouveau Document
-------------------------------------
1. Ouvrez Word et cliquez sur "Nouveau" pour créer un nouveau document.
2. Sélectionnez le modèle de document que vous souhaitez utiliser (par exemple, "Article" ou "Rapport").
3. Nommez votre document et choisissez l'emplacement où vous le souhaitez enregistrer.
# Section 1 : La Structure du Document
=====================================
## 1.1 : L'En-tête
-----------------
L'en-tête est la partie supérieure de votre document qui contient les informations de base, telles que le titre, le sous-titre, et les informations de contact.
### Exemple d'En-tête
* Titre : "Document Professionnel"
* Sous-titre : "Création d'un Document Complexe"
* Informations de contact : "Nom : John Doe, Email : [johndoe@example.com](mailto:johndoe@example.com)"
## 1.2 : Le Contenu
------------------
Le contenu est la partie principale de votre document qui contient les informations que vous souhaitez partager avec vos lecteurs.
### Exemple de Contenu
* Introduction : "Bienvenue dans ce document sur la création d'un document professionnel en Word."
* Corps : "Voici les étapes à suivre pour créer un document complet et professionnel..."
* Conclusion : "En suivant ces étapes, vous serez en mesure de créer un document professionnel de haute qualité."
## 1.3 : La Fin
----------------
La fin est la partie inférieure de votre document qui contient les informations de copyright, les références, et les annexes.
### Exemple de Fin
* Copyright : "Tous droits réservés à [Nom de l'entreprise]"
* Références : "[Référence 1], [Référence 2], etc."
* Annexes : "Annexe 1 : [Nom de l'annexe], Annexe 2 : [Nom de l'annexe], etc."
# Section 2 : Les Formules de Style
=====================================
## 2.1 : Les Titres
-----------------
Les titres sont utilisés pour structurer votre document et aider les lecteurs à comprendre le contenu.
### Exemple de Titre
* Titre 1 : "Introduction"
* Titre 2 : "Les Étapes à Suivre"
* Titre 3 : "La Conclusion"
## 2.2 : Les Sous-Titres
----------------------
Les sous-titres sont utilisés pour fournir plus de détails sur le contenu du titre.
### Exemple de Sous-Titre
* Sous-titre 1 : "Créer un Nouveau Document"
* Sous-titre 2 : "La Structure du Document"
* Sous-titre 3 : "Les Formules de Style"
## 2.3 : Les Éléments de Formules de Style
------------------------------------------
Les éléments de formules de style sont utilisés pour mettre en forme le contenu de votre document.
### Exemple d'Élément de Formules de Style
* Titre en gras : "Titre 1"
* Texte en italique : "Voici un exemple de texte en italique."
* Liste à puces : "Voici une liste à puces :"
+ Élément 1
+ Élément 2
+ Élément 3
# Conclusion
==============
En suivant ces étapes, vous serez en mesure de créer un document professionnel de haute qualité en Word. N'hésitez pas à essayer et à expérimenter pour améliorer vos compétences en Word.
**Annexe 1 : Ressources Complémentaires**
* [Lien vers une ressource complémentaire](https://www.example.com)
* [Lien vers une autre ressource complémentaire](https://www.autreexemple.com)
**Annexe 2 : Exemple de Document**
* [Lien vers un exemple de document](https://www.example.com/document.pdf)

149
token-health-dashboard.html Normal file
View File

@@ -0,0 +1,149 @@
<!DOCTYPE html>
<html lang="fr"><head><meta charset="UTF-8"><title>Token Health Dashboard · WEVAL</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
*{margin:0;padding:0;box-sizing:border-box;font-family:-apple-system,'Segoe UI',sans-serif}
body{background:#060d1a;color:#e2e8f0;min-height:100vh;padding:20px}
.container{max-width:1200px;margin:0 auto}
h1{font-family:'Orbitron',sans-serif;background:linear-gradient(135deg,#06b6d4,#a855f7);
-webkit-background-clip:text;-webkit-text-fill-color:transparent;
font-size:2rem;margin-bottom:8px;letter-spacing:1px}
.subtitle{color:#94a3b8;margin-bottom:24px;font-size:0.9rem}
.hero{background:linear-gradient(135deg,rgba(6,182,212,0.08),rgba(168,85,247,0.08));
border:1px solid rgba(6,182,212,0.25);border-radius:16px;padding:24px;margin-bottom:24px;
backdrop-filter:blur(12px)}
.hero-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:16px}
.stat{text-align:center}
.stat-val{font-family:'Orbitron',sans-serif;font-size:2.5rem;font-weight:900;line-height:1}
.stat-val.danger{color:#ef4444}
.stat-val.warn{color:#f59e0b}
.stat-val.success{color:#22c55e}
.stat-lbl{font-size:0.7rem;color:#64748b;text-transform:uppercase;letter-spacing:1.5px;margin-top:6px}
.providers{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin-bottom:24px}
.provider{background:rgba(15,23,42,0.8);border:1px solid rgba(100,116,139,0.15);
border-radius:12px;padding:14px 16px;transition:all 0.2s}
.provider.ok{border-left:3px solid #22c55e}
.provider.expired{border-left:3px solid #ef4444;background:rgba(239,68,68,0.05)}
.provider-name{font-weight:700;font-size:0.95rem;display:flex;justify-content:space-between;align-items:center}
.badge{padding:2px 8px;border-radius:10px;font-size:0.65rem;font-weight:700;text-transform:uppercase}
.badge.ok{background:rgba(34,197,94,0.15);color:#22c55e}
.badge.expired{background:rgba(239,68,68,0.15);color:#ef4444}
.provider-meta{font-size:0.75rem;color:#94a3b8;margin-top:6px}
.provider-action{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap}
.btn{padding:4px 10px;border-radius:6px;font-size:0.7rem;font-weight:700;cursor:pointer;
text-decoration:none;border:none;transition:all 0.15s}
.btn-primary{background:linear-gradient(135deg,#06b6d4,#8b5cf6);color:#fff}
.btn-secondary{background:rgba(100,116,139,0.15);color:#94a3b8;border:1px solid rgba(100,116,139,0.25)}
.btn:hover{transform:translateY(-1px);opacity:0.9}
.runbook{background:rgba(15,23,42,0.8);border:1px solid rgba(100,116,139,0.15);
border-radius:12px;padding:20px;margin-top:24px}
.runbook h2{color:#06b6d4;font-size:1.2rem;margin-bottom:14px;
border-left:3px solid #06b6d4;padding-left:10px}
.runbook-step{padding:12px;margin:10px 0;background:rgba(11,13,21,0.6);border-radius:8px;border-left:3px solid rgba(168,85,247,0.4)}
.runbook-step strong{color:#c084fc}
code{background:#0f0f15;color:#22c55e;padding:2px 6px;border-radius:4px;font-size:0.85em}
</style></head><body>
<div class="container">
<h1>🔑 Token Health Dashboard</h1>
<p class="subtitle">Monitoring centralisé des credentials API providers · cascade souveraine WEVIA</p>
<section class="hero">
<div class="hero-stats" id="hero-stats">
<div class="stat"><div class="stat-val warn" id="stat-health"></div><div class="stat-lbl">Health</div></div>
<div class="stat"><div class="stat-val success" id="stat-ok"></div><div class="stat-lbl">Actifs</div></div>
<div class="stat"><div class="stat-val danger" id="stat-exp"></div><div class="stat-lbl">Expirés</div></div>
<div class="stat"><div class="stat-val" id="stat-total"></div><div class="stat-lbl">Total</div></div>
</div>
</section>
<h2 style="color:#06b6d4;margin-bottom:14px;border-left:3px solid #06b6d4;padding-left:10px">Providers Status</h2>
<div class="providers" id="providers-grid"><div style="color:#64748b">Chargement live...</div></div>
<section class="runbook">
<h2>📘 Runbook Rotation Tokens (manuel ou via Selenium blueprint)</h2>
<div class="runbook-step">
<strong>Groq</strong> · dashboard: <code>https://console.groq.com/keys</code><br>
1. Se connecter avec yacineutt@gmail.com<br>
2. Créer nouvelle API key · label: <code>weval-prod-2026</code><br>
3. Copier dans <code>/etc/weval/secrets.env</code><code>GROQ_API_KEY=gsk_...</code><br>
4. Reload: <code>sudo systemctl reload php8.5-fpm</code>
</div>
<div class="runbook-step">
<strong>SambaNova</strong> · dashboard: <code>https://cloud.sambanova.ai/</code><br>
1. Se connecter avec yacineutt@gmail.com<br>
2. Settings → API Keys → Generate new<br>
3. Update <code>SAMBANOVA_API_KEY=...</code> dans secrets.env
</div>
<div class="runbook-step">
<strong>Alibaba (DashScope)</strong> · dashboard: <code>https://dashscope.console.aliyun.com/</code><br>
1. Login Chinese account<br>
2. API Key Management → Create new<br>
3. Update <code>ALIBABA_API_KEY=sk-...</code> dans secrets.env
</div>
<div class="runbook-step">
<strong>GitHub PAT</strong> · dashboard: <code>https://github.com/settings/tokens?type=beta</code><br>
1. Regenerate → copy new <code>ghp_...</code><br>
2. Update <code>GITHUB_PAT=ghp_...</code> dans secrets.env<br>
3. Test: <code>sudo git push origin main</code>
</div>
<div class="runbook-step">
<strong>Blueprint Selenium automatisé</strong> · voir <code>/opt/obsidian-vault/doctrines/tips-6-mois-cracked.md</code><br>
Script Python + Selenium Grid Docker + Chrome + YacineUTT session sync
</div>
</section>
<section style="margin-top:20px;text-align:center;color:#64748b;font-size:0.85rem">
<button class="btn btn-primary" onclick="location.reload()">🔄 Refresh</button>
<a href="/wiki.html" class="btn btn-secondary">📘 Wiki</a>
<a href="/wtp-udock-coverage.html" class="btn btn-secondary">📊 WTP Dashboard</a>
</section>
</div>
<script>
fetch('/api/wevia-autonomy-status.json', {cache:'no-store'})
.then(r => r.json())
.then(d => {
const alerts = d.alerts || [];
const expiredList = alerts.filter(a => a.msg && /expir/i.test(a.msg)).map(a => {
const m = a.msg.match(/Token\s+(\w+)/i);
return m ? m[1].toLowerCase() : null;
}).filter(Boolean);
const KNOWN = ['cerebras','groq','deepseek','mistral','together','openrouter','sambanova',
'alibaba','gemini','nvidia-nim','cohere','huggingface','replicate','zhipu',
'anthropic','github','whatsapp'];
const health = Math.round((KNOWN.length - expiredList.length) / KNOWN.length * 100);
document.getElementById('stat-health').textContent = health + '%';
document.getElementById('stat-ok').textContent = KNOWN.length - expiredList.length;
document.getElementById('stat-exp').textContent = expiredList.length;
document.getElementById('stat-total').textContent = KNOWN.length;
const grid = document.getElementById('providers-grid');
grid.innerHTML = '';
KNOWN.forEach(p => {
const isExpired = expiredList.includes(p);
const card = document.createElement('div');
card.className = 'provider ' + (isExpired ? 'expired' : 'ok');
card.innerHTML = `
<div class="provider-name">
<span>${p}</span>
<span class="badge ${isExpired?'expired':'ok'}">${isExpired?'EXPIRED':'OK'}</span>
</div>
<div class="provider-meta">${isExpired ? '⚠️ Rotation requise' : '✅ Active'}</div>
${isExpired ? '<div class="provider-action"><button class="btn btn-primary" onclick="alert(\'Voir runbook dans cette page pour '+p+'\')">Rotate</button></div>' : ''}
`;
grid.appendChild(card);
});
})
.catch(e => {
document.getElementById('providers-grid').innerHTML = '<div style="color:#ef4444">Erreur: ' + e.message + '</div>';
});
</script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t39) --><script src=\/wtp-unified-dock.js\ defer></script>
</body></html>

View File

@@ -3672,6 +3672,7 @@ if (typeof window.navigateTo === 'function'){
<button onclick="window.__wtpMaQuick('tip_office_recovery')" style="padding:5px 12px;border-radius:12px;background:rgba(14,165,233,.15);color:#bae6fd;border:1px solid rgba(14,165,233,.3);font-size:11px;cursor:pointer;font-weight:600">📧 Office</button>
<button onclick="window.__wtpMaQuick('tip_chattr_dance')" style="padding:5px 12px;border-radius:12px;background:rgba(132,204,22,.15);color:#d9f99d;border:1px solid rgba(132,204,22,.3);font-size:11px;cursor:pointer;font-weight:600">🔐 chattr</button>
<button onclick="window.__wtpMaQuick('doctrine supreme')" style="padding:5px 12px;border-radius:12px;background:rgba(251,191,36,.15);color:#fde68a;border:1px solid rgba(251,191,36,.3);font-size:11px;cursor:pointer;font-weight:600">📜 doctrine</button>
<button onclick="window.__wtpCfPurge()" style="padding:5px 12px;border-radius:12px;background:rgba(249,115,22,.15);color:#fed7aa;border:1px solid rgba(249,115,22,.3);font-size:11px;cursor:pointer;font-weight:600">🔄 CF purge WTP</button>
</div>
<div id="wtp-ma-conversation" style="min-height:80px;max-height:520px;overflow-y:auto;padding:16px;background:rgba(0,0,0,.25);border:1px solid rgba(6,182,212,.2);border-radius:10px;font-family:ui-monospace,monospace;font-size:12px;color:#e0f2fe;line-height:1.5">
@@ -3708,6 +3709,33 @@ if (typeof window.navigateTo === 'function'){
window.__wtpMaQuick = function(q){ input.value = q; window.__wtpMaSend(); };
window.__wtpCfPurge = function(){
var btn = event.target;
btn.disabled = true;
var orig = btn.textContent;
btn.textContent = '⏳ purging...';
fetch('/api/cf-purge.php?files=/weval-technology-platform.html,/api/wevia-autonomous.php', {cache:'no-store'})
.then(function(r){return r.json();})
.then(function(d){
btn.textContent = d.ok ? '✅ CF purgé' : '❌ échec';
setTimeout(function(){ btn.textContent = orig; btn.disabled = false; }, 3000);
if (d.ok && typeof window.__wtpMaSend !== 'undefined') {
// Log to conversation if console visible
var conv = document.getElementById('wtp-ma-conversation');
if (conv) {
var el = document.createElement('div');
el.style.cssText = 'margin-bottom:10px;padding:8px 10px;background:rgba(249,115,22,.1);border-left:3px solid #fb923c;border-radius:6px';
el.innerHTML = '<div style="font-size:11px;color:#fed7aa">🔄 Cloudflare purge WTP · cf_id='+(d.cf_response&&d.cf_response.result?d.cf_response.result.id:'?').slice(0,12)+'</div>';
conv.appendChild(el);
conv.scrollTop = conv.scrollHeight;
}
}
})
.catch(function(e){
btn.textContent = '❌ err';
setTimeout(function(){ btn.textContent = orig; btn.disabled = false; }, 2000);
});
};
window.__wtpMaSend = function(){
var q = (input.value||'').trim();
if (!q) return;

View File

@@ -1065,11 +1065,12 @@ function showThinking() {
cur.className = 'think-cursor';
stream.appendChild(cur);
// Call fast LLM for real reasoning about this specific query
fetch('/api/sovereign/v1/chat/completions', {
// === AMBRE-V3-THINKING 2026-04-21 · route to custom thinking endpoint ===
// Doctrine: real chain-of-thought for all queries, pattern-specific for gen tasks
fetch('/api/ambre-thinking.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ message: q, language: lang || 'fr' })
body: JSON.stringify({ message: q, language: (typeof lang !== 'undefined' ? lang : 'fr') })
})
.then(function(r) { return r.json(); })
.then(function(data) {
@@ -1266,6 +1267,50 @@ function send() {
}
payload.mode = effectiveMode;
// === AMBRE-V2-GEN-ROUTER 2026-04-21 · intercept file generation patterns ===
// Doctrine: route gen/code/translate patterns → wevia-master-api.php (real handler)
// other queries continue to sovereign. No regression, pure additive.
var _ambre_gen_pat = /g[eéèê]n[eéèê]re?\s+(?:un|une|des|le|la)?\s*(pdf|pptx?|powerpoint|docx?|word|excel|xlsx?|pr[eéèê]sentation|document|tableau|sch[eéèê]ma|mermaid|diagramme|image)|ecri[srt]?\s+(?:le|du|un)?\s*code|traduis?\s+(?:ce\s+texte|en)?\s*(anglais|francais|espagnol|allemand|italien|portugais|arabe|chinois|japonais|english|spanish|french|german|italian|portuguese|arabic|chinese|japanese)/i;
if (_ambre_gen_pat.test(text)) {
// Route to wevia-master-api.php (my handler pipeline)
fetch('/api/wevia-master-api.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({message: text, session_id: convId || ('wv-' + Date.now())})
})
.then(function(r) { return r.json(); })
.then(function(data) {
hideThinking();
var elapsed = ((performance.now() - startTime) / 1000).toFixed(1);
var response = data.response || data.content || 'Pas de reponse.';
if (data.conversation_id) convId = data.conversation_id;
chatHistory.push({role: 'assistant', content: response});
var msgEl = addMsg('assistant', response, elapsed);
var badges = [];
if(data.provider) badges.push('<span class="nx-badge nx-prov">' + (data.provider||'').substring(0,20) + '</span>');
if(data.intent) badges.push('<span class="nx-badge" style="background:rgba(124,107,240,0.15);color:#7C6BF0">' + data.intent + '</span>');
badges.push('<span class="nx-badge" style="background:rgba(16,185,129,0.15);color:#10B981">⚡ Gen</span>');
if(badges.length > 0 && msgEl && msgEl.querySelector('.msg-inner')) {
var badgeEl = document.createElement('div');
badgeEl.className = 'nx-badges';
badgeEl.innerHTML = badges.join('');
msgEl.querySelector('.msg-inner').appendChild(badgeEl);
}
// Detect code/artifact blocks in response
var codeMatch = response.match(/```(\w+)?\n([\s\S]*?)```/);
if (codeMatch && window._artifactCode !== undefined) {
window._artifactCode = codeMatch[2];
}
setTimeout(function(){ if(typeof generateFollowups==='function') generateFollowups(window._lastQuery, response); }, 500);
})
.catch(function(err) {
hideThinking();
addMsg('assistant', '❌ Erreur generation: ' + err.message, '0');
});
return;
}
// === END AMBRE-V2-GEN-ROUTER ===
// Fast mode: direct to fast endpoint (2s response)
if (effectiveMode === 'fast' && !pendingFile) {
fetch('/api/sovereign/v1/chat/completions', {

View File

@@ -1442,4 +1442,5 @@ b7d75cb53 feat(wtp-udock-dashboard): dashboard premium + endpoint JSON ← tour
})();
</script>
<script src="/opus-antioverlap-doctrine.js?v=1776777631" defer></script>
<div class="card wiki-item" data-tags="autosync wiki-autosync-20260421160002"><h2 style="border:0;margin:0;padding:0">📌 2026-04-21 AUTO-SYNC: 10 commits — 5002d40e7 aut</h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">2026-04-21 AUTO-SYNC: 10 commits — 5002d40e7 auto-sync via WEVIA git_sync_all intent 2026-04-21T15:59:46+02:00<br><span style="color:#06b6d4">[wiki-auto-append 21/04 16:00]</span></div></div>
</body></html>