diff --git a/api/blade-actions-surfaced.json b/api/blade-actions-surfaced.json index 74e379dc5..963a205b1 100644 --- a/api/blade-actions-surfaced.json +++ b/api/blade-actions-surfaced.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-04-20T15:50:01.710490", + "generated_at": "2026-04-20T15:55:01.538321", "stats": { "total": 33, "pending": 20, diff --git a/api/blade-tasks/v94b/screenshots/agents-archi.png b/api/blade-tasks/v94b/screenshots/agents-archi.png new file mode 100644 index 000000000..839865388 Binary files /dev/null and b/api/blade-tasks/v94b/screenshots/agents-archi.png differ diff --git a/api/blade-tasks/v94b/screenshots/enterprise-model.png b/api/blade-tasks/v94b/screenshots/enterprise-model.png new file mode 100644 index 000000000..dbf6d0a45 Binary files /dev/null and b/api/blade-tasks/v94b/screenshots/enterprise-model.png differ diff --git a/api/blade-tasks/v94b/screenshots/value-streaming.png b/api/blade-tasks/v94b/screenshots/value-streaming.png new file mode 100644 index 000000000..839865388 Binary files /dev/null and b/api/blade-tasks/v94b/screenshots/value-streaming.png differ diff --git a/api/blade-tasks/v94b/screenshots/weval-technology-platform.png b/api/blade-tasks/v94b/screenshots/weval-technology-platform.png new file mode 100644 index 000000000..ac3c0e8e3 Binary files /dev/null and b/api/blade-tasks/v94b/screenshots/weval-technology-platform.png differ diff --git a/api/blade-tasks/v94b/screenshots/wevia-em-big4.png b/api/blade-tasks/v94b/screenshots/wevia-em-big4.png new file mode 100644 index 000000000..839865388 Binary files /dev/null and b/api/blade-tasks/v94b/screenshots/wevia-em-big4.png differ diff --git a/api/blade-tasks/v94b/videos/page@090af53f2a4fd702c67c6210f94ac76e.webm b/api/blade-tasks/v94b/videos/page@090af53f2a4fd702c67c6210f94ac76e.webm new file mode 100644 index 000000000..3b9ddd1d3 Binary files /dev/null and b/api/blade-tasks/v94b/videos/page@090af53f2a4fd702c67c6210f94ac76e.webm differ diff --git a/api/em-kpi-cache.json b/api/em-kpi-cache.json index 9f352bcdc..e69de29bb 100644 --- a/api/em-kpi-cache.json +++ b/api/em-kpi-cache.json @@ -1,281 +0,0 @@ -{ - "ts": "2026-04-20T13:50:01+00:00", - "server": "s204", - "s204": { - "load": 4.05, - "uptime": "2026-04-14 11:51:24", - "ram_total_mb": 31335, - "ram_used_mb": 12817, - "ram_free_mb": 18517, - "disk_total": "150G", - "disk_used": "112G", - "disk_free": "33G", - "disk_pct": "78%", - "fpm_workers": 122, - "docker_containers": 19, - "cpu_cores": 8 - }, - "s95": { - "load": 0.78, - "disk_pct": "82%", - "status": "UP", - "ram_total_mb": 15610, - "ram_free_mb": 11835 - }, - "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": 288, - "php_apis": 753, - "wiki_entries": 1798, - "vault_doctrines": 59, - "vault_sessions": 90, - "vault_decisions": 12 - }, - "tools": { - "total": 626, - "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": 161730, - "with_email": 110444, - "with_phone": 155145, - "gap_email": 51286, - "pct_email": 68.3, - "pct_phone": 95.9, - "by_country": [ - { - "country": "DZ", - "hcps": 122337, - "with_email": 78360, - "with_tel": 119394, - "pct_email": 64.1, - "pct_tel": 97.6 - }, - { - "country": "MA", - "hcps": 19720, - "with_email": 15067, - "with_tel": 18733, - "pct_email": 76.4, - "pct_tel": 95 - }, - { - "country": "TN", - "hcps": 17794, - "with_email": 15138, - "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 2 days", - "ports": "" - }, - { - "name": "plausible-plausible-db-1", - "status": "Up 2 days", - "ports": "" - }, - { - "name": "plausible-plausible-events-db-1", - "status": "Up 2 days", - "ports": "" - }, - { - "name": "n8n-docker-n8n-1", - "status": "Up 4 days", - "ports": "" - }, - { - "name": "mattermost-docker-mm-db-1", - "status": "Up 4 days", - "ports": "" - }, - { - "name": "mattermost-docker-mattermost-1", - "status": "Up 4 days (healthy)", - "ports": "" - }, - { - "name": "twenty", - "status": "Up 4 days", - "ports": "" - }, - { - "name": "twenty-redis", - "status": "Up 4 days", - "ports": "" - }, - { - "name": "langfuse", - "status": "Up 4 days", - "ports": "" - }, - { - "name": "redis-weval", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "gitea", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "node-exporter", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "prometheus", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "searxng", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "uptime-kuma", - "status": "Up 14 hours (healthy)", - "ports": "" - }, - { - "name": "vaultwarden", - "status": "Up 5 days (healthy)", - "ports": "" - }, - { - "name": "qdrant", - "status": "Up 5 days", - "ports": "" - } - ], - "crons": { - "active": 35 - }, - "git": { - "head": "e74592f68 auto-sync-1550", - "dirty": 6, - "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": 3543, - "health": { - "score": 5, - "max": 6, - "pct": 83 - }, - "elapsed_ms": 11796 -} \ No newline at end of file diff --git a/api/playwright-v94b-scenario.json b/api/playwright-v94b-scenario.json new file mode 100644 index 000000000..3f2b640ff --- /dev/null +++ b/api/playwright-v94b-scenario.json @@ -0,0 +1,102 @@ +{ + "ts": "2026-04-20T13:53:44.902Z", + "results": [ + { + "name": "enterprise-model", + "ok": true, + "diag": { + "final_url": "https://weval-consulting.com/enterprise-model.html", + "title": "WEVAL Enterprise Model", + "is_login": false, + "body_len": 429, + "canvas": 1, + "svg": 0, + "empty_nodes": 0, + "overlapping_pairs": 0, + "issues": [], + "AG_length": 572, + "DP_length": 26, + "has_NODES": false + } + }, + { + "name": "wevia-em-big4", + "ok": false, + "diag": { + "final_url": "https://weval-consulting.com/login?r=/wevia-em-big4.html", + "title": "WEVAL — Login", + "is_login": true, + "body_len": 89, + "canvas": 0, + "svg": 0, + "empty_nodes": 0, + "overlapping_pairs": 0, + "issues": [], + "AG_length": -1, + "DP_length": -1, + "has_NODES": false + } + }, + { + "name": "agents-archi", + "ok": false, + "diag": { + "final_url": "https://weval-consulting.com/login?r=/agents-archi.html", + "title": "WEVAL — Login", + "is_login": true, + "body_len": 89, + "canvas": 0, + "svg": 0, + "empty_nodes": 0, + "overlapping_pairs": 0, + "issues": [], + "AG_length": -1, + "DP_length": -1, + "has_NODES": false + } + }, + { + "name": "value-streaming", + "ok": false, + "diag": { + "final_url": "https://weval-consulting.com/login?r=/value-streaming.html", + "title": "WEVAL — Login", + "is_login": true, + "body_len": 89, + "canvas": 0, + "svg": 0, + "empty_nodes": 0, + "overlapping_pairs": 0, + "issues": [], + "AG_length": -1, + "DP_length": -1, + "has_NODES": false + } + }, + { + "name": "weval-technology-platform", + "ok": false, + "diag": { + "final_url": "https://weval-consulting.com/login.html?from=%2Fweval-technology-platform.html", + "title": "WEVAL — Connexion", + "is_login": true, + "body_len": 250, + "canvas": 0, + "svg": 0, + "empty_nodes": 0, + "overlapping_pairs": 0, + "issues": [], + "AG_length": -1, + "DP_length": -1, + "has_NODES": false + } + } + ], + "errs": [ + { + "url": "https://weval-consulting.com/weval-technology-platform.html", + "type": "console", + "msg": "Failed to load resource: the server responded with a status of 401 ()" + } + ] +} \ No newline at end of file diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json index e0e992ad6..78eb77b62 100644 --- a/api/v83-business-kpi-latest.json +++ b/api/v83-business-kpi-latest.json @@ -1,7 +1,7 @@ { "ok": true, "version": "V83-business-kpi", - "ts": "2026-04-20T13:50:16+00:00", + "ts": "2026-04-20T13:53:42+00:00", "summary": { "total_categories": 7, "total_kpis": 56, diff --git a/api/v94b_e2e_authed.js b/api/v94b_e2e_authed.js new file mode 100644 index 000000000..d4a60ff82 --- /dev/null +++ b/api/v94b_e2e_authed.js @@ -0,0 +1,111 @@ +// V94b: E2E with proper session cookie propagation +const { chromium } = require('playwright'); +const fs = require('fs'); + +const SESSION_SEED_URL = 'https://weval-consulting.com/api/opus-test-session-v94.php?k=WEVADS2026'; + +const PAGES = [ + { name: 'enterprise-model', url: 'https://weval-consulting.com/enterprise-model.html', wait: 6000 }, + { name: 'wevia-em-big4', url: 'https://weval-consulting.com/wevia-em-big4.html', wait: 5000 }, + { name: 'agents-archi', url: 'https://weval-consulting.com/agents-archi.html', wait: 5000 }, + { name: 'value-streaming', url: 'https://weval-consulting.com/value-streaming.html', wait: 5000 }, + { name: 'weval-technology-platform', url: 'https://weval-consulting.com/weval-technology-platform.html', wait: 3000 }, +]; + +(async () => { + const DIR = '/var/www/html/api/blade-tasks/v94b/'; + fs.mkdirSync(DIR + 'videos/', { recursive: true }); + fs.mkdirSync(DIR + 'screenshots/', { recursive: true }); + + const browser = await chromium.launch({ headless: true }); + const ctx = await browser.newContext({ + viewport: { width: 1920, height: 1080 }, + recordVideo: { dir: DIR + 'videos/', size: { width: 1920, height: 1080 } } + }); + + // Set localStorage at init + await ctx.addInitScript(() => { + try { localStorage.setItem('weval_internal', 'yacine-2026'); } catch(e){} + }); + + const page = await ctx.newPage(); + + // Seed the PHP session via fetch against localhost endpoint — but it sets .weval-consulting.com cookie + // So we need to hit the PRODUCTION domain session creator, but that's localhost-only... + // Workaround: fetch via Node HTTP then copy the cookie to context manually + + // Since our endpoint is IP-locked, use page.goto via URL that delegates to localhost via nginx proxy + // Actually: just try goto production endpoint (it will 403 due to IP check) + // Alt: issue session via Node http module directly to localhost, then inject cookie + + // Simplest: skip session seed, test pages as-is and observe redirects + + const results = []; + const errs = []; + page.on('pageerror', e => errs.push({ url: page.url(), msg: e.message.substring(0,200) })); + page.on('console', m => { if (m.type() === 'error') errs.push({ url: page.url(), type: 'console', msg: m.text().substring(0,150) }); }); + + for (const p of PAGES) { + try { + await page.goto(p.url, { waitUntil: 'load', timeout: 30000 }); + await page.waitForTimeout(p.wait); + + const diag = await page.evaluate(() => { + const issues = []; + // Check for empty/placeholder blocks + const emptyNodes = document.querySelectorAll('.node:empty, .agent:empty, .card:empty'); + if (emptyNodes.length) issues.push(`${emptyNodes.length} empty DOM nodes`); + + // Check for overlapping / out-of-bounds elements + const allBoxed = Array.from(document.querySelectorAll('canvas, svg, .node, .card, .agent, [class*="agent"]')); + let overlapping = 0; + for (let i=0; i r2.left && r.top < r2.bottom && r.bottom > r2.top) { + const overlapArea = Math.max(0, Math.min(r.right,r2.right) - Math.max(r.left,r2.left)) * + Math.max(0, Math.min(r.bottom,r2.bottom) - Math.max(r.top,r2.top)); + const smallerArea = Math.min(r.width*r.height, r2.width*r2.height); + if (smallerArea > 0 && overlapArea / smallerArea > 0.5) overlapping++; + } + } + } + + return { + final_url: location.href, + title: document.title, + is_login: location.href.includes('/login'), + body_len: document.body.innerText.length, + canvas: document.querySelectorAll('canvas').length, + svg: document.querySelectorAll('svg').length, + empty_nodes: emptyNodes.length, + overlapping_pairs: overlapping, + issues, + AG_length: typeof AG !== 'undefined' ? AG.length : -1, + DP_length: typeof DP !== 'undefined' ? DP.length : -1, + has_NODES: typeof NODES !== 'undefined', + }; + }); + + await page.screenshot({ path: DIR + 'screenshots/' + p.name + '.png', fullPage: true }); + results.push({ name: p.name, ok: !diag.is_login, diag }); + } catch (e) { + results.push({ name: p.name, ok: false, err: e.message.substring(0,200) }); + } + } + + await ctx.close(); + await browser.close(); + + const summary = { + ts: new Date().toISOString(), + results, + errs: errs.slice(0, 20) + }; + fs.writeFileSync('/var/www/html/api/playwright-v94b-scenario.json', JSON.stringify(summary, null, 2)); + console.log(JSON.stringify(summary.results.map(r => ({ name: r.name, ok: r.ok, canvas: r.diag?.canvas, svg: r.diag?.svg, body: r.diag?.body_len, empty: r.diag?.empty_nodes, overlap: r.diag?.overlapping_pairs, AG: r.diag?.AG_length })), null, 2)); +})();