412 lines
47 KiB
HTML
412 lines
47 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Growth Engine v3 — WEVAL Consulting</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=Outfit:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
<style>
|
|
:root{--bg:#06090f;--bg2:#0c1120;--bg3:#131b2e;--bg4:#1a2540;--gold:#d4a853;--gold2:#e8c36a;--gd:rgba(212,168,83,.12);--em:#34d399;--ed:rgba(52,211,153,.12);--sa:#3b82f6;--sd:rgba(59,130,246,.12);--co:#f97066;--cld:rgba(249,112,102,.12);--vi:#a78bfa;--vd:rgba(167,139,250,.12);--cy:#22d3ee;--cyd:rgba(34,211,238,.12);--ro:#fb7185;--rd:rgba(251,113,133,.12);--am:#fbbf24;--ad:rgba(251,191,36,.12);--t1:#f0ece4;--t2:#9ca3af;--t3:#4b5563;--brd:#1e293b;--r:10px;--fd:'DM Serif Display',Georgia,serif;--fb:'Outfit',system-ui,sans-serif;--fm:'JetBrains Mono',monospace}
|
|
*{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--fb);background:var(--bg);color:var(--t1);min-height:100vh;overflow-x:hidden}
|
|
.amb{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}.orb{position:absolute;border-radius:50%;filter:blur(120px);opacity:.12;animation:dr 20s ease-in-out infinite}.o1{width:600px;height:600px;background:var(--gold);top:-10%;left:-5%}.o2{width:500px;height:500px;background:var(--sa);bottom:-10%;right:-5%;animation-delay:-7s}.o3{width:400px;height:400px;background:var(--em);top:40%;left:50%;animation-delay:-14s}@keyframes dr{0%,100%{transform:translate(0,0)}33%{transform:translate(30px,-20px)}66%{transform:translate(-20px,30px)}}
|
|
.nz{position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.03;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
|
|
.wr{position:relative;z-index:2}
|
|
.hd{display:flex;align-items:center;gap:14px;padding:12px 20px;background:rgba(12,17,32,.9);backdrop-filter:blur(20px);border-bottom:1px solid var(--brd);position:sticky;top:0;z-index:100}
|
|
.hd-l{font-family:var(--fd);font-size:20px;color:var(--gold)}.hd-l span{color:var(--t3);font-size:11px;font-family:var(--fb);margin-left:6px}
|
|
.hd-k{display:flex;gap:10px;margin-left:auto}.hd-k a{color:var(--t3);font-size:9px;text-decoration:none;font-weight:600;letter-spacing:.5px;text-transform:uppercase;transition:.2s}.hd-k a:hover{color:var(--gold)}
|
|
.sb{padding:5px 12px;border-radius:6px;border:1px solid var(--gd);background:var(--gd);color:var(--gold);font-size:10px;font-family:var(--fb);font-weight:600;cursor:pointer;transition:.3s;display:flex;align-items:center;gap:4px}.sb:hover{background:var(--gold);color:var(--bg)}.sb .ic{transition:transform .4s}.sb:hover .ic{transform:rotate(180deg)}
|
|
.nv{display:flex;gap:0;padding:0 12px;background:rgba(12,17,32,.7);backdrop-filter:blur(12px);border-bottom:1px solid var(--brd);overflow-x:auto}.nv::-webkit-scrollbar{display:none}
|
|
.vt{padding:9px 12px;font-size:10px;color:var(--t3);cursor:pointer;border-bottom:2px solid transparent;transition:.2s;white-space:nowrap;font-weight:500;display:flex;align-items:center;gap:4px}.vt .dt{width:4px;height:4px;border-radius:50%}.vt.on{color:var(--t1);border-bottom-color:var(--gold);font-weight:600}.vt:hover{color:var(--t1)}.vt .ct{font-size:8px;font-family:var(--fm);background:var(--bg4);padding:1px 4px;border-radius:3px}
|
|
.mn{max-width:1440px;margin:0 auto;padding:18px 20px}.sc{display:none}.sc.on{display:block;animation:fi .3s ease}@keyframes fi{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
|
|
.mr{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:7px;margin-bottom:18px}.mc{background:var(--bg2);border:1px solid var(--brd);border-radius:8px;padding:10px;position:relative;overflow:hidden}.mc::before{content:'';position:absolute;top:0;left:0;right:0;height:2px}
|
|
.mc.g::before{background:linear-gradient(90deg,var(--gold),transparent)}.mc.e::before{background:linear-gradient(90deg,var(--em),transparent)}.mc.s::before{background:linear-gradient(90deg,var(--sa),transparent)}.mc.c::before{background:linear-gradient(90deg,var(--co),transparent)}.mc.v::before{background:linear-gradient(90deg,var(--vi),transparent)}.mc.cy::before{background:linear-gradient(90deg,var(--cy),transparent)}.mc.r::before{background:linear-gradient(90deg,var(--ro),transparent)}.mc.a::before{background:linear-gradient(90deg,var(--am),transparent)}
|
|
.mc-l{font-size:8px;text-transform:uppercase;letter-spacing:.6px;color:var(--t3);margin-bottom:3px;font-weight:600}.mc-v{font-size:20px;font-weight:700;font-family:var(--fm);line-height:1}.mc-s{font-size:8px;color:var(--t2);margin-top:3px}
|
|
.cg{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:9px;margin-bottom:18px}.cd{background:var(--bg2);border:1px solid var(--brd);border-radius:8px;padding:12px;transition:.2s}.cd:hover{border-color:rgba(212,168,83,.25);transform:translateY(-1px);box-shadow:0 4px 16px rgba(0,0,0,.25)}.cd-h{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:5px}.cd-t{font-size:12px;font-weight:600}.cd-d{font-size:9px;color:var(--t2);line-height:1.5;margin-bottom:7px}
|
|
.bd{font-size:8px;padding:2px 6px;border-radius:4px;font-weight:600}.bw{background:var(--gd);color:var(--gold)}.bp{background:var(--sd);color:var(--sa)}.bi{background:var(--vd);color:var(--vi)}.bh{background:var(--cld);color:var(--co)}.bs{background:var(--ed);color:var(--em)}
|
|
.rv{display:flex;align-items:center;gap:5px;margin-top:5px}.rv-b{flex:1;height:3px;border-radius:2px;background:var(--bg4);overflow:hidden}.rv-f{height:100%;border-radius:2px;transition:width .5s}.rv-v{font-size:9px;font-family:var(--fm);color:var(--gold);min-width:35px;text-align:right}
|
|
.ca{margin-top:6px;display:flex;flex-wrap:wrap;gap:3px}.at{font-size:8px;padding:2px 5px;border-radius:3px;background:var(--bg3);color:var(--t2);cursor:pointer;transition:.15s;border:1px solid transparent}.at:hover{border-color:var(--gold);color:var(--gold)}.at.dn{text-decoration:line-through;opacity:.3}
|
|
.kb{display:grid;grid-template-columns:repeat(4,1fr);gap:7px;margin-bottom:18px}@media(max-width:900px){.kb{grid-template-columns:1fr 1fr}}@media(max-width:600px){.kb{grid-template-columns:1fr}}
|
|
.kc{background:var(--bg2);border:1px solid var(--brd);border-radius:8px;overflow:hidden}.kh{padding:8px 9px;border-bottom:1px solid var(--brd);display:flex;align-items:center;gap:4px;font-size:10px;font-weight:600}.kh .n{font-family:var(--fm);font-size:8px;color:var(--t3);margin-left:auto}.kh.si{border-left:3px solid var(--vi)}.kh.sp{border-left:3px solid var(--sa)}.kh.sw{border-left:3px solid var(--gold)}.kh.ss{border-left:3px solid var(--em)}
|
|
.ki{padding:5px 9px;border-bottom:1px solid rgba(30,41,59,.25);font-size:9px;color:var(--t2);transition:.12s}.ki:hover{background:var(--bg3);color:var(--t1)}.ki .tg{font-size:7px;padding:1px 3px;border-radius:2px;margin-left:2px;background:rgba(255,255,255,.04);color:var(--t3)}
|
|
.cns{display:grid;grid-template-columns:repeat(auto-fill,minmax(165px,1fr));gap:5px;margin-bottom:18px}.cn{background:var(--bg2);border:1px solid var(--brd);border-radius:7px;padding:8px;display:flex;align-items:center;gap:7px;transition:.15s;font-size:10px}.cn:hover{border-color:var(--em)}.cn-d{width:5px;height:5px;border-radius:50%;flex-shrink:0}.cn-d.up{background:var(--em);box-shadow:0 0 4px var(--em)}.cn-d.dn{background:var(--co);box-shadow:0 0 4px var(--co)}.cn-d.wr{background:var(--gold);box-shadow:0 0 4px var(--gold)}.cn-n{font-weight:500}.cn-p{font-size:8px;font-family:var(--fm);color:var(--t3);margin-left:auto}
|
|
.cb{background:var(--bg2);border:1px solid var(--brd);border-radius:8px;margin-bottom:18px;overflow:hidden}.ch{padding:10px 12px;border-bottom:1px solid var(--brd);display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600}.ch .lv{width:5px;height:5px;border-radius:50%;background:var(--em);animation:gl 2s infinite}@keyframes gl{0%,100%{box-shadow:0 0 2px var(--em)}50%{box-shadow:0 0 7px var(--em)}}
|
|
.cm{padding:10px 12px;max-height:220px;overflow-y:auto;font-size:10px;line-height:1.6}.cm::-webkit-scrollbar{width:2px}.cm::-webkit-scrollbar-thumb{background:var(--bg4)}.mg{margin-bottom:7px;padding:6px 9px;border-radius:5px;animation:mi .2s ease}.mg.sy{background:var(--bg3);color:var(--t3);font-size:9px}.mg.ai{background:rgba(212,168,83,.05);border-left:2px solid var(--gold)}.mg.us{background:var(--bg4);text-align:right}@keyframes mi{from{opacity:0;transform:translateX(-4px)}to{opacity:1;transform:translateX(0)}}
|
|
.ci{display:flex;gap:6px;padding:8px 12px;border-top:1px solid var(--brd)}.ci input{flex:1;background:var(--bg3);border:1px solid var(--brd);border-radius:5px;padding:7px 9px;color:var(--t1);font-size:10px;font-family:var(--fb);outline:none;transition:.2s}.ci input:focus{border-color:var(--gold)}.ci button{padding:7px 14px;border-radius:5px;border:none;background:var(--gold);color:var(--bg);font-weight:600;font-size:10px;cursor:pointer}.ci button:hover{background:var(--gold2)}
|
|
.st{font-family:var(--fd);font-size:15px;color:var(--t1);margin-bottom:12px;display:flex;align-items:center;gap:6px}.st .ln{flex:1;height:1px;background:var(--brd)}
|
|
.tbl{width:100%;border-collapse:collapse;margin-bottom:14px;font-size:9px}.tbl th{text-align:left;padding:6px 7px;font-size:7px;text-transform:uppercase;letter-spacing:.6px;color:var(--t3);border-bottom:1px solid var(--brd);font-weight:600}.tbl td{padding:6px 7px;border-bottom:1px solid rgba(30,41,59,.25);color:var(--t2)}.tbl tr:hover td{background:var(--bg3);color:var(--t1)}
|
|
.sr{background:var(--bg2);border:1px solid var(--brd);border-radius:8px;padding:10px;margin-bottom:18px}.si2{padding:6px 0;border-bottom:1px solid rgba(30,41,59,.2)}.si2:last-child{border:none}.si2-t{font-size:10px;font-weight:500;color:var(--sa)}.si2-u{font-size:7px;font-family:var(--fm);color:var(--t3)}.si2-s{font-size:9px;color:var(--t2);margin-top:2px;line-height:1.4}
|
|
.spnr{display:inline-block;width:10px;height:10px;border:2px solid var(--brd);border-top-color:var(--gold);border-radius:50%;animation:spi .5s linear infinite}@keyframes spi{to{transform:rotate(360deg)}}
|
|
/* Plan90 */
|
|
.p90-w{margin-bottom:14px}.p90-h{font-weight:600;font-size:11px;color:var(--gold);margin-bottom:6px;padding-bottom:4px;border-bottom:1px solid var(--brd)}.p90-a{display:flex;align-items:center;gap:6px;padding:4px 0;font-size:9px;color:var(--t2)}.p90-a input{accent-color:var(--gold)}.p90-a.done{text-decoration:line-through;opacity:.4}
|
|
/* Social */
|
|
.soc{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px;margin-bottom:18px}.soc-c{background:var(--bg2);border:1px solid var(--brd);border-radius:8px;padding:12px;transition:.2s}.soc-c:hover{border-color:var(--sa)}.soc-h{font-size:11px;font-weight:600;margin-bottom:6px;display:flex;align-items:center;gap:6px}.soc-h .soc-ico{font-size:14px}.soc-stat{font-size:9px;color:var(--t2);line-height:1.6}.soc-api{font-size:8px;font-family:var(--fm);color:var(--t3);margin-top:6px;padding-top:4px;border-top:1px solid var(--brd)}
|
|
@media(max-width:768px){.hd{padding:8px 12px}.hd-l{font-size:16px}.hd-k{display:none}.nv{padding:0 8px}.vt{padding:7px 7px;font-size:9px}.mn{padding:10px}.mr{grid-template-columns:repeat(2,1fr)}.cg{grid-template-columns:1fr}}
|
|
</style>
|
|
<script src="/widgets/audit-banner.js" defer></script>
|
|
</head>
|
|
<body>
|
|
<div class="amb"><div class="orb o1"></div><div class="orb o2"></div><div class="orb o3"></div></div>
|
|
<div class="nz"></div>
|
|
<div class="wr">
|
|
<div class="hd">
|
|
<div class="hd-l">Growth Engine <span>v3 — WEVAL Consulting</span></div>
|
|
<div class="hd-k"><a href="/wevia-master.html">Master</a><a href="/director.html">Director</a><a href="/crm.html">CRM</a><a href="/growth-engine.html">v1</a></div>
|
|
<button class="sb" onclick="fullScan()"><span class="ic">↻</span> Scan All</button>
|
|
</div>
|
|
<div class="nv" id="nav"></div>
|
|
<div class="mn" id="mn"></div>
|
|
</div>
|
|
<script>
|
|
const API='/api/growth-engine-api.php',WV='/api/wevia-master-api.php';
|
|
const SN={idea:'Idées',plan:'Planifié',wip:'En cours',sign:'Signé'};
|
|
const SC={idea:'si',plan:'sp',wip:'sw',sign:'ss'};
|
|
|
|
// ═══════════ 8 VERTICALS — ENRICHED FROM V1+V2+ARCHI ═══════════
|
|
const V={
|
|
consulting:{l:'Consulting',ic:'em',o:[
|
|
{n:'Vistex SAP Maghreb',d:'Lead protection + conseil SAP pricing. Cosumar, Carrefour, OCP. Addendum Section 8.B + Section 3.d. Contacts: Olga Vanurina, Joe Golemba, Udo Hannemann.',r:200000,s:'wip',b:'bh',a:['Signer Lead Protection Addendum','RDV Olga Vanurina','Proposition Cosumar','Section 6.c.i Portal argument']},
|
|
{n:'Audit Maturité Digitale PME',d:'Framework McKinsey DQ adapté Maroc. Assessment 0-100 benchmark sectoriel. BCG DAI + DQ combo.',r:80000,s:'plan',b:'bp',a:['Framework scoring','Landing page','LinkedIn prospection','Template rapport']},
|
|
{n:'Consulting Cloud Migration',d:'Migration on-prem → cloud. Arrow/Scaleway partnership. Omar Belchkar, Julien Bossu contacts.',r:120000,s:'wip',b:'bw',a:['Onboarding ArrowSphere','Offre packagée','3 prospects','Cheikh Gassama Scaleway']},
|
|
{n:'Conseil Stratégie IA PME',d:'Diagnostic IA + roadmap. 50K MAD/mission. Cible: industriels Maghreb.',r:60000,s:'idea',b:'bi',a:['Offre diagnostic','3 PME pilotes','Webinaire CGEM']},
|
|
{n:'Value Stream Mapping',d:'VSM consulting pour optimisation processus. Page VSM existante dans Arsenal.',r:40000,s:'idea',b:'bi',a:['Connecter vsm-pipelines.html','Template VSM client','Offre packagée 30K']}
|
|
],m:[{l:'Pipeline',v:'500K',s:'5 deals',c:'e'},{l:'Partenaires',v:'3',s:'Vistex·Arrow·Scaleway',c:'g'},{l:'Conversion',v:'40%',s:'2/5 closing',c:'s'}]},
|
|
|
|
digital:{l:'Digital',ic:'sa',o:[
|
|
{n:'WEVIA SaaS freemium',d:'Arena multi-LLM + chat autonome. 626 tools. Free 100 msgs → 99€/mois. Blade v2.0 connecté.',r:200000,s:'plan',b:'bp',a:['Landing WeviaAI.ma','Setup Stripe','Beta 10 users','Blade v2 demo']},
|
|
{n:'API HCP Maghreb (Ethica)',d:'157K HCPs, 120K emails, 18K phones, 64K Google verified. 3000€/15K/mois. Pilot DRY_RUN prêt 7611 MG DZ.',r:300000,s:'wip',b:'bh',a:['Enrichir spécialités DZ','Scraper CNAM TN + CROMC','3 labos pilotes Kaouther','Consent.wevup.app']},
|
|
{n:'White-label WEVIA',d:'WEVIA brandé pour cabinets RH/legal/finance. Setup 5000€ + 500€/mois.',r:80000,s:'idea',b:'bi',a:['Package technique','Mockup client','5 cabinets cibles']},
|
|
{n:'SEO Module Hub',d:'Audit SEO auto via Plausible + SearXNG. Rapport client automatique.',r:40000,s:'plan',b:'bp',a:['SEO Module Hub page','Plausible bearer token','Template rapport']},
|
|
{n:'Dev Apps sur mesure',d:'Apps web/mobile stack WEVAL (React, Node, PG). 3000 MAD/jour.',r:100000,s:'idea',b:'bi',a:['Portfolio case-studies.html','Pricing grid','Landing développement']},
|
|
{n:'Solution Finder IA',d:'solution-finder.html existant. Recommandation IA des solutions WEVAL pour prospects.',r:30000,s:'plan',b:'bp',a:['Enrichir solution-finder','Connecter WEVIA Master','A/B test conversion']}
|
|
],m:[{l:'Pipeline',v:'750K',s:'6 opportunités',c:'s'},{l:'HCPs',v:'157K',s:'120K emails · 72K verified',c:'e'},{l:'Pages',v:'279',s:'+ 488 Arsenal = 767 total',c:'g'},{l:'APIs',v:'730',s:'Toutes live',c:'v'}]},
|
|
|
|
cloud:{l:'Cloud & Infra',ic:'cy',o:[
|
|
{n:'Arrow/Scaleway Reseller',d:'1er partenaire Scaleway Maroc via Arrow. Marge 15-25%. ArrowSphere onboarding.',r:100000,s:'wip',b:'bw',a:['Finaliser ArrowSphere','Offre packagée','10 prospects','Julien Bossu contact']},
|
|
{n:'Managed Hosting',d:'Hébergement managé Hetzner/OVH. Kuma + Prometheus + Grafana monitoring.',r:50000,s:'plan',b:'bp',a:['Pricing S/M/L','SLA document','Dashboard client Kuma']},
|
|
{n:'IaC Consulting',d:'DevOps/IaC PME. 17 Docker, CI/CD, Gitea, monitoring souverain.',r:60000,s:'idea',b:'bi',a:['Template Docker Compose','Workshop DevOps','3 prospects']},
|
|
{n:'Résolution Huawei Cloud',d:'Litige facturation. Comptes gelés + overconsumption. Ray Wu, Chris Cen, Yanhao.',r:0,s:'wip',b:'bh',a:['Document facturation anormale','Escalade Ray Wu','Deadline résolution']},
|
|
{n:'Cloudflare Management',d:'~25 comptes CF Brahim. Service gestion DNS/CDN/WAF pour clients.',r:30000,s:'idea',b:'bi',a:['Packager offre CF','Dashboard multi-compte','5 clients cibles']}
|
|
],m:[{l:'Pipeline',v:'240K',s:'5 opps',c:'cy'},{l:'Serveurs',v:'6+',s:'S95·S204·4 ECS Huawei',c:'e'},{l:'Docker',v:'19',s:'Tous UP',c:'s'},{l:'Uptime',v:'99.7%',s:'Kuma 24/7',c:'g'}]},
|
|
|
|
ia:{l:'IA & Data',ic:'vi',o:[
|
|
{n:'IA Souveraine aaS',d:'LiteLLM cascade 0€: Cerebras 5ms + Groq 12ms + Mistral + Gemini. Sovereign-api port 4000.',r:120000,s:'plan',b:'bp',a:['Offre cascade packagée','Benchmark latence','Landing IA Souveraine','HF Space yace222 déployé']},
|
|
{n:'Agent Builder WEVIA',d:'74 agents live. Blade v2.0 agent loop. Qdrant 5 collections. 199€/mois.',r:150000,s:'idea',b:'bi',a:['Interface builder drag&drop','5 templates agents','Doc API agents']},
|
|
{n:'Data Enrichment Service',d:'Ethica stack: RichScraper Playwright DabaDoc 50 TN/min. 8 crons actifs.',r:80000,s:'wip',b:'bw',a:['API enrichissement REST','Pricing volume','3 clients pilotes']},
|
|
{n:'Qdrant RAG Service',d:'5 collections Qdrant + 5751 training dataset HF. RAG clé-en-main B2B.',r:40000,s:'idea',b:'bi',a:['Package RAG','Demo searchable KB','Pricing tiers']},
|
|
{n:'WEVIA Deep Research',d:'wevia-deep-research.php existant. Rapports IA approfondis pour clients.',r:50000,s:'plan',b:'bp',a:['Packager deep research','Interface client','Pricing par rapport']}
|
|
],m:[{l:'Pipeline',v:'440K',s:'5 opps',c:'v'},{l:'Providers',v:'7',s:'Cascade 0€ 24/7',c:'e'},{l:'Agents',v:'74',s:'Live + Arena',c:'g'},{l:'Ollama',v:'5',s:'brain-v3·qwen3·nomic·minilm',c:'s'},{l:'Tools',v:'275',s:'Dynamic Resolver v7.1',c:'a'}]},
|
|
|
|
marketing:{l:'Marketing',ic:'co',o:[
|
|
{n:'Ethica Email Campaigns',d:'HCP Maghreb. 3000€/15K/mois. Contrat Kaouther Najar actif. Pilot DRY_RUN 7611.',r:180000,s:'wip',b:'bh',a:['Lancer pilot MG+DZ','Enrichir consent','Rapport ROI','ecm.py 4 actions']},
|
|
{n:'WEVADS Brain Engine',d:'646 configs, 9 SACRED winners. O365 PMTA 97% inbox. 77K emails/j capacité.',r:200000,s:'wip',b:'bw',a:['Volume warmup 1783 comptes','Conversions pull auto','Optimiser 9 winners','VMTAs 186-189']},
|
|
{n:'Newsletter B2B Premium',d:'Newsletter IA+pharma+tech Maghreb. LinkedIn + Telegram distribution.',r:30000,s:'idea',b:'bi',a:['Template newsletter','500 subscribers','2 sponsors','Telegram @wevia_cyber_bot']},
|
|
{n:'Social Media B2B',d:'LinkedIn scraper B2B (DSI/CTO Maroc). YouTube Factory. WhatsApp Business API.',r:60000,s:'plan',b:'bp',a:['LinkedIn B2B scraper actif','YouTube Factory setup','WhatsApp Business','Plausible tracking']},
|
|
{n:'MedReach Campaigns',d:'medreach-dashboard.html + medreach-campaign.html existants. Campagnes pharma ciblées.',r:50000,s:'plan',b:'bp',a:['Activer MedReach','Connecter Ethica data','Template campagne pharma']}
|
|
],m:[{l:'Pipeline',v:'520K',s:'5 opps',c:'c'},{l:'Brain Configs',v:'646',s:'9 SACRED winners',c:'g'},{l:'Emails/j',v:'77K',s:'Warmup 1783 comptes',c:'s'},{l:'Inbox Rate',v:'97%',s:'O365 PMTA',c:'e'}]},
|
|
|
|
recruitment:{l:'Recrutement',ic:'ro',o:[
|
|
{n:'Recrutement DevOps/Cloud',d:'LinkedIn B2B scraper DSI/CTO/DG Maroc actif. Fee 15-20% annuel.',r:100000,s:'plan',b:'bp',a:['LinkedIn scraper pw_linkedin_b2b.py','Base CV','Partenariat APEBI','5 postes']},
|
|
{n:'IA/Data Scientists',d:'ML Engineers, Data Scientists, NLP. Fee premium 25%. Marché tendu.',r:80000,s:'idea',b:'bi',a:['Mapping Maroc/TN/DZ','Partnership universités','Pipeline candidats']},
|
|
{n:'Portage Salarial Tech',d:'Portage freelances tech. Marge 8-12%. Structure juridique nécessaire.',r:50000,s:'idea',b:'bi',a:['Structure juridique','Contrat type','Prospection freelances']},
|
|
{n:'Talent Assessment IA',d:'Assessment via WEVIA (tests techniques + soft skills IA). 49€/test.',r:60000,s:'idea',b:'bi',a:['Tests techniques auto','Scoring IA WEVIA','Landing assessment']}
|
|
],m:[{l:'Pipeline',v:'290K',s:'4 opps',c:'r'},{l:'LinkedIn Scraper',v:'Actif',s:'DSI/CTO/DG Maroc',c:'e'},{l:'Fee moyen',v:'20%',s:'Annuel',c:'g'}]},
|
|
|
|
erp:{l:'ERP & SAP',ic:'am',o:[
|
|
{n:'Vistex SAP Pricing',d:'Extension Vistex. SAP pricing industriels Maghreb. OCP, Cosumar, Carrefour.',r:200000,s:'wip',b:'bh',a:['Addendum Section 8.B','Prospects OCP/Cosumar','Formation Vistex','Section 3.d']},
|
|
{n:'ERP Cloud Migration',d:'Migration legacy → cloud (S/4HANA, Odoo). PME 100-500 employés.',r:150000,s:'plan',b:'bp',a:['Partnership Odoo Maroc','Benchmark S/4 vs Odoo','3 prospects industriels']},
|
|
{n:'Process Optimization',d:'Audit processus + ERP. Value Stream Mapping (vsm-pipelines.html).',r:60000,s:'idea',b:'bi',a:['Template audit','Connecter VSM','Offre packagée']},
|
|
{n:'Integration API ERP-CRM',d:'Twenty CRM ↔ ERP clients. Middleware WEVAL. booking.html existant.',r:40000,s:'idea',b:'bi',a:['Connecteur Twenty↔SAP','API middleware','Demo intégration']}
|
|
],m:[{l:'Pipeline',v:'450K',s:'4 opps',c:'a'},{l:'Partnership',v:'Vistex',s:'SAP Pricing Maghreb',c:'g'},{l:'Prospects',v:'3',s:'OCP·Cosumar·Carrefour',c:'e'}]},
|
|
|
|
formation:{l:'Formation',ic:'gold',o:[
|
|
{n:'IA pour Dirigeants',d:'Programme 2j pratique WEVIA. DG/DSI privé. 15K MAD/session.',r:90000,s:'plan',b:'bp',a:['Programme 2j','Salle Casa','Prospection CGEM','Support WEVIA Arena']},
|
|
{n:'Bootcamp DevOps/Cloud',d:'5j Docker, CI/CD, K8s, monitoring. Stack souveraine WEVAL. 8K MAD/participant.',r:60000,s:'idea',b:'bi',a:['Curriculum 5j','Lab Docker WEVAL','Certification']},
|
|
{n:'Email Marketing Pro',d:'Formation WEVADS Brain Engine 2j. Deliverability + PMTA. 12K MAD.',r:40000,s:'idea',b:'bi',a:['Contenu deliverability','Cas pratiques','Support post-formation']},
|
|
{n:'Academy WEVAL Online',d:'E-learning IA, Cloud, Data, DevOps. 29€/mois. LMS à déployer.',r:80000,s:'idea',b:'bi',a:['Plateforme LMS','5 cours','Landing academy.weval.ma']},
|
|
{n:'Certification WEVIA Expert',d:'Certif consultants partenaires. 500€/certification. Réseau.',r:30000,s:'idea',b:'bi',a:['Programme certif','Examen online','Réseau certifiés']}
|
|
],m:[{l:'Pipeline',v:'300K',s:'5 opps',c:'g'},{l:'Programmes',v:'5',s:'IA·DevOps·Email·LMS·Certif',c:'a'},{l:'Cible',v:'CGEM',s:'+APEBI+universités',c:'s'}]}
|
|
};
|
|
|
|
// PLAN 90 JOURS (from V1 enriched)
|
|
const P90=[
|
|
{w:'Semaine 1-2',acts:['Signer Vistex Lead Protection Addendum','Lancer Ethica Pilot DRY_RUN 7611 MG+DZ','Finaliser onboarding ArrowSphere','LinkedIn B2B scraper 50 profils DSI','Landing page WeviaAI.ma mockup','Résolution Huawei Cloud: documenter + escalade']},
|
|
{w:'Semaine 3-4',acts:['3 labos pilotes Ethica (Kaouther)','Offre Scaleway packagée + 10 prospects','Setup Stripe pour WEVIA SaaS','Programme formation IA 2j finalisé','MedReach: connecter Ethica data','Package consulting Cloud Migration']},
|
|
{w:'Semaine 5-6',acts:['Beta WEVIA SaaS 10 users','SEO Module Hub live + Plausible API','Newsletter B2B: template + 500 subs','Framework Audit Maturité Digitale','Bootcamp DevOps: curriculum 5j','WhatsApp Business API activer']},
|
|
{w:'Semaine 7-8',acts:['WEVIA White-label: mockup client','ERP Cloud Migration: partnership Odoo','Deep Research: packager offre','Certification WEVIA: programme','Talent Assessment IA: tests auto','Academy WEVAL: plateforme LMS']},
|
|
{w:'Semaine 9-10',acts:['Prospection CGEM 3 formations','Qdrant RAG: package + demo','Cloudflare management: offre client','YouTube Factory: premiers contenus','Value Stream Mapping: offre client','LinkedIn posts: stratégie B2B content']},
|
|
{w:'Semaine 11-12',acts:['Bilan Q1: pipeline signé vs objectif','Ajuster pricing toutes offres','Scale WEVADS: +5 winners brain','Réseau certifiés WEVIA: 5 premiers','Solution Finder: A/B test conversion','Growth Engine v4: auto-enrichissement IA']}
|
|
];
|
|
|
|
// SOCIAL CHANNELS
|
|
const SOC=[
|
|
{name:'LinkedIn B2B',ico:'🔗',status:'Actif',desc:'Scraper Playwright pw_linkedin_b2b.py. Cibles: DSI, CTO, DG Maghreb. DuckDuckGo/Bing profiles sans login.',api:'pw_linkedin_b2b.py + linkedin-posts.php',color:'var(--sa)'},
|
|
{name:'YouTube Factory',ico:'▶',status:'Setup',desc:'youtube-factory.php + youtube-factory/api.php. Production contenu IA/Cloud/Consulting.',api:'youtube-factory.php (mode demo)',color:'var(--co)'},
|
|
{name:'Telegram Bot',ico:'✈',status:'Actif',desc:'@wevia_cyber_bot, chat_id 7605775322. Alertes monitoring + notifications.',api:'blade-telegram.php + wedroid-telegram-alert.php',color:'var(--sa)'},
|
|
{name:'WhatsApp Business',ico:'💬',status:'Config',desc:'Meta Graph API v22.0. Actions: status, send, send_bulk, templates.',api:'whatsapp-api.php (4 actions)',color:'var(--em)'},
|
|
{name:'Mattermost',ico:'💜',status:'Live',desc:'Docker port 8065. Communication interne équipe + webhooks.',api:'blade-mattermost.php',color:'var(--vi)'},
|
|
{name:'Email Marketing',ico:'📧',status:'Live',desc:'WEVADS Brain Engine 646 configs. PMTA O365. 8 seeds Videotron+T-Online.',api:'wevia-email-api.php + Brain Engine',color:'var(--gold)'},
|
|
{name:'Plausible Analytics',ico:'📊',status:'Live',desc:'Docker port 8000. Analytics souverain. Nécessite bearer token config.',api:'Plausible API :8000',color:'var(--em)'},
|
|
{name:'Twenty CRM',ico:'🏢',status:'Live',desc:'Docker port 3000. CRM complet pour pipeline commercial.',api:'Twenty :3000 (GraphQL)',color:'var(--cy)'}
|
|
];
|
|
|
|
// CONNECTIONS (21 services)
|
|
const CN=[
|
|
{n:'Twenty CRM',p:':3000',s:'up'},{n:'Plausible',p:':8000',s:'up'},{n:'SearXNG',p:':8888',s:'up'},
|
|
{n:'Mattermost',p:':8065',s:'up'},{n:'Vaultwarden',p:':8222',s:'up'},{n:'Uptime Kuma',p:':3001',s:'up'},
|
|
{n:'Qdrant',p:':6333',s:'up'},{n:'Langfuse',p:':3100',s:'up'},{n:'Gitea',p:':3400',s:'up'},
|
|
{n:'Prometheus',p:':9090',s:'up'},{n:'WEVIA Master',p:':5899',s:'up'},{n:'Sentinel',p:':5890',s:'up'},
|
|
{n:'LiteLLM',p:':4001',s:'up'},{n:'Sovereign API',p:':4000',s:'up'},{n:'PostgreSQL',p:':5432',s:'up'},
|
|
{n:'Brain Engine',p:':5821',s:'up'},{n:'Arsenal',p:':5890',s:'up'},{n:'Paperclip',p:'—',s:'dn'},
|
|
{n:'MiroFish',p:'—',s:'dn'},{n:'n8n',p:':5678',s:'wr'},{n:'Ollama 5 mod.',p:':11434',s:'up'}
|
|
];
|
|
|
|
const TABS=['dashboard','consulting','digital','cloud','ia','marketing','recruitment','erp','formation','pipeline','plan90','social','scout','connections'];
|
|
|
|
function mc(m){return `<div class="mc ${m.c}" data-k="${m.k||m.l}" onclick="v87Drill(this.dataset.k)" style="cursor:pointer;transition:transform .15s"><div class="mc-l">${m.l}</div><div class="mc-v">${m.v}</div><div class="mc-s">${m.s}</div></div>`;}/*V87-drill*/
|
|
function cd(o,mx){
|
|
const p=mx?Math.round(o.r/mx*100):0;
|
|
const cl=o.b==='bh'?'var(--co)':o.b==='bw'?'var(--gold)':o.b==='bp'?'var(--sa)':'var(--vi)';
|
|
let aa='';if(o.a)o.a.forEach(x=>{aa+=`<span class="at" onclick="this.classList.toggle('dn')">${x}</span>`;});
|
|
return `<div class="cd"><div class="cd-h"><div class="cd-t">${o.n}</div><span class="bd ${o.b}">${SN[o.s]||o.s}</span></div><div class="cd-d">${o.d}</div>${o.r?`<div class="rv"><div class="rv-b"><div class="rv-f" style="width:${p}%;background:${cl}"></div></div><div class="rv-v">${(o.r/1000|0)}K</div></div>`:''}<div class="ca">${aa}</div></div>`;
|
|
}
|
|
function buildKB(ops){
|
|
const by={idea:[],plan:[],wip:[],sign:[]};ops.forEach(o=>{if(by[o.s])by[o.s].push(o);});
|
|
let h='<div class="kb">';
|
|
['idea','plan','wip','sign'].forEach(k=>{
|
|
const it=by[k]||[];
|
|
h+=`<div class="kc"><div class="kh ${SC[k]}">${SN[k]} <span class="n">${it.length}</span></div>`;
|
|
it.forEach(o=>{h+=`<div class="ki">${o.n}${o.vl?`<span class="tg">${o.vl}</span>`:''}</div>`;});
|
|
if(!it.length)h+=`<div class="ki" style="color:var(--t3)">—</div>`;h+=`</div>`;
|
|
});return h+'</div>';
|
|
}
|
|
|
|
function build(){
|
|
const nav=document.getElementById('nav');
|
|
const tabLabels={dashboard:'Dashboard',pipeline:'Pipeline CRM',plan90:'Plan 90J',social:'Réseaux & Canaux',scout:'Dark Scout',predict:'WePredict',connections:'Connexions'};
|
|
const tabColors={dashboard:'var(--gold)',pipeline:'var(--em)',plan90:'var(--am)',social:'var(--sa)',scout:'var(--cy)',predict:'var(--ro)',connections:'var(--vi)'};/*V86*/
|
|
let nh='';
|
|
TABS.forEach((t,i)=>{
|
|
const on=i===0?' on':'';
|
|
if(V[t])nh+=`<div class="vt${on}" data-v="${t}"><span class="dt" style="background:var(--${V[t].ic})"></span>${V[t].l} <span class="ct">${V[t].o.length}</span></div>`;
|
|
else nh+=`<div class="vt${on}" data-v="${t}"><span class="dt" style="background:${tabColors[t]||'var(--t3)'}"></span>${tabLabels[t]||t}</div>`;
|
|
});
|
|
nav.innerHTML=nh;
|
|
nav.querySelectorAll('.vt').forEach(t=>{t.onclick=()=>{
|
|
nav.querySelectorAll('.vt').forEach(x=>x.classList.remove('on'));t.classList.add('on');
|
|
document.querySelectorAll('.sc').forEach(s=>s.classList.remove('on'));
|
|
const s=document.getElementById('s-'+t.dataset.v);if(s)s.classList.add('on');
|
|
};});
|
|
|
|
const mn=document.getElementById('mn');
|
|
const all=Object.entries(V).flatMap(([k,v])=>v.o.map(o=>({...o,vl:v.l})));
|
|
const tot=all.reduce((s,o)=>s+o.r,0);
|
|
const byS={idea:0,plan:0,wip:0,sign:0};all.forEach(o=>{if(byS[o.s]!==undefined)byS[o.s]++;});
|
|
const VC={consulting:'var(--em)',digital:'var(--sa)',cloud:'var(--cy)',ia:'var(--vi)',marketing:'var(--co)',recruitment:'var(--ro)',erp:'var(--am)',formation:'var(--gold)'};
|
|
|
|
let h=`<div class="sc on" id="s-dashboard">`;
|
|
h+=`<div class="mr">${mc({k:'pipeline_total',l:'Pipeline Total',v:(tot/1000|0)+'K MAD',s:all.length+' opps · 8 verticaux',c:'g'})}${mc({k:'en_cours',l:'En cours',v:byS.wip+'',s:'Deals actifs',c:'e'})}${mc({k:'planifie',l:'Planifié',v:byS.plan+'',s:'Préparation',c:'s'})}${mc({k:'idees',l:'Idées',v:byS.idea+'',s:'À explorer',c:'v'})}${mc({k:'hcps_ethica',l:'HCPs Ethica',v:'157K',s:'120K emails · 72K verified',c:'c'})}${mc({k:'docker',l:'Docker',v:'19',s:'Tous UP',c:'cy'})}${mc({k:'tools_wevia',l:'Tools WEVIA',v:'626',s:'Resolver v8 · DP+V57+V60',c:'v'})}${mc({k:'pages_apis',l:'Pages + APIs',v:'656',s:'279 pages · 730 APIs',c:'a'})}${mc({k:'ia_cascade',l:'IA Cascade',v:'0€',s:'17 providers 24/7',c:'r'})}${mc({k:'crons',l:'Crons',v:'34',s:'Actifs S95+S204',c:'g'})}</div>`;
|
|
|
|
h+=`<div class="cb"><div class="ch"><span class="lv"></span> WEVIA Master — Growth Advisor</div><div class="cm" id="cM"><div class="mg sy">Connecté — 8 verticaux · 626 tools · 730 APIs · 17 providers IA · 157K HCPs. Question ?</div></div><div class="ci"><input id="cI" placeholder="Pricing API HCP ? ROI formation ? Plan recrutement ? Stratégie ERP ?" onkeydown="if(event.key==='Enter')chat()"><button onclick="chat()">Envoyer</button></div></div>`;
|
|
|
|
h+=`<div class="st">Pipeline global <span class="ln"></span></div>${buildKB(all)}`;
|
|
h+=`<div class="st">Revenus par vertical <span class="ln"></span></div>`;
|
|
Object.entries(V).forEach(([k,v])=>{
|
|
const vr=v.o.reduce((s,o)=>s+o.r,0);const p=tot?Math.round(vr/tot*100):0;
|
|
h+=`<div style="display:flex;align-items:center;gap:7px;margin-bottom:5px"><span style="font-size:10px;min-width:75px;color:var(--t2)">${v.l}</span><div class="rv-b" style="flex:1"><div class="rv-f" style="width:${p}%;background:${VC[k]}"></div></div><span class="rv-v">${(vr/1000|0)}K</span></div>`;
|
|
});h+=`</div>`;
|
|
|
|
// VERTICAL SECTIONS
|
|
Object.entries(V).forEach(([k,v])=>{
|
|
const mx=Math.max(...v.o.map(o=>o.r),1);
|
|
h+=`<div class="sc" id="s-${k}"><div class="st">${v.l} <span class="ln"></span></div><div class="mr">${v.m.map(m=>mc(m)).join('')}</div><div class="cg">${v.o.map(o=>cd(o,mx)).join('')}</div></div>`;
|
|
});
|
|
|
|
// PIPELINE CRM
|
|
h+=`<div class="sc" id="s-pipeline"><div class="st">Pipeline Commercial — Twenty CRM + WEVAL CRM <span class="ln"></span></div>${buildKB(all)}`;
|
|
h+=`<div class="st">Top opportunités par revenu <span class="ln"></span></div><table class="tbl"><thead><tr><th>Opportunité</th><th>Vertical</th><th>Valeur</th><th>Stage</th></tr></thead><tbody>`;
|
|
all.filter(o=>o.r>0).sort((a,b)=>b.r-a.r).forEach(o=>{
|
|
h+=`<tr><td style="color:var(--t1);font-weight:500">${o.n}</td><td>${o.vl}</td><td style="font-family:var(--fm);color:var(--gold)">${(o.r/1000|0)}K</td><td><span class="bd ${o.b}">${SN[o.s]}</span></td></tr>`;
|
|
});h+=`</tbody></table></div>`;
|
|
|
|
// PLAN 90J
|
|
h+=`<div class="sc" id="s-plan90"><div class="st">Plan d'Action — 90 Jours <span class="ln"></span></div>`;
|
|
P90.forEach(w=>{
|
|
h+=`<div class="p90-w"><div class="p90-h">${w.w}</div>`;
|
|
w.acts.forEach(a=>{h+=`<div class="p90-a"><input type="checkbox" onchange="this.parentElement.classList.toggle('done')"><span>${a}</span></div>`;});
|
|
h+=`</div>`;
|
|
});h+=`</div>`;
|
|
|
|
// SOCIAL & CHANNELS
|
|
h+=`<div class="sc" id="s-social"><div class="st">Réseaux Sociaux & Canaux de Distribution <span class="ln"></span></div><div class="soc">`;
|
|
SOC.forEach(s=>{
|
|
const stCls=s.status==='Actif'||s.status==='Live'?'bs':s.status==='Setup'||s.status==='Config'?'bw':'bi';
|
|
h+=`<div class="soc-c"><div class="soc-h"><span class="soc-ico">${s.ico}</span>${s.name}<span class="bd ${stCls}" style="margin-left:auto">${s.status}</span></div><div class="soc-stat">${s.desc}</div><div class="soc-api">API: ${s.api}</div></div>`;
|
|
});h+=`</div></div>`;
|
|
|
|
// DARK SCOUT
|
|
h+=`<div class="sc" id="s-scout"><div class="st">Dark Scout — SearXNG Intelligence <span class="ln"></span></div><div style="display:flex;gap:6px;margin-bottom:12px"><input id="sQ" placeholder="consulting SAP Maroc, email pharma, recrutement DevOps, ERP migration..." style="flex:1;background:var(--bg3);border:1px solid var(--brd);border-radius:5px;padding:7px 9px;color:var(--t1);font-size:10px;font-family:var(--fb);outline:none" onkeydown="if(event.key==='Enter')scout()"><button onclick="scout()" style="padding:7px 14px;border-radius:5px;border:none;background:var(--sa);color:#fff;font-weight:600;font-size:10px;cursor:pointer">Scan</button></div><div class="sr" id="sR"><div style="color:var(--t3);font-size:10px">SearXNG: veille concurrentielle multi-sources</div></div></div>`;
|
|
|
|
|
|
// V86 WEPREDICT DASHBOARD
|
|
h+=`<div class="sc" id="s-predict"><div class="st"> WePredict Predictive Analytics <span class="ln"></span></div>
|
|
<div class="mr" id="predictKPIs">
|
|
<div class="mc" style="border-left:3px solid var(--ro)"><div class="mcl">Load Predicted (next 1h)</div><div class="mcv" id="predLoad">...</div><div class="mcs" id="predLoadSub">regression slope</div></div>
|
|
<div class="mc" style="border-left:3px solid var(--am)"><div class="mcl">Alert Threshold</div><div class="mcv" id="predAlert">...</div><div class="mcs">auto-heal armed</div></div>
|
|
<div class="mc" style="border-left:3px solid var(--cy)"><div class="mcl">Cache Hit Rate</div><div class="mcv" id="predCache">...</div><div class="mcs" id="predCacheSub">hits/gets</div></div>
|
|
<div class="mc" style="border-left:3px solid var(--em)"><div class="mcl">Samples Analyzed</div><div class="mcv" id="predSamples">...</div><div class="mcs">rolling window</div></div>
|
|
<div class="mc" style="border-left:3px solid var(--vi)"><div class="mcl">Top Patterns</div><div class="mcv" id="predPatterns">...</div><div class="mcs">auto-learned</div></div>
|
|
<div class="mc" style="border-left:3px solid var(--sa)"><div class="mcl">Trend</div><div class="mcv" id="predTrend">...</div><div class="mcs" id="predTrendSub">slope direction</div></div>
|
|
</div>
|
|
<div class="st" style="margin-top:15px">Top 5 Query Patterns (auto-learned) <span class="ln"></span></div>
|
|
<div id="predPatternsList" style="background:var(--bg3);padding:12px;border-radius:6px;font-family:var(--fm);font-size:10px;color:var(--t2)">Loading WePredict data...</div>
|
|
<div class="st" style="margin-top:15px">Recommended Actions <span class="ln"></span></div>
|
|
<div id="predActions" style="background:var(--bg3);padding:12px;border-radius:6px;font-size:11px;color:var(--t2)">Loading...</div>
|
|
</div>`;
|
|
|
|
// CONNECTIONS
|
|
h+=`<div class="sc" id="s-connections"><div class="st">21 Services connectés <span class="ln"></span></div><div class="cns">${CN.map(c=>`<div class="cn"><div class="cn-d ${c.s}"></div><div class="cn-n">${c.n}</div><div class="cn-p">${c.p}</div></div>`).join('')}</div>`;
|
|
h+=`<div class="st">Assets Registry (${new Date().toLocaleDateString('fr')}) <span class="ln"></span></div><table class="tbl"><thead><tr><th>Asset</th><th>Type</th><th>Status</th><th>Mat.</th></tr></thead><tbody id="aB"><tr><td colspan="4" style="color:var(--t3)"><span class="spnr"></span> Chargement registry...</td></tr></tbody></table></div>`;
|
|
|
|
mn.innerHTML=h;
|
|
}
|
|
|
|
async function loadAssets(){try{const r=await fetch(API+'?action=registry');const d=await r.json();if(d.assets){const b=document.getElementById('aB');if(b)b.innerHTML=d.assets.map(a=>`<tr><td style="color:var(--t1);font-weight:500">${a.name}</td><td>${a.type||'?'}</td><td><span class="bd ${a.status==='live'||a.status==='up'?'bs':'bh'}">${a.status}</span></td><td style="font-family:var(--fm)">${a.maturity||'?'}%</td></tr>`).join('');}}catch(e){}}
|
|
|
|
async function chat(){const inp=document.getElementById('cI'),q=inp.value.trim();if(!q)return;inp.value='';const m=document.getElementById('cM');m.innerHTML+=`<div class="mg us">${q}</div><div class="mg ai" id="cL"><span class="spnr"></span></div>`;m.scrollTop=m.scrollHeight;try{const r=await fetch(WV,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:q,context:'Growth Engine v3. 8 verticaux (consulting/digital/cloud/IA/marketing/recrutement/ERP/formation). Pipeline '+(Object.values(V).reduce((s,v)=>s+v.o.reduce((ss,o)=>ss+o.r,0),0)/1000|0)+'K MAD. 279 pages, 730 APIs, 626 tools, 17 Docker, 57 crons, 7 IA providers 0€, 157K HCPs, 74 agents, 5 Ollama models. Partenaires: Vistex SAP, Arrow/Scaleway, Ethica Kaouther. Social: LinkedIn scraper, YouTube Factory, Telegram bot, WhatsApp Business, Mattermost.',session:'growth-v3'})});const d=await r.json();const el=document.getElementById('cL');if(el)el.outerHTML=`<div class="mg ai">${(d.content||d.response||'—').replace(/\n/g,'<br>')}</div>`;}catch(e){const el=document.getElementById('cL');if(el)el.outerHTML=`<div class="mg ai" style="color:var(--co)">Erreur WEVIA</div>`;}m.scrollTop=m.scrollHeight;}
|
|
|
|
async function scout(){const q=document.getElementById('sQ').value.trim();if(!q)return;const b=document.getElementById('sR');b.innerHTML='<span class="spnr"></span> SearXNG...';try{const r=await fetch(API+'?action=dark_scout&q='+encodeURIComponent(q));const d=await r.json();if(d.results&&d.results.length)b.innerHTML=d.results.map(r=>`<div class="si2"><div class="si2-t">${r.title||''}</div><div class="si2-u">${r.url||''}</div><div class="si2-s">${r.content||r.snippet||''}</div></div>`).join('');else b.innerHTML=`<div style="color:var(--t3)">0 résultats</div>`;}catch(e){b.innerHTML=`<div style="color:var(--co)">Erreur</div>`;}}
|
|
|
|
async function fullScan(){const btn=document.querySelector('.sb');btn.innerHTML='<span class="spnr"></span>';btn.disabled=true;try{const r=await fetch(API+'?action=scan');const d=await r.json();const m=document.getElementById('cM');if(m&&d){m.innerHTML+=`<div class="mg ai"><strong>Scan ✓</strong><br>${(d.proposal||d.summary||JSON.stringify(d).substring(0,500)).replace(/\n/g,'<br>')}</div>`;m.scrollTop=m.scrollHeight;}}catch(e){}btn.innerHTML='<span class="ic">↻</span> Scan All';btn.disabled=false;loadAssets();loadPredict();/*V86*/}
|
|
|
|
build();loadAssets();
|
|
</script>
|
|
|
|
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
|
|
<script>
|
|
(function(){
|
|
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
|
|
var d = document;
|
|
var m = d.createElement('div');
|
|
m.id = 'opus-udrill';
|
|
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
|
|
var inner = d.createElement('div');
|
|
inner.id = 'opus-udrill-in';
|
|
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
|
|
inner.addEventListener('click', function(e){ e.stopPropagation(); });
|
|
m.appendChild(inner);
|
|
m.addEventListener('click', function(){ m.style.display='none'; });
|
|
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
|
|
(d.body || d.documentElement).appendChild(m);
|
|
|
|
function openCard(card) {
|
|
// Clone card content + show close btn + increase font-size
|
|
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
|
|
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
|
|
inner.innerHTML = html;
|
|
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
|
|
m.style.display = 'flex';
|
|
}
|
|
|
|
function wire(root) {
|
|
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
|
|
var cards = root.querySelectorAll(sels);
|
|
for (var i = 0; i < cards.length; i++) {
|
|
var c = cards[i];
|
|
if (c.__opusWired) continue;
|
|
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
|
|
var r = c.getBoundingClientRect();
|
|
if (r.width < 60 || r.height < 40) continue;
|
|
c.__opusWired = true;
|
|
c.style.cursor = 'pointer';
|
|
c.setAttribute('role','button');
|
|
c.setAttribute('tabindex','0');
|
|
c.addEventListener('click', function(ev){
|
|
// If a more-specific drill is already active (e.g. pp-card custom), let it handle
|
|
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
|
|
if (ev.target.closest('a,button,input,select')) return;
|
|
ev.preventDefault(); ev.stopPropagation();
|
|
openCard(this);
|
|
});
|
|
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
|
|
}
|
|
}
|
|
|
|
// Initial + mutation observer
|
|
var initRun = function(){ wire(d.body || d.documentElement); };
|
|
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
|
|
else initRun();
|
|
var mo = new MutationObserver(function(muts){
|
|
var newCard = false;
|
|
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
|
|
if (newCard) initRun();
|
|
});
|
|
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
|
|
})();
|
|
|
|
// V86 WePredict loader
|
|
async function loadPredict(){
|
|
try{
|
|
const r=await fetch('/api/dsh-predict-api.php');
|
|
const d=await r.json();
|
|
if(!d || !d.ok) return;
|
|
const loadData=d.load||{};
|
|
const cacheData=d.cache||{};
|
|
const el=(id,v)=>{const e=document.getElementById(id);if(e)e.textContent=v;};
|
|
el('predLoad', (loadData.predicted_next_hour||0).toFixed(2));
|
|
el('predLoadSub', 'slope: '+(loadData.regression_slope||0).toExponential(2));
|
|
el('predAlert', (loadData.threshold||5)+' '+(loadData.alert?'ARMED':'OK'));
|
|
el('predCache', (cacheData.hit_rate_pct||0).toFixed(1)+'%');
|
|
el('predCacheSub', (cacheData.hits||0)+' / '+(cacheData.gets||0));
|
|
el('predSamples', loadData.n_samples||0);
|
|
el('predPatterns', cacheData.patterns_count||0);
|
|
const slope=loadData.regression_slope||0;
|
|
el('predTrend', slope<0?'DECLINING':slope>0?'RISING':'STABLE');
|
|
el('predTrendSub', 'n='+(loadData.n_samples||0));
|
|
const plEl=document.getElementById('predPatternsList');
|
|
if(plEl && cacheData.top_patterns){
|
|
const tp=Object.entries(cacheData.top_patterns).slice(0,5);
|
|
plEl.innerHTML=tp.map(([q,cnt],i)=>`<div style="padding:4px 0;border-bottom:1px solid var(--brd)">${i+1}. <span style="color:var(--t1)">${q}</span> <span style="color:var(--gold)">(${cnt} hits)</span></div>`).join('');
|
|
}
|
|
const acEl=document.getElementById('predActions');
|
|
if(acEl){
|
|
const acts=loadData.recommended_actions||[];
|
|
acEl.innerHTML=acts.length>0 ? acts.map(a=>`<div style="padding:4px 0">${loadData.alert?'ALERT':''} <code style="color:var(--cy)">${a}</code></div>`).join('') : '<span style="color:var(--t3)">No actions needed - system healthy</span>';
|
|
}
|
|
}catch(e){console.error('WePredict load error:',e);}
|
|
}
|
|
// Auto-load on tab switch
|
|
const _origShow=window.show;window.show=function(k){if(_origShow)_origShow(k);if(k==='predict')loadPredict();};
|
|
// Auto-load on first render
|
|
setTimeout(loadPredict, 1500);
|
|
|
|
</script>
|
|
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
|
|
|
<div id="v87-modal" style="position:fixed;inset:0;background:rgba(0,0,0,.85);backdrop-filter:blur(4px);z-index:999999;display:none;align-items:center;justify-content:center;padding:20px"><div style="background:var(--bg2);border:1px solid var(--brd);border-radius:12px;padding:24px;max-width:720px;width:100%;max-height:85vh;overflow-y:auto"><div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px"><div id="v87-title" style="font-size:18px;font-weight:700;color:var(--t1)">Drill-down</div><button onclick="v87Close()" style="background:none;border:0;color:var(--t3);font-size:28px;cursor:pointer;line-height:1">×</button></div><div id="v87-content" style="color:var(--t2);font-size:12px;line-height:1.7"><span class="spnr"></span> Loading...</div></div></div><script>
|
|
const V87_DRILL_MAP={pipeline_total:{title:'Pipeline Total 3490K MAD',intent:'drill toc'},en_cours:{title:'Deals En cours (9)',intent:'drill funnel'},planifie:{title:'Opportunites Planifiees (12)',intent:'drill funnel'},idees:{title:'Ideas a explorer (18)',intent:'implement plan'},hcps_ethica:{title:'157K HCPs Ethica',intent:'ethica live'},docker:{title:'19 Docker containers UP',intent:'v82 unified status'},tools_wevia:{title:'626 Tools WEVIA',intent:'v77 oss discovery enriched'},pages_apis:{title:'656 Pages + APIs',intent:'drill hub'},ia_cascade:{title:'IA Cascade 17 providers 0eur',intent:'sovereign status'},crons:{title:'34 Crons actifs',intent:'cron failed'}};
|
|
async function v87Drill(key){
|
|
const map=V87_DRILL_MAP[key]||{title:key,intent:key};
|
|
const modal=document.getElementById('v87-modal');
|
|
document.getElementById('v87-title').textContent=map.title;
|
|
const content=document.getElementById('v87-content');
|
|
modal.style.display='flex';
|
|
content.innerHTML='<span class="spnr"></span> Querying WEVIA Master...';
|
|
try{
|
|
const r=await fetch('/api/wevia-autonomous.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:map.intent,session:'growth-drill'})});
|
|
const raw=await r.text();
|
|
// Parse SSE or JSON
|
|
let answer='';
|
|
raw.split('\n').forEach(l=>{if(l.startsWith('data: ')){try{const j=JSON.parse(l.slice(6));if(j.type==='answer'||j.text||j.content)answer+=(j.text||j.content||'');}catch(e){}}});
|
|
if(!answer)answer=raw.slice(0,2000);
|
|
let pretty=answer;
|
|
try{const j=JSON.parse(answer);pretty='<pre style=\"background:var(--bg3);padding:14px;border-radius:6px;overflow-x:auto;font-size:11px\">'+JSON.stringify(j,null,2)+'</pre>';}catch(e){pretty='<div style=\"white-space:pre-wrap\">'+answer.replace(/</g,'<')+'</div>';}
|
|
content.innerHTML='<div style=\"margin-bottom:10px;font-size:11px;color:var(--t3)\">via WEVIA intent: <code style=\"color:var(--cy)\">'+map.intent+'</code></div>'+pretty;
|
|
}catch(e){content.innerHTML='<div style=\"color:var(--co)\">Error: '+e.message+'</div>';}
|
|
}
|
|
function v87Close(){document.getElementById('v87-modal').style.display='none';}
|
|
document.addEventListener('keydown',e=>{if(e.key==='Escape')v87Close();});
|
|
document.addEventListener('click',e=>{if(e.target.id==='v87-modal')v87Close();});
|
|
document.addEventListener('DOMContentLoaded',()=>{const s=document.createElement('style');s.textContent='.mc[data-k]:hover{transform:translateY(-2px);border-color:var(--gold)!important;box-shadow:0 4px 12px rgba(212,175,55,.2)}';document.head.appendChild(s);});
|
|
</script></body>
|
|
</html>
|