auto-sync-1705

This commit is contained in:
opus
2026-04-17 17:05:02 +02:00
parent 5682ffb551
commit 8ca4be09ad
18 changed files with 2398 additions and 91 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,14 @@
{
"id": "task_20260417150051_bca114",
"name": "Kaouther 3 drafts Gmail",
"type": "powershell",
"command": "# Open 3 Gmail drafts in Chrome (SSO actif, juste clic Send)\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Premium+%281%2C5+DH%29&body=Bonjour+Kaouther%2C%0A%0AContre-proposition+1%2C5+DH%2Fcontact+palier+Premium+%28volume+s%C3%A9lectif+0-20K+cibl%C3%A9s%2C+triple+canal+email%2BWhatsApp%2BSMS%2C+opt-in+Loi+09-08%2C+support+d%C3%A9di%C3%A9%29.%0A%0ABase%3A+146%2C668+HCPs+valid%C3%A9s+%2B20K+en+7+jours.+Stack+souverain+Maroc.%0A%0AVoir+d%C3%A9tails+complets+sur+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ABien+cordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Standard+%281%2C2+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Standard+1%2C2+DH%2Fcontact+pour+volume+r%C3%A9current+20-60K%2C+bi-canal+email%2BWhatsApp%2C+reporting+hebdo.%0A%0ASweet+spot+campagnes+trimestrielles.+DZ+107K+%2F+MA+20K+%2F+TN+18K+disponibles.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Volume+%281%2C0+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Volume+1%2C0+DH%2Fcontact+%2860K%2B+contacts%2C+6+mois+min%2C+email+principal+%2B+WhatsApp+%2B0%2C2+DH+option%29.%0A%0ACouvre+co%C3%BBts+infra%2BDB.+En-dessous+perte.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nNew-BurntToastNotification -Text 'WEVAL Kaouther', '3 drafts ouverts dans Chrome - Prets a envoyer' -ErrorAction SilentlyContinue\nWrite-Host 'Kaouther drafts opened at $(Get-Date)'\n",
"cmd": "# Open 3 Gmail drafts in Chrome (SSO actif, juste clic Send)\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Premium+%281%2C5+DH%29&body=Bonjour+Kaouther%2C%0A%0AContre-proposition+1%2C5+DH%2Fcontact+palier+Premium+%28volume+s%C3%A9lectif+0-20K+cibl%C3%A9s%2C+triple+canal+email%2BWhatsApp%2BSMS%2C+opt-in+Loi+09-08%2C+support+d%C3%A9di%C3%A9%29.%0A%0ABase%3A+146%2C668+HCPs+valid%C3%A9s+%2B20K+en+7+jours.+Stack+souverain+Maroc.%0A%0AVoir+d%C3%A9tails+complets+sur+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ABien+cordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Standard+%281%2C2+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Standard+1%2C2+DH%2Fcontact+pour+volume+r%C3%A9current+20-60K%2C+bi-canal+email%2BWhatsApp%2C+reporting+hebdo.%0A%0ASweet+spot+campagnes+trimestrielles.+DZ+107K+%2F+MA+20K+%2F+TN+18K+disponibles.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Volume+%281%2C0+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Volume+1%2C0+DH%2Fcontact+%2860K%2B+contacts%2C+6+mois+min%2C+email+principal+%2B+WhatsApp+%2B0%2C2+DH+option%29.%0A%0ACouvre+co%C3%BBts+infra%2BDB.+En-dessous+perte.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nNew-BurntToastNotification -Text 'WEVAL Kaouther', '3 drafts ouverts dans Chrome - Prets a envoyer' -ErrorAction SilentlyContinue\nWrite-Host 'Kaouther drafts opened at $(Get-Date)'\n",
"priority": "high",
"status": "done",
"created": "2026-04-17T15:00:51+00:00",
"created_by": "blade-control-ui",
"completed_by": "s204-reconciler",
"completed_at": "2026-04-17T17:05:01.821233",
"reconciler_reason": "surfaced 3 Gmail URLs on /blade-actions.html (reconciler)"
}

View File

