auto-sync-1705
This commit is contained in:
File diff suppressed because it is too large
Load Diff
14
api/blade-tasks/task_20260417150051_bca114.json
Normal file
14
api/blade-tasks/task_20260417150051_bca114.json
Normal 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)"
|
||||
}
|
||||
14
api/blade-tasks/task_20260417150416_01644a.json
Normal file
14
api/blade-tasks/task_20260417150416_01644a.json
Normal 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)"
|
||||
}
|
||||
14
api/blade-tasks/task_20260417150416_8ff4d1.json
Normal file
14
api/blade-tasks/task_20260417150416_8ff4d1.json
Normal 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)"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
BIN
api/crm-observation-screenshots/crm-pipeline-20260417-170412.png
Normal file
BIN
api/crm-observation-screenshots/crm-pipeline-20260417-170412.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 284 KiB |
@@ -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,
|
||||
|
||||
16
api/opus5-ethica-swap-action.php
Normal file
16
api/opus5-ethica-swap-action.php
Normal 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
137
api/opus5-page-api-swap.php
Normal 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);
|
||||
@@ -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 👋   | [中文](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 [](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) [](https://agent.xfyun.cn) <div align=\"center\"> [ | [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"
|
||||
}
|
||||
]
|
||||
20
api/test-email-drafts.json
Normal file
20
api/test-email-drafts.json
Normal 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"
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
15
api/wired-pending/intent-opus4-ethica_chatbot_fix.php
Normal file
15
api/wired-pending/intent-opus4-ethica_chatbot_fix.php
Normal 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',
|
||||
);
|
||||
15
api/wired-pending/intent-opus4-ethica_swap_safe.php
Normal file
15
api/wired-pending/intent-opus4-ethica_swap_safe.php
Normal 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
BIN
ethica-AFTER-SWAP-17avr.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
@@ -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');
|
||||
|
||||
117
ethica-chatbot.html.GOLD-20260417-150302-pre-opus5-api-swap
Normal file
117
ethica-chatbot.html.GOLD-20260417-150302-pre-opus5-api-swap
Normal 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>
|
||||
Reference in New Issue
Block a user