const puppeteer = require('puppeteer-core'); const fs = require('fs'); const path = require('path'); const DIR = '/var/www/html/api/l99-screenshots'; const TESTS = [ {n:'CRM',u:'https://crm.weval-consulting.com'}, {n:'MiroFish',u:'https://mirofish.weval-consulting.com'}, {n:'Paperclip',u:'https://paperclip.weval-consulting.com/WEVAL/dashboard'}, {n:'Langfuse',u:'https://langfuse.weval-consulting.com'}, {n:'DeerFlow',u:'https://deerflow.weval-consulting.com'}, {n:'Plausible',u:'https://analytics.weval-consulting.com'}, {n:'Mattermost',u:'https://mm.weval-consulting.com'}, {n:'Kuma',u:'https://monitor.weval-consulting.com'}, {n:'n8n',u:'https://n8n.weval-consulting.com'}, {n:'WEVADS',u:'https://weval-consulting.com/wevads-ia/'}, {n:'Admin',u:'https://weval-consulting.com/admin-saas.html'}, {n:'Archi3D',u:'https://weval-consulting.com/agents-archi.html'}, {n:'Enterprise',u:'https://weval-consulting.com/enterprise-model.html'}, {n:'Fleet',u:'https://weval-consulting.com/agents-fleet.html'}, {n:'L99Brain',u:'https://weval-consulting.com/l99-brain.html'}, {n:'Director',u:'https://weval-consulting.com/director-center.html'}, {n:'Meetings',u:'https://weval-consulting.com/wevia-meeting-rooms.html'}, {n:'Architecture',u:'https://weval-consulting.com/architecture.html'}, {n:'OpenClaw',u:'https://weval-consulting.com/openclaw.html'}, {n:'Console',u:'https://weval-consulting.com/wevia-console.html'}, {n:'DirChat',u:'https://weval-consulting.com/director-chat.html'}, {n:'ValueStream',u:'https://weval-consulting.com/value-streaming.html'}, {n:'PaperclipPg',u:'https://weval-consulting.com/paperclip.html'}, ]; (async()=>{ if(!fs.existsSync(DIR)) fs.mkdirSync(DIR,{recursive:true}); const b=await puppeteer.launch({executablePath:'/usr/bin/google-chrome',headless:'new',args:['--no-sandbox','--disable-gpu','--ignore-certificate-errors','--disable-dev-shm-usage']}); const results=[];let pass=0; for(const t of TESTS){ const p=await b.newPage(); await p.setViewport({width:1920,height:1080}); const r={name:t.n,url:t.u,status:'FAIL',code:0,size:0,loadMs:0}; const s=Date.now(); try{ const resp=await p.goto(t.u,{waitUntil:'domcontentloaded',timeout:15000}); r.code=resp.status();r.loadMs=Date.now()-s; await p.screenshot({path:path.join(DIR,t.n+'.png')}); r.screenshot='/api/l99-screenshots/'+t.n+'.png'; const html=await p.content();r.size=html.length; r.title=await p.title(); r.status=(r.code>=200&&r.code<400&&r.size>500)?'PASS':'WARN'; if(r.status==='PASS')pass++; }catch(e){r.error=e.message?.substring(0,80);r.loadMs=Date.now()-s;} results.push(r);await p.close(); console.log((r.status==='PASS'?'V':'X')+' '+t.n+': '+r.code+' '+r.loadMs+'ms '+r.size+'b'); } await b.close(); const sum={ts:new Date().toISOString(),total:results.length,pass,fail:results.length-pass,pct:Math.round(100*pass/results.length),results}; fs.writeFileSync('/var/www/html/api/l99-visual-results.json',JSON.stringify(sum,null,2)); console.log('\n=== L99 VISUAL: '+pass+'/'+results.length+' = '+sum.pct+'% ==='); })();