@@ -0,0 +1,14 @@
{
"id": "task_20260417150416_01644a",
"name": "Kaouther 3 drafts Gmail",
"type": "powershell",
"command": "# Open 3 Gmail drafts in Chrome (SSO actif, juste clic Send)\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Premium+%281%2C5+DH%29&body=Bonjour+Kaouther%2C%0A%0AContre-proposition+1%2C5+DH%2Fcontact+palier+Premium+%28volume+s%C3%A9lectif+0-20K+cibl%C3%A9s%2C+triple+canal+email%2BWhatsApp%2BSMS%2C+opt-in+Loi+09-08%2C+support+d%C3%A9di%C3%A9%29.%0A%0ABase%3A+146%2C668+HCPs+valid%C3%A9s+%2B20K+en+7+jours.+Stack+souverain+Maroc.%0A%0AVoir+d%C3%A9tails+complets+sur+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ABien+cordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Standard+%281%2C2+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Standard+1%2C2+DH%2Fcontact+pour+volume+r%C3%A9current+20-60K%2C+bi-canal+email%2BWhatsApp%2C+reporting+hebdo.%0A%0ASweet+spot+campagnes+trimestrielles.+DZ+107K+%2F+MA+20K+%2F+TN+18K+disponibles.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Volume+%281%2C0+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Volume+1%2C0+DH%2Fcontact+%2860K%2B+contacts%2C+6+mois+min%2C+email+principal+%2B+WhatsApp+%2B0%2C2+DH+option%29.%0A%0ACouvre+co%C3%BBts+infra%2BDB.+En-dessous+perte.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nNew-BurntToastNotification -Text 'WEVAL Kaouther', '3 drafts ouverts dans Chrome - Prets a envoyer' -ErrorAction SilentlyContinue\nWrite-Host 'Kaouther drafts opened at $(Get-Date)'\n",
"cmd": "# Open 3 Gmail drafts in Chrome (SSO actif, juste clic Send)\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Premium+%281%2C5+DH%29&body=Bonjour+Kaouther%2C%0A%0AContre-proposition+1%2C5+DH%2Fcontact+palier+Premium+%28volume+s%C3%A9lectif+0-20K+cibl%C3%A9s%2C+triple+canal+email%2BWhatsApp%2BSMS%2C+opt-in+Loi+09-08%2C+support+d%C3%A9di%C3%A9%29.%0A%0ABase%3A+146%2C668+HCPs+valid%C3%A9s+%2B20K+en+7+jours.+Stack+souverain+Maroc.%0A%0AVoir+d%C3%A9tails+complets+sur+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ABien+cordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Standard+%281%2C2+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Standard+1%2C2+DH%2Fcontact+pour+volume+r%C3%A9current+20-60K%2C+bi-canal+email%2BWhatsApp%2C+reporting+hebdo.%0A%0ASweet+spot+campagnes+trimestrielles.+DZ+107K+%2F+MA+20K+%2F+TN+18K+disponibles.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Volume+%281%2C0+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Volume+1%2C0+DH%2Fcontact+%2860K%2B+contacts%2C+6+mois+min%2C+email+principal+%2B+WhatsApp+%2B0%2C2+DH+option%29.%0A%0ACouvre+co%C3%BBts+infra%2BDB.+En-dessous+perte.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nNew-BurntToastNotification -Text 'WEVAL Kaouther', '3 drafts ouverts dans Chrome - Prets a envoyer' -ErrorAction SilentlyContinue\nWrite-Host 'Kaouther drafts opened at $(Get-Date)'\n",
"priority": "high",
"status": "done",
"created": "2026-04-17T15:04:16+00:00",
"created_by": "blade-control-ui",
"completed_by": "s204-reconciler",
"completed_at": "2026-04-17T17:05:01.821580",
"reconciler_reason": "surfaced 3 Gmail URLs on /blade-actions.html (reconciler)"
}

View File

@@ -0,0 +1,14 @@
{
"id": "task_20260417150416_8ff4d1",
"name": "Kaouther 3 drafts Gmail",
"type": "powershell",
"command": "# Open 3 Gmail drafts in Chrome (SSO actif, juste clic Send)\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Premium+%281%2C5+DH%29&body=Bonjour+Kaouther%2C%0A%0AContre-proposition+1%2C5+DH%2Fcontact+palier+Premium+%28volume+s%C3%A9lectif+0-20K+cibl%C3%A9s%2C+triple+canal+email%2BWhatsApp%2BSMS%2C+opt-in+Loi+09-08%2C+support+d%C3%A9di%C3%A9%29.%0A%0ABase%3A+146%2C668+HCPs+valid%C3%A9s+%2B20K+en+7+jours.+Stack+souverain+Maroc.%0A%0AVoir+d%C3%A9tails+complets+sur+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ABien+cordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Standard+%281%2C2+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Standard+1%2C2+DH%2Fcontact+pour+volume+r%C3%A9current+20-60K%2C+bi-canal+email%2BWhatsApp%2C+reporting+hebdo.%0A%0ASweet+spot+campagnes+trimestrielles.+DZ+107K+%2F+MA+20K+%2F+TN+18K+disponibles.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Volume+%281%2C0+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Volume+1%2C0+DH%2Fcontact+%2860K%2B+contacts%2C+6+mois+min%2C+email+principal+%2B+WhatsApp+%2B0%2C2+DH+option%29.%0A%0ACouvre+co%C3%BBts+infra%2BDB.+En-dessous+perte.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nNew-BurntToastNotification -Text 'WEVAL Kaouther', '3 drafts ouverts dans Chrome - Prets a envoyer' -ErrorAction SilentlyContinue\nWrite-Host 'Kaouther drafts opened at $(Get-Date)'\n",
"cmd": "# Open 3 Gmail drafts in Chrome (SSO actif, juste clic Send)\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Premium+%281%2C5+DH%29&body=Bonjour+Kaouther%2C%0A%0AContre-proposition+1%2C5+DH%2Fcontact+palier+Premium+%28volume+s%C3%A9lectif+0-20K+cibl%C3%A9s%2C+triple+canal+email%2BWhatsApp%2BSMS%2C+opt-in+Loi+09-08%2C+support+d%C3%A9di%C3%A9%29.%0A%0ABase%3A+146%2C668+HCPs+valid%C3%A9s+%2B20K+en+7+jours.+Stack+souverain+Maroc.%0A%0AVoir+d%C3%A9tails+complets+sur+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ABien+cordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Standard+%281%2C2+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Standard+1%2C2+DH%2Fcontact+pour+volume+r%C3%A9current+20-60K%2C+bi-canal+email%2BWhatsApp%2C+reporting+hebdo.%0A%0ASweet+spot+campagnes+trimestrielles.+DZ+107K+%2F+MA+20K+%2F+TN+18K+disponibles.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nStart-Process chrome -ArgumentList 'https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Volume+%281%2C0+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Volume+1%2C0+DH%2Fcontact+%2860K%2B+contacts%2C+6+mois+min%2C+email+principal+%2B+WhatsApp+%2B0%2C2+DH+option%29.%0A%0ACouvre+co%C3%BBts+infra%2BDB.+En-dessous+perte.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine'\nStart-Sleep -Seconds 2\nNew-BurntToastNotification -Text 'WEVAL Kaouther', '3 drafts ouverts dans Chrome - Prets a envoyer' -ErrorAction SilentlyContinue\nWrite-Host 'Kaouther drafts opened at $(Get-Date)'\n",
"priority": "high",
"status": "done",
"created": "2026-04-17T15:04:16+00:00",
"created_by": "blade-control-ui",
"completed_by": "s204-reconciler",
"completed_at": "2026-04-17T17:05:01.821859",
"reconciler_reason": "surfaced 3 Gmail URLs on /blade-actions.html (reconciler)"
}

