auto-sync via WEVIA git_sync_all intent 2026-04-21T10:28:16+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-21T10:20:02.361108",
|
||||
"generated_at": "2026-04-21T10:25:01.434641",
|
||||
"stats": {
|
||||
"total": 48,
|
||||
"pending": 31,
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,281 @@
|
||||
{
|
||||
"ts": "2026-04-21T08:25:01+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 1.03,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 11952,
|
||||
"ram_free_mb": 19382,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "116G",
|
||||
"disk_free": "29G",
|
||||
"disk_pct": "81%",
|
||||
"fpm_workers": 140,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.2,
|
||||
"disk_pct": "81%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 12067
|
||||
},
|
||||
"pmta": [
|
||||
{
|
||||
"name": "SER6",
|
||||
"ip": "110.239.84.121",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER7",
|
||||
"ip": "110.239.65.64",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER8",
|
||||
"ip": "182.160.55.107",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER9",
|
||||
"ip": "110.239.86.68",
|
||||
"status": "DOWN"
|
||||
}
|
||||
],
|
||||
"assets": {
|
||||
"html_pages": 293,
|
||||
"php_apis": 774,
|
||||
"wiki_entries": 1928,
|
||||
"vault_doctrines": 59,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
"tools": {
|
||||
"total": 627,
|
||||
"registry_version": "?"
|
||||
},
|
||||
"sovereign": {
|
||||
"status": "UP",
|
||||
"providers": [
|
||||
"Cerebras-fast",
|
||||
"Cerebras-think",
|
||||
"Groq",
|
||||
"Cloudflare-AI",
|
||||
"Gemini",
|
||||
"SambaNova",
|
||||
"NVIDIA-NIM",
|
||||
"Mistral",
|
||||
"Groq-OSS",
|
||||
"HF-Space",
|
||||
"HF-Router",
|
||||
"OpenRouter",
|
||||
"GitHub-Models"
|
||||
],
|
||||
"active": 13,
|
||||
"total": 13,
|
||||
"primary": "Cerebras-fast",
|
||||
"cost": "0€"
|
||||
},
|
||||
"ethica": {
|
||||
"total_hcps": 161733,
|
||||
"with_email": 110583,
|
||||
"with_phone": 155151,
|
||||
"gap_email": 51150,
|
||||
"pct_email": 68.4,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 122337,
|
||||
"with_email": 78487,
|
||||
"with_tel": 119396,
|
||||
"pct_email": 64.2,
|
||||
"pct_tel": 97.6
|
||||
},
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19723,
|
||||
"with_email": 15074,
|
||||
"with_tel": 18737,
|
||||
"pct_email": 76.4,
|
||||
"pct_tel": 95
|
||||
},
|
||||
{
|
||||
"country": "TN",
|
||||
"hcps": 17794,
|
||||
"with_email": 15143,
|
||||
"with_tel": 17018,
|
||||
"pct_email": 85.1,
|
||||
"pct_tel": 95.6
|
||||
},
|
||||
{
|
||||
"country": "INTL",
|
||||
"hcps": 1879,
|
||||
"with_email": 1879,
|
||||
"with_tel": 0,
|
||||
"pct_email": 100,
|
||||
"pct_tel": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"docker": [
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 3 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 3 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 3 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mm-db-1",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mattermost-1",
|
||||
"status": "Up 5 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 32 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 6 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
"crons": {
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "92a508bce auto-sync-1025",
|
||||
"dirty": 1,
|
||||
"status": "DIRTY"
|
||||
},
|
||||
"nonreg": {
|
||||
"total": 153,
|
||||
"passed": 153,
|
||||
"score": "100%"
|
||||
},
|
||||
"services": [
|
||||
{
|
||||
"name": "DeerFlow",
|
||||
"port": 3002,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "DeerFlow API",
|
||||
"port": 8001,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Qdrant",
|
||||
"port": 6333,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Ollama",
|
||||
"port": 11434,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Redis",
|
||||
"port": 6379,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Sovereign",
|
||||
"port": 4000,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "SearXNG",
|
||||
"port": 8080,
|
||||
"status": "UP"
|
||||
}
|
||||
],
|
||||
"whisper": {
|
||||
"binary": "COMPILED",
|
||||
"model": "142MB"
|
||||
},
|
||||
"grand_total": 3700,
|
||||
"health": {
|
||||
"score": 5,
|
||||
"max": 6,
|
||||
"pct": 83
|
||||
},
|
||||
"elapsed_ms": 10315
|
||||
}
|
||||
19
api/scripts/token-health-monitor.sh
Executable file
19
api/scripts/token-health-monitor.sh
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
# V111 Token Health Monitor - live probe
|
||||
TH=$(curl -sk --max-time 30 "http://127.0.0.1/api/token-health-real.php" -H "Host: weval-consulting.com" 2>/dev/null)
|
||||
if [ -z "$TH" ]; then
|
||||
echo "token_health=unreachable"
|
||||
exit 1
|
||||
fi
|
||||
# Use python instead of jq to avoid escaping issues
|
||||
echo "$TH" | python3 -c "
|
||||
import json, sys
|
||||
d = json.load(sys.stdin)
|
||||
r = d.get('results', [])
|
||||
ok = sum(1 for p in r if p.get('status') == 'OK')
|
||||
total = len(r)
|
||||
expired = total - ok
|
||||
pct = int(ok * 100 / total) if total else 0
|
||||
expired_list = ','.join(p['provider'] for p in r if p.get('status') != 'OK')
|
||||
print(f'providers={total} ok={ok} expired={expired} health={pct}% expired_list={expired_list}')
|
||||
"
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-21T08:23:29+00:00",
|
||||
"ts": "2026-04-21T08:25:15+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
|
||||
@@ -88,6 +88,7 @@ if ($__fp_input && isset($__fp_input["message"])) {
|
||||
"load" => ["cmd"=>"cat /proc/loadavg && free -m | grep Mem", "default"=>true, "timeout"=>5],
|
||||
"architecture_quality" => ["cmd"=>"curl -sk --max-time 5 http://127.0.0.1/api/wevia-v83-business-kpi.php?action=category\&cat=architecture_quality -H 'Host: weval-consulting.com' 2>/dev/null | jq -r '.data.kpis[] | \"\(.id): \(.value) \(.unit) [\(.status)]\"' 2>/dev/null | head -8", "default"=>true, "timeout"=>10],
|
||||
"fpm_monitor" => ["cmd"=>"bash /var/www/html/api/scripts/fpm-monitor.sh 2>/dev/null", "default"=>true, "timeout"=>5],
|
||||
"token_health" => ["cmd"=>"bash /var/www/html/api/scripts/token-health-monitor.sh 2>/dev/null", "default"=>true, "timeout"=>35],
|
||||
"screens_s204" => ["cmd"=>"echo 'S204_HTML='$(find /var/www/html -maxdepth 3 -name '*.html' 2>/dev/null | wc -l)' S204_PHP='$(find /var/www/html -maxdepth 3 -name '*.php' 2>/dev/null | wc -l)' API='$(ls /var/www/html/api/*.php 2>/dev/null | wc -l)", "keywords"=>["screen","ecran","\xc3\xa9cran","page"], "timeout"=>15],
|
||||
"screens_s95" => ["cmd"=>"sudo ssh -p 49222 -o StrictHostKeyChecking=no -i /var/www/.ssh/wevads_key root@10.1.0.3 \"echo ARSENAL=\\$(find /opt/wevads-arsenal/public -maxdepth 2 -name '*.html' 2>/dev/null | wc -l)' WEVADS_HTML='\\$(find /var/www -maxdepth 3 -name '*.html' 2>/dev/null | wc -l)\" 2>&1 | tail -3", "keywords"=>["screen","ecran","\xc3\xa9cran","page","s95","arsenal"], "timeout"=>20],
|
||||
"gpus" => ["cmd"=>"nvidia-smi --query-gpu=name,memory.total --format=csv,noheader 2>/dev/null || echo 'no GPU'; sudo ssh -p 49222 -o StrictHostKeyChecking=no -i /var/www/.ssh/wevads_key root@10.1.0.3 \"nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null || echo 'no GPU s95'\" 2>&1 | tail -3", "keywords"=>["gpu","nvidia","blade","cuda"], "timeout"=>15],
|
||||
|
||||
107
wiki/V123-dashboards-favorites.md
Normal file
107
wiki/V123-dashboards-favorites.md
Normal file
@@ -0,0 +1,107 @@
|
||||
# V123 Opus WIRE - Dashboards Favorites/Pinning · 21avr 10:25
|
||||
|
||||
## Context
|
||||
Yacine CONTINUE. Continuer polish UX consolidation dashboards. Poursuite séquence additive V116-V122.
|
||||
|
||||
## Design choice: URL hash, pas localStorage
|
||||
| Pourquoi | Avantage |
|
||||
|---|---|
|
||||
| URL hash `#pins=a,b,c` | Shareable (bookmark, message) |
|
||||
| Zero localStorage | Pas de conflit browser storage |
|
||||
| history.replaceState | Pas de pollution historique |
|
||||
| Auto-persist | Reload garde les pins sans code DB |
|
||||
|
||||
## Livrables V123
|
||||
|
||||
### 1. Boutons étoile sur chaque tuile
|
||||
- 69 boutons `★` (étoile Unicode)
|
||||
- Couleur: gold `#fbbf24` si pinned, gris `#555` sinon
|
||||
- Click: `event.preventDefault(); event.stopPropagation(); __dashTogglePin(name)` — ne navigue pas au dashboard
|
||||
- Title: "Pin" / "Unpin" selon état
|
||||
|
||||
### 2. Pinned tiles rendus en premier
|
||||
```js
|
||||
filtered = filtered.slice().sort((a,b) => {
|
||||
const ap = pinned.has(a.name) ? 0 : 1;
|
||||
const bp = pinned.has(b.name) ? 0 : 1;
|
||||
return ap - bp;
|
||||
});
|
||||
```
|
||||
Pinned passent devant, l'ordre interne (search/sort) reste.
|
||||
|
||||
### 3. Visual pinned
|
||||
- Border color: `#fbbf24` (vs catégorie color)
|
||||
- Class CSS `.pinned` avec box-shadow gold subtil
|
||||
- Hover: shadow gold intensifié `rgba(251,191,36,0.35)`
|
||||
|
||||
### 4. URL hash sync
|
||||
```
|
||||
https://weval-consulting.com/all-ia-hub.html#pins=ethica-dashboard-live.html,crm-dashboard-live.html
|
||||
```
|
||||
- `window.history.replaceState` (pas de scroll, pas d'entrée historique)
|
||||
- Reload: parse hash au chargement → pins restaurés
|
||||
|
||||
### 5. Counter enrichi
|
||||
```
|
||||
"69 / 69 tuiles (2 pins)"
|
||||
```
|
||||
|
||||
## Validation E2E Playwright V123
|
||||
|
||||
```json
|
||||
{
|
||||
"v123": "pinning-url-hash",
|
||||
"initial_star_buttons": 69,
|
||||
"first_pin_works": true,
|
||||
"second_pin_works": true,
|
||||
"pinned_go_first": true,
|
||||
"url_hash_persists": true,
|
||||
"reload_preserves": true,
|
||||
"unpin_works": true,
|
||||
"js_errors": [],
|
||||
"VERDICT": "WIRED"
|
||||
}
|
||||
```
|
||||
|
||||
Scénario testé:
|
||||
1. Initial: 69 tiles, 0 pinned, first = acquired-dashboard.html (alphabétique)
|
||||
2. Pin ethica: first = ethica, hash = `#pins=ethica-dashboard-live.html`
|
||||
3. Pin crm: first 2 = [crm, ethica], hash = `#pins=ethica-...,crm-...`
|
||||
4. Reload → pins preserved (hash stable)
|
||||
5. Unpin ethica: only crm pinned, hash updated
|
||||
|
||||
## Artefacts
|
||||
- `/var/www/html/api/blade-tasks/v123-pins-proof/01-initial.png`
|
||||
- `/var/www/html/api/blade-tasks/v123-pins-proof/02-pinned-ethica.png`
|
||||
- `/var/www/html/api/blade-tasks/v123-pins-proof/03-pinned-two.png`
|
||||
- `/var/www/html/api/blade-tasks/v123-pins-proof/04-after-reload.png`
|
||||
- `.../proof.json`
|
||||
|
||||
## GOLD backup
|
||||
- `/opt/wevads/vault/all-ia-hub.html.GOLD-V123-pre-favorites`
|
||||
|
||||
## Métriques V122 → V123
|
||||
| | V122 | V123 |
|
||||
|--|--|--|
|
||||
| Hub size | 43.4KB | 45.3KB (+1.9KB) |
|
||||
| Features | sticky/hover/fadeIn | + 69 pin buttons |
|
||||
| Persistent state | none | URL hash shareable |
|
||||
| JS errors | 0 | 0 |
|
||||
|
||||
## Séquence V116→V123 récapitulatif
|
||||
|
||||
| V | Feature |
|
||||
|---|---|
|
||||
| V116 | DASHBOARDS tab + 69 tuiles + 12 catégories |
|
||||
| V117 | HTTP status badges (0 broken) |
|
||||
| V118 | Intent chat `dashboards status` |
|
||||
| V119 | Search + Sort + Counter |
|
||||
| V120 | Keyboard Cmd+K / Escape |
|
||||
| V121 | E2E proof keyboard |
|
||||
| V122 | CSS polish (sticky, hover, fadeIn, focus rings) |
|
||||
| V123 | **Favorites/pinning via URL hash** |
|
||||
|
||||
## Doctrines
|
||||
#1 scan · #3 GOLD · #4 honnêteté (E2E prouvé) · #13 cause racine · **#14 ADDITIF PUR** · #16 NR · **#60 UX premium** (gold hover, URL share) · #100
|
||||
|
||||
## Sessions consécutives sans régression applicative : 95+
|
||||
Reference in New Issue
Block a user