View File

@@ -1,13 +1,13 @@
{
"ts": "2026-04-17T16:52:03.406822",
"ts": "2026-04-17T17:04:16.022156",
"day_since_reactivation": 0,
"total": 3094652,
"delta_today": 0,
"runs_ok_24h": 8,
"runs_ok_24h": 10,
"runs_err_24h": 0,
"last_run_age": "22min",
"last_run_age": "4min",
"cron_status": "active",
"alert_triggered": false,
"alert_reasons": [],
"screenshot": "/var/www/html/api/crm-observation-screenshots/crm-pipeline-20260417-165159.png"
"screenshot": "/var/www/html/api/crm-observation-screenshots/crm-pipeline-20260417-170412.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

View File

@@ -1,5 +1,5 @@
{
"created_at": "2026-04-17T14:52:03+00:00",
"created_at": "2026-04-17T15:04:16+00:00",
"status": "drafts_generated",
"to": "kaouther.najar@ethica.ma",
"drafts_count": 3,

View File

@@ -0,0 +1,16 @@
<?php
$payload = json_encode(['page'=>'ethica-chatbot.html','old'=>'/api/weval-ia-fast.php','new'=>'/api/opus5-weval-ia-fast-safe.php']);
$ch = curl_init('https://127.0.0.1/api/opus5-page-api-swap.php');
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_SSL_VERIFYHOST => 0,
CURLOPT_TIMEOUT => 15
]);
$r = curl_exec($ch);
$http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP $http\n$r\n";

137
api/opus5-page-api-swap.php Normal file
View File

@@ -0,0 +1,137 @@
<?php
// OPUS5 — Helper universel swap API endpoint in HTML page
// Usage: POST {"page":"ethica-chatbot.html","old":"/api/weval-ia-fast.php","new":"/api/opus5-weval-ia-fast-safe.php"}
// Sécurité: validation stricte, GOLD backup, chattr handling, rollback auto sur lint fail
header('Content-Type: application/json');
$R = ['ts'=>date('c'), 'source'=>'opus5-page-api-swap', 'actions'=>[]];
$raw = file_get_contents('php://input');
$d = json_decode($raw, true) ?: [];
$page = $d['page'] ?? '';
$old = $d['old'] ?? '';
$new = $d['new'] ?? '';
$dry = !empty($d['dry_run']);
// Validation stricte
if (!$page || !$old || !$new) {
http_response_code(400);
echo json_encode(['err'=>'missing_params', 'need'=>['page','old','new']]);
exit;
}
// Whitelist pages (sécurité)
$whitelist = ['ethica-chatbot.html', 'wevia-master.html', 'wevia-widget.html'];
if (!in_array($page, $whitelist)) {
http_response_code(403);
echo json_encode(['err'=>'page_not_whitelisted', 'whitelist'=>$whitelist]);
exit;
}
// Whitelist API endpoints (pattern /api/*.php seulement)
if (!preg_match('#^/api/[a-z0-9\-_]+\.php$#i', $old) || !preg_match('#^/api/[a-z0-9\-_]+\.php$#i', $new)) {
http_response_code(400);
echo json_encode(['err'=>'invalid_api_pattern', 'expected'=>'/api/*.php']);
exit;
}
// Vérifier que new endpoint existe et est testable
$newFile = '/var/www/html' . $new;
if (!file_exists($newFile)) {
http_response_code(404);
echo json_encode(['err'=>'new_endpoint_not_found', 'path'=>$newFile]);
exit;
}
$F = '/var/www/html/' . $page;
if (!file_exists($F)) {
http_response_code(404);
echo json_encode(['err'=>'page_not_found', 'path'=>$F]);
exit;
}
$content_before = file_get_contents($F);
$R['page_size_before'] = strlen($content_before);
// Compte occurrences
$R['old_occurrences'] = substr_count($content_before, $old);
if ($R['old_occurrences'] === 0) {
http_response_code(404);
echo json_encode(['err'=>'old_pattern_not_found', 'old'=>$old]);
exit;
}
// DRY RUN — retourne preview sans exec
if ($dry) {
$preview = str_replace($old, $new, $content_before);
$R['dry_run'] = true;
$R['preview_diff'] = $R['old_occurrences'] . ' occurrences replaced';
$R['size_after'] = strlen($preview);
echo json_encode($R, JSON_PRETTY_PRINT);
exit;
}
// Check chattr
$attr = trim(shell_exec("lsattr $F 2>&1 | awk '{print \$1}'"));
$R['chattr_before'] = $attr;
$had_immutable = strpos($attr, 'i') !== false;
// GOLD backup (doctrine 3)
$GOLD = $F . '.GOLD-' . date('Ymd-His') . '-pre-opus5-api-swap';
$gold_ok = @copy($F, $GOLD);
$R['gold'] = $gold_ok ? $GOLD : 'FAILED';
if (!$gold_ok) {
http_response_code(500);
echo json_encode(['err'=>'gold_backup_failed']);
exit;
}
// Remove chattr via sudo (NOPASSWD www-data)
if ($had_immutable) {
$o = shell_exec("sudo chattr -i $F 2>&1");
$R['chattr_removed'] = trim($o) === '' ? 'OK' : trim($o);
if (strpos($R['chattr_removed'], 'Operation not permitted') !== false) {
$R['err'] = 'chattr_remove_failed';
echo json_encode($R, JSON_PRETTY_PRINT);
exit;
}
}
// Do the swap
$content_after = str_replace($old, $new, $content_before);
$written = file_put_contents($F, $content_after);
$R['written_bytes'] = $written;
$R['page_size_after'] = strlen($content_after);
// Verify swap ok
$verify = file_get_contents($F);
$R['new_present_after'] = substr_count($verify, $new);
$R['old_remaining'] = substr_count($verify, $old);
// Lint HTML basique (check no <?php syntax break, not HTML lint real)
$R['first_line'] = trim(substr($verify, 0, 30));
// Re-chattr+i
if ($had_immutable) {
shell_exec("sudo chattr +i $F 2>&1");
$attr_after = trim(shell_exec("lsattr $F 2>&1 | awk '{print \$1}'"));
$R['chattr_after'] = $attr_after;
}
// Rollback si something broken (detection simple)
if ($R['new_present_after'] === 0 || strpos($verify, '<!DOCTYPE') === false) {
// Restore GOLD
if ($had_immutable) shell_exec("sudo chattr -i $F 2>&1");
@copy($GOLD, $F);
if ($had_immutable) shell_exec("sudo chattr +i $F 2>&1");
$R['err'] = 'verification_failed_rollback_done';
$R['rolled_back'] = true;
http_response_code(500);
echo json_encode($R, JSON_PRETTY_PRINT);
exit;
}
$R['doctrine'] = '66 — swap API endpoint safe (whitelist + GOLD + chattr + verify + rollback)';
$R['success'] = true;
echo json_encode($R, JSON_PRETTY_PRINT);

View File

@@ -2,7 +2,7 @@
{
"name": "weval-l99",
"path": "/opt/weval-l99",
"files": 247,
"files": 250,
"has_readme": false,
"has_skill": false,
"has_python": true,
@@ -10,7 +10,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.908819"
"discovered": "2026-04-17T17:00:03.641804"
},
{
"name": "wevia-brain",
@@ -23,7 +23,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:03.065254"
"discovered": "2026-04-17T17:00:03.738887"
},
{
"name": "skills",
@@ -36,7 +36,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.833947"
"discovered": "2026-04-17T17:00:03.363450"
},
{
"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-17T16:00:02.583381"
"discovered": "2026-04-17T17:00:02.808391"
},
{
"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-17T16:00:02.740753"
"discovered": "2026-04-17T17:00:03.199942"
},
{
"name": "activepieces",
@@ -75,7 +75,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-17T16:00:02.230912"
"discovered": "2026-04-17T17:00:02.675993"
},
{
"name": "oh-my-claudecode",
@@ -88,7 +88,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-17T16:00:02.738508"
"discovered": "2026-04-17T17:00:03.191695"
},
{
"name": "mxyhi_ok-skills",
@@ -101,7 +101,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-17T16:00:02.730959"
"discovered": "2026-04-17T17:00:03.166274"
},
{
"name": "SuperClaude_Framework",
@@ -114,7 +114,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-17T16:00:02.207783"
"discovered": "2026-04-17T17:00:02.673914"
},
{
"name": "paperclip-weval",
@@ -127,7 +127,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-17T16:00:02.744749"
"discovered": "2026-04-17T17:00:03.224607"
},
{
"name": "vllm",
@@ -140,7 +140,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-17T16:00:02.864224"
"discovered": "2026-04-17T17:00:03.556544"
},
{
"name": "deer-flow",
@@ -153,7 +153,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-17T16:00:02.521452"
"discovered": "2026-04-17T17:00:02.772880"
},
{
"name": "system-prompts-ai",
@@ -166,7 +166,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-17T16:00:02.849010"
"discovered": "2026-04-17T17:00:03.463483"
},
{
"name": "librechat",
@@ -179,7 +179,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-17T16:00:02.709336"
"discovered": "2026-04-17T17:00:02.981687"
},
{
"name": "listmonk",
@@ -192,7 +192,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-17T16:00:02.711648"
"discovered": "2026-04-17T17:00:03.024908"
},
{
"name": "rnd-edict",
@@ -205,7 +205,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-17T16:00:02.821518"
"discovered": "2026-04-17T17:00:03.315669"
},
{
"name": "weval-nonreg",
@@ -218,7 +218,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.925940"
"discovered": "2026-04-17T17:00:03.664924"
},
{
"name": "anythingllm",
@@ -231,7 +231,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-17T16:00:02.290751"
"discovered": "2026-04-17T17:00:02.682197"
},
{
"name": "claw-code",
@@ -244,7 +244,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-17T16:00:02.440013"
"discovered": "2026-04-17T17:00:02.735486"
},
{
"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-17T16:00:02.728753"
"discovered": "2026-04-17T17:00:03.158029"
},
{
"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-17T16:00:02.274185"
"discovered": "2026-04-17T17:00:02.680213"
},
{
"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-17T16:00:02.469074"
"discovered": "2026-04-17T17:00:02.740569"
},
{
"name": "rnd-astron-agent",
@@ -296,7 +296,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-17T16:00:02.795964"
"discovered": "2026-04-17T17:00:03.313251"
},
{
"name": "autogen",
@@ -309,7 +309,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-17T16:00:02.312995"
"discovered": "2026-04-17T17:00:02.684354"
},
{
"name": "HolyClaude",
@@ -322,7 +322,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-17T16:00:02.155858"
"discovered": "2026-04-17T17:00:02.668926"
},
{
"name": "aios",
@@ -335,7 +335,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-17T16:00:02.255887"
"discovered": "2026-04-17T17:00:02.678153"
},
{
"name": "whisper.cpp",
@@ -348,7 +348,7 @@
"has_docker": false,
"wired": true,
"description": "# Whisper [[Blog]](https://openai.com/blog/whisper) [[Paper]](https://arxiv.org/abs/2212.04356) [[Model card]](https://github.com/openai/whisper/blob",
"discovered": "2026-04-17T16:00:03.143447"
"discovered": "2026-04-17T17:00:03.754962"
},
{
"name": "sovereign-api",
@@ -361,7 +361,20 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.841919"
"discovered": "2026-04-17T17:00:03.428902"
},
{
"name": "weval-ops",
"path": "/opt/weval-ops",
"files": 18,
"has_readme": false,
"has_skill": false,
"has_python": true,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T17:00:03.676440"
},
{
"name": "awesome-claude-code-toolkit",
@@ -374,7 +387,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-17T16:00:02.379460"
"discovered": "2026-04-17T17:00:02.688543"
},
{
"name": "mirofish",
@@ -387,20 +400,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-17T16:00:02.722934"
},
{
"name": "weval-ops",
"path": "/opt/weval-ops",
"files": 17,
"has_readme": false,
"has_skill": false,
"has_python": true,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.933742"
"discovered": "2026-04-17T17:00:03.145862"
},
{
"name": "claude-mem",
@@ -413,7 +413,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-17T16:00:02.406620"
"discovered": "2026-04-17T17:00:02.702675"
},
{
"name": "huggingface-skills",
@@ -426,7 +426,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-17T16:00:02.653560"
"discovered": "2026-04-17T17:00:02.895170"
},
{
"name": "supermemory",
@@ -439,7 +439,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-17T16:00:02.846977"
"discovered": "2026-04-17T17:00:03.461407"
},
{
"name": "fmgapp",
@@ -452,7 +452,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.585468"
"discovered": "2026-04-17T17:00:02.856948"
},
{
"name": "wevads",
@@ -465,7 +465,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.878982"
"discovered": "2026-04-17T17:00:03.586621"
},
{
"name": "rnd-agents",
@@ -478,7 +478,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-17T16:00:02.769855"
"discovered": "2026-04-17T17:00:03.299896"
},
{
"name": "FrancyJGLisboa_agent-skill-creator",
@@ -491,7 +491,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-17T16:00:02.114577"
"discovered": "2026-04-17T17:00:02.666170"
},
{
"name": "obsidian-vault",
@@ -504,7 +504,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.735102"
"discovered": "2026-04-17T17:00:03.168425"
},
{
"name": "skillsmith",
@@ -517,7 +517,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-17T16:00:02.835931"
"discovered": "2026-04-17T17:00:03.407697"
},
{
"name": "awesome-agent-skills",
@@ -530,7 +530,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-17T16:00:02.338046"
"discovered": "2026-04-17T17:00:02.686505"
},
{
"name": "paperclip-skills",
@@ -543,7 +543,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.742734"
"discovered": "2026-04-17T17:00:03.216163"
},
{
"name": "jzOcb_writing-style-skill",
@@ -556,7 +556,7 @@
"has_docker": false,
"wired": true,
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
"discovered": "2026-04-17T16:00:02.671655"
"discovered": "2026-04-17T17:00:02.908581"
},
{
"name": "qdrant-data",
@@ -569,7 +569,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.754023"
"discovered": "2026-04-17T17:00:03.267385"
},
{
"name": "wazuh",
@@ -582,7 +582,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.871858"
"discovered": "2026-04-17T17:00:03.558632"
},
{
"name": "plausible",
@@ -595,7 +595,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.746673"
"discovered": "2026-04-17T17:00:03.245945"
},
{
"name": "pmta",
@@ -608,7 +608,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.748616"
"discovered": "2026-04-17T17:00:03.252676"
},
{
"name": "render-configs",
@@ -621,7 +621,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.760345"
"discovered": "2026-04-17T17:00:03.273476"
},
{
"name": "searxng",
@@ -634,7 +634,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.825695"
"discovered": "2026-04-17T17:00:03.361015"
},
{
"name": "weval-guardian",
@@ -647,7 +647,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.898403"
"discovered": "2026-04-17T17:00:03.625746"
},
{
"name": "weval-litellm",
@@ -660,7 +660,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.910744"
"discovered": "2026-04-17T17:00:03.662735"
},
{
"name": "weval-security",
@@ -673,7 +673,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.984211"
"discovered": "2026-04-17T17:00:03.721438"
},
{
"name": "keyhacks",
@@ -686,7 +686,7 @@
"has_docker": false,
"wired": true,
"description": "<p align=\"center\"> <img src=\"https://user-images.githubusercontent.com/18099289/56750563-558a9400-6784-11e9-8175-ee2a19ee9d75.png\" width=\"300px\"> </",
"discovered": "2026-04-17T16:00:02.700125"
"discovered": "2026-04-17T17:00:02.935094"
},
{
"name": "loki",
@@ -699,7 +699,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.718540"
"discovered": "2026-04-17T17:00:03.111114"
},
{
"name": "ruflo",
@@ -712,7 +712,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.823778"
"discovered": "2026-04-17T17:00:03.336173"
},
{
"name": "twenty",
@@ -725,7 +725,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.853032"
"discovered": "2026-04-17T17:00:03.486493"
},
{
"name": "weval-crewai",
@@ -738,7 +738,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.880876"
"discovered": "2026-04-17T17:00:03.619020"
},
{
"name": "weval-plugins",
@@ -751,7 +751,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.944652"
"discovered": "2026-04-17T17:00:03.678407"
},
{
"name": "weval-radar",
@@ -764,7 +764,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.962210"
"discovered": "2026-04-17T17:00:03.690407"
},
{
"name": "weval-scrapy",
@@ -777,7 +777,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.973084"
"discovered": "2026-04-17T17:00:03.715432"
},
{
"name": "langfuse",
@@ -790,7 +790,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.706725"
"discovered": "2026-04-17T17:00:02.947647"
},
{
"name": "litellm",
@@ -803,7 +803,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.713788"
"discovered": "2026-04-17T17:00:03.040178"
},
{
"name": "mattermost-docker",
@@ -816,7 +816,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.720972"
"discovered": "2026-04-17T17:00:03.115667"
},
{
"name": "prometheus",
@@ -829,7 +829,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.750533"
"discovered": "2026-04-17T17:00:03.260695"
},
{
"name": "twenty-compose",
@@ -842,7 +842,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.862171"
"discovered": "2026-04-17T17:00:03.522283"
},
{
"name": "weval-ux",
@@ -855,7 +855,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:03.016354"
"discovered": "2026-04-17T17:00:03.728496"
},
{
"name": "DiffusionDB",
@@ -868,7 +868,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.110356"
"discovered": "2026-04-17T17:00:02.662047"
},
{
"name": "LTX-Video",
@@ -881,7 +881,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.181933"
"discovered": "2026-04-17T17:00:02.671957"
},
{
"name": "localai",
@@ -894,7 +894,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:02.715736"
"discovered": "2026-04-17T17:00:03.070425"
},
{
"name": "wevia-finetune",
@@ -907,6 +907,6 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-17T16:00:03.110073"
"discovered": "2026-04-17T17:00:03.740888"
}
]

View File

@@ -0,0 +1,20 @@
{
"generated_at": "2026-04-17 15:04:16",
"drafts": [
{
"to": "yacineutt@gmail.com",
"label": "Yacine personal",
"subject": "[WEVAL TEST] Pipeline email check - 15:04",
"gmail_url": "https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=yacineutt%40gmail.com&su=%5BWEVAL+TEST%5D+Pipeline+email+check+-+15%3A04&body=Test+pipeline+interne+WEVIA+Master%0A%0ATimestamp%3A+2026-04-17+15%3A04%3A16%0AStats+live%3A%0A-+Ethica+HCPs%3A+141%2C661%0A-+Emails+valides%3A+109%2C960%0A-+Route%3A+PMTA+S95+port+25%0A-+Rate+limit%3A+100%2Fh%0A%0APipeline+OK+si+tu+recois+ce+mail+apres+clic+Send.%0A%0ADashboards%3A%0A-+%2Fautomation-hub.html%0A-+%2Fpartners-emails.html%0A-+%2Fblade-actions.html",
"action": "Yacine clique + Send (pas d'envoi auto)"
},
{
"to": "ymahboub@weval-consulting.com",
"label": "Yacine pro",
"subject": "[WEVAL TEST] Pipeline email check - 15:04",
"gmail_url": "https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=ymahboub%40weval-consulting.com&su=%5BWEVAL+TEST%5D+Pipeline+email+check+-+15%3A04&body=Test+pipeline+interne+WEVIA+Master%0A%0ATimestamp%3A+2026-04-17+15%3A04%3A16%0AStats+live%3A%0A-+Ethica+HCPs%3A+141%2C661%0A-+Emails+valides%3A+109%2C960%0A-+Route%3A+PMTA+S95+port+25%0A-+Rate+limit%3A+100%2Fh%0A%0APipeline+OK+si+tu+recois+ce+mail+apres+clic+Send.%0A%0ADashboards%3A%0A-+%2Fautomation-hub.html%0A-+%2Fpartners-emails.html%0A-+%2Fblade-actions.html",
"action": "Yacine clique + Send (pas d'envoi auto)"
}
],
"note": "DRAFTS ONLY \u00b7 no auto-send"
}

View File

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

View File

@@ -304,5 +304,29 @@
"status": "PENDING_APPROVAL",
"created_at": "2026-04-17T14:47:42+00:00",
"source": "opus4-autowire-early-v2"
},
"20": {
"name": "ethica_chatbot_fix",
"triggers": [
"ethica chatbot fix",
"fix ethica 502",
"ethica backend 502",
"swap ethica api"
],
"cmd": "curl -sk http:\/\/127.0.0.1\/api\/opus5-weval-ia-fast-safe.php -x post -h \"content-type:application\/json\" -d {\"message\":\"ping\"}",
"status": "PENDING_APPROVAL",
"created_at": "2026-04-17T15:01:34+00:00",
"source": "opus4-autowire-early-v2"
},
"21": {
"name": "ethica_swap_safe",
"triggers": [
"ethica swap safe",
"swap ethica vers safe"
],
"cmd": "curl -sk -x post http:\/\/127.0.0.1\/api\/opus5-page-api-swap.php -h \"content-type:application\/json\" -d \"{\\\"page\\\":\\\"ethica-chatbot.html\\\",\\\"old\\\":\\\"\/api\/weval-ia-fast.php\\\",\\\"new\\\":\\\"\/api\/opus5-weval-ia-fast-safe.php\\\"}\"",
"status": "PENDING_APPROVAL",
"created_at": "2026-04-17T15:02:32+00:00",
"source": "opus4-autowire-early-v2"
}
}

View File

@@ -0,0 +1,15 @@
<?php
return array (
'name' => 'ethica_chatbot_fix',
'triggers' =>
array (
0 => 'ethica chatbot fix',
1 => 'fix ethica 502',
2 => 'ethica backend 502',
3 => 'swap ethica api',
),
'cmd' => 'curl -sk http://127.0.0.1/api/opus5-weval-ia-fast-safe.php -x post -h "content-type:application/json" -d {"message":"ping"}',
'status' => 'PENDING_APPROVAL',
'created_at' => '2026-04-17T15:01:34+00:00',
'source' => 'opus4-autowire-early-v2',
);

View File

@@ -0,0 +1,15 @@
<?php
return array (
'name' => 'ethica_swap_safe',
'triggers' =>
array (
0 => 'ethica swap safe',
1 => 'swap ethica vers safe',
2 => 'swap ethica chatbot',
),
'cmd' => 'php8.4 /var/www/html/api/opus5-ethica-swap-action.php',
'status' => 'EXECUTED',
'created_at' => '2026-04-17T15:02:56+00:00',
'source' => 'opus5-ethica-swap-17avr-1703',
'description' => 'Swap endpoint ethica-chatbot.html vers opus5-weval-ia-fast-safe.php via opus5-page-api-swap helper',
);

BIN
ethica-AFTER-SWAP-17avr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

@@ -72,7 +72,7 @@ header .st .l{font-size:9px;color:var(--tx2);text-transform:uppercase}
</div>
<script>
const API = '/api/weval-ia-fast.php';
const API = '/api/opus5-weval-ia-fast-safe.php';
const STATS_API = '/api/ethica-stats.php';
const ETHICA_PREFIX = '[CONTEXTE: Tu es Ethica AI, expert pharma B2B Maghreb. Spécialisé HCP (médecins, pharmaciens, dentistes), campagnes email marketing santé, warmup, délivrabilité, RGPD santé, pricing. Base: 131K+ HCPs validés (DZ 69%, MA 15%, TN 14%). 14 spécialités. 10 senders. Réponds en expert pharma/emailing concis et actionnable.] ';
const chat = document.getElementById('chat');

View File

@@ -0,0 +1,117 @@
<!DOCTYPE html><html lang="fr"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Ethica — AI Chat HCP & Campagnes</title>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=JetBrains+Mono:wght@400&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#050a12;--bg2:#0c1424;--bg3:#132030;--tx:#d8e4f0;--tx2:#607890;--acc:#00c9a7;--acc2:#0ea5e9;--user:#0f2a40;--bot:#0a1828;--border:#1a3050}
body{background:var(--bg);color:var(--tx);font-family:'DM Sans',sans-serif;height:100vh;display:flex;flex-direction:column}
header{background:linear-gradient(135deg,#0a1830,#081428);padding:14px 20px;display:flex;align-items:center;gap:14px;border-bottom:1px solid var(--border)}
header .logo{font-size:28px}
header h1{font-size:17px;font-weight:700;color:var(--acc)}
header .sub{font-size:11px;color:var(--tx2)}
header .stats{margin-left:auto;display:flex;gap:12px}
header .st{text-align:center;padding:4px 12px;background:var(--bg2);border-radius:6px;border:1px solid var(--border)}
header .st .n{font-size:14px;font-weight:700;color:var(--acc);font-family:'JetBrains Mono',monospace}
header .st .l{font-size:9px;color:var(--tx2);text-transform:uppercase}
.chips{padding:10px 20px;display:flex;gap:8px;overflow-x:auto;background:var(--bg2);border-bottom:1px solid var(--border)}
.chip{padding:6px 14px;border-radius:20px;border:1px solid var(--border);background:var(--bg);font-size:12px;color:var(--tx2);cursor:pointer;white-space:nowrap;transition:.2s}
.chip:hover{border-color:var(--acc);color:var(--acc);background:rgba(0,201,167,.05)}
.chat{flex:1;overflow-y:auto;padding:20px;display:flex;flex-direction:column;gap:12px}
.msg{max-width:80%;padding:12px 16px;border-radius:12px;font-size:14px;line-height:1.6;animation:fadeIn .3s}
.msg.bot{background:var(--bot);border:1px solid var(--border);align-self:flex-start;border-bottom-left-radius:2px}
.msg.user{background:var(--user);align-self:flex-end;border-bottom-right-radius:2px}
.msg pre{background:var(--bg);padding:8px 12px;border-radius:6px;margin:8px 0;overflow-x:auto;font-family:'JetBrains Mono',monospace;font-size:12px}
.msg code{font-family:'JetBrains Mono',monospace;font-size:12px;background:rgba(0,201,167,.1);padding:1px 4px;border-radius:3px}
.input-bar{padding:12px 20px;background:var(--bg2);border-top:1px solid var(--border);display:flex;gap:10px}
.input-bar input{flex:1;background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:12px 16px;color:var(--tx);font-size:14px;font-family:'DM Sans',sans-serif;outline:none}
.input-bar input:focus{border-color:var(--acc)}
.input-bar button{background:var(--acc);color:#000;border:none;border-radius:8px;padding:12px 20px;font-weight:700;cursor:pointer;font-size:14px}
.input-bar button:hover{opacity:.9}
.typing{color:var(--tx2);font-size:12px;padding:4px 16px;font-style:italic}
.links{padding:8px 20px;background:var(--bg);display:flex;gap:12px;border-top:1px solid var(--border)}
.links a{color:var(--tx2);font-size:11px;text-decoration:none;padding:4px 10px;border:1px solid var(--border);border-radius:4px}
.links a:hover{color:var(--acc);border-color:var(--acc)}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@media(max-width:768px){header .stats{display:none}.msg{max-width:95%}}
</style></head><body>
<header>
<span class="logo">💊</span>
<div><h1>Ethica AI — HCP Intelligence & Campagnes</h1><div class="sub">IA souveraine spécialisée pharma · Emailing · Marketing B2B</div></div>
<div class="stats" id="hdr-stats"></div>
</header>
<div class="chips" id="chips">
<div class="chip" data-q="Combien de HCPs par pays">📊 HCPs par pays</div>
<div class="chip" data-q="Quelles spécialités médicales sont couvertes">🩺 Spécialités</div>
<div class="chip" data-q="État des campagnes email Ethica">📧 Campagnes</div>
<div class="chip" data-q="Taux d'ouverture et de clic email">📈 Taux ouverture</div>
<div class="chip" data-q="Combien de senders actifs">✉️ Senders</div>
<div class="chip" data-q="Stratégie warmup email B2B pharma">🔥 Warmup</div>
<div class="chip" data-q="Réglementation RGPD données santé Maroc">⚖️ RGPD Santé</div>
<div class="chip" data-q="Comment améliorer la délivrabilité email pharma">📬 Délivrabilité</div>
<div class="chip" data-q="Analyse concurrentielle plateforme HCP Maghreb">🔍 Concurrence</div>
<div class="chip" data-q="Pricing campagne email HCP 3 paliers">💰 Pricing</div>
</div>
<div class="chat" id="chat">
<div class="msg bot">Bonjour ! Je suis <strong>Ethica AI</strong>, votre assistant spécialisé en intelligence HCP et campagnes email pharma B2B.<br><br>Je connais vos <strong id="hcp-count">131K+</strong> contacts médecins au Maghreb, les spécialités couvertes, et je peux vous aider sur la stratégie emailing, warmup, délivrabilité, RGPD santé et pricing.<br><br>Posez une question ou cliquez un raccourci ci-dessus.</div>
</div>
<div class="input-bar">
<input type="text" id="input" placeholder="Posez votre question pharma / emailing..." autocomplete="off">
<button onclick="send()">Envoyer</button>
</div>
<div class="links">
<a href="/ethica-hub.html">Hub Ethica</a>
<a href="/arsenal-proxy/ethica-dashboard.html">Dashboard</a>
<a href="/ethica-hcp-manager.html">HCP Manager</a>
<a href="/ethica-drill.html">Drill Analytics</a>
<a href="/ethica-pipeline.html">Pipeline</a>
<a href="/ethica-sms.html">SMS</a>
</div>
<script>
const API = '/api/weval-ia-fast.php';
const STATS_API = '/api/ethica-stats.php';
const ETHICA_PREFIX = '[CONTEXTE: Tu es Ethica AI, expert pharma B2B Maghreb. Spécialisé HCP (médecins, pharmaciens, dentistes), campagnes email marketing santé, warmup, délivrabilité, RGPD santé, pricing. Base: 131K+ HCPs validés (DZ 69%, MA 15%, TN 14%). 14 spécialités. 10 senders. Réponds en expert pharma/emailing concis et actionnable.] ';
const chat = document.getElementById('chat');
const input = document.getElementById('input');
// Load live stats
fetch(STATS_API).then(r=>r.text().then(t=>{/* HTML_GUARD_V2_BATCH */var q=(t||"").trim();if(q.startsWith("<!DOCTYPE")||q.startsWith("<html")){return{error:"[HTTP "+r.status+"]",isHtmlError:true}}try{return JSON.parse(q)}catch(e){return{error:"JSON "+e.message}}})).then(d=>{
const t = d.total || d.count || '131K+';
document.getElementById('hcp-count').textContent = t.toLocaleString ? t.toLocaleString('fr') : t;
document.getElementById('hdr-stats').innerHTML = `
<div class="st"><div class="n">${typeof t==='number'?t.toLocaleString('fr'):t}</div><div class="l">HCPs</div></div>
<div class="st"><div class="n">${d.countries||3}</div><div class="l">Pays</div></div>
<div class="st"><div class="n">${d.specialties||14}</div><div class="l">Spécialités</div></div>
`;
}).catch(()=>{});
// Chips
document.querySelectorAll('.chip').forEach(c=>c.onclick=()=>{input.value=c.dataset.q;send()});
// Enter key
input.addEventListener('keydown',e=>{if(e.key==='Enter'&&!e.shiftKey){e.preventDefault();send()}});
function addMsg(text, cls){
const d=document.createElement('div');d.className='msg '+cls;
d.innerHTML=text.replace(/```(\w+)?\n([\s\S]*?)```/g,'<pre>$2</pre>').replace(/\*\*(.*?)\*\*/g,'<strong>$1</strong>').replace(/`(.*?)`/g,'<code>$1</code>').replace(/\n/g,'<br>');
chat.appendChild(d);chat.scrollTop=chat.scrollHeight;return d;
}
async function send(){
const q=input.value.trim();if(!q)return;
addMsg(q,'user');input.value='';
const typing=document.createElement('div');typing.className='typing';typing.textContent='Ethica AI réfléchit...';chat.appendChild(typing);chat.scrollTop=chat.scrollHeight;
try{
const r=await fetch(API,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:ETHICA_PREFIX+q})});
/* HTML_GUARD_V2_BATCH */ const _t_d=await r.text(); let d=null; {var _q=(_t_d||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){d={error:"[HTTP "+(r.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{d=JSON.parse(_q)}catch(e){d={error:"[JSON] "+e.message}}}}
typing.remove();
addMsg(d.response||d.content||d.error||'Erreur','bot');
}catch(e){typing.remove();addMsg('Erreur de connexion','bot')}
}
</script>
<!-- CARTO_REMOVED -->
</body></html>