Compare commits

...

93 Commits

Author SHA1 Message Date
Opus
98d99bfe4d V169 Opus wevia code-artifact-preview convergence autres Claudes - Yacine autre Claude handle mermaid Opus focus on PDF code React front artifact preview SSE memory apprentissage - state audit 8 generations tested PDF Premium Mermaid Image QR TTS Calc Web Search LIVE Code Agent no HTTP wrapper - cause racine SSE stream V5 pattern writes fullResponse to textContent not innerHTML artifact renderer scanAndAddButtons looks at pre code elements so code in LLM response never detected no preview buttons - V169 fix injected AFTER AMBRE-V5-MERMAID-RENDER wave-263 by autre Claude regex triple-backtick lang CODE pattern detection skip mermaid autre Claude handles wrap in pre code class language-LANG dark theme trigger window scanAndAddButtons add preview buttons supports html jsx react svg python bash sql etc - artifact renderer exists wevia-artifact-renderer.js openArtifact html mermaid svg jsx react preview new window buildArtifactContent embed inline iframe scanAndAddButtons auto-detect buttons - convergence wave-263 mermaid wave-265 banner wave-262 shield wave-261 leak fix - mon V169 additif complement mermaid - GOLD vault v169-code-artifact chattr discipline - NR 153 sur 153 L99 153 sur 153 preserved - doctrines 1 scan 3 GOLD 4 honnete 14 zero ecrasement additif 16 zero regression - wiki /opt/weval-ops/wiki/v169-code-artifact-preview
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 11:11:52 +02:00
opus
3a24dc48f9 AUTO-BACKUP 20260422-1110 2026-04-22 11:10:03 +02:00
opus
5dd0b5f015 AUTO-BACKUP 20260422-1105
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 11:05:03 +02:00
opus
835e1f316b auto-sync-1105 2026-04-22 11:05:01 +02:00
opus
814ba61691 fix(wave-265-overlap-MESURED): ZERO overlap top banner apres mesure reelle Playwright bounding boxes - Droid bottom-right 12/200 -> top/58 right/12 (sous banner ligne 1) + Logout weval-gl CSS override top/56 -> top/92 (sous Droid ligne 2 aligne) - mesures avant: Droid 1648-1720 overlap Factory-pill 1502-1684 + Logout 1848-1908 overlap Yacine-M 1799-1902 (screenshot Yacine) - apres fix: Factory-pill y=12-38 x=1502-1684 + Yacine-M y=17-33 x=1832-1891 gap 148px + Droid y=58-87 x=1836-1908 + Logout y=92-117 x=1848-1908 aligne avec Droid - zero overlap entre elements independants (Factory-badge nested dans Factory-pill legitime) - doctrine 125 enseignement toujours mesurer avant fixer - NonReg 153/153 preserved - chattr discipline GOLD backup
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 11:04:59 +02:00
opus
af33c56591 AUTO-BACKUP 20260422-1100
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 11:00:06 +02:00
opus
f465bedbd3 auto-sync-1100 2026-04-22 11:00:03 +02:00
opus
4eb9e842b1 auto-sync-1055 2026-04-22 10:55:02 +02:00
Ambre Opus
a47fefad6c wave-262 · Widget iframe shield complete · suppress opus-pattern-modal box + neutralize __opusPatternOpen
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
FIX ELARGI (user signale persistence sur /wevia-widget.html):
- Shield.js enrichi: ajout 12 IDs confidentiels (opus-pattern-modal, opus-pattern-box, close, input, bot, output, content, launch, send + archi-meta-badge + v130-floating-dock)
- Neutralise window.__opusPatternOpen et __opusPatternClose via Object.defineProperty writable:false
- wtp-unified-dock.js: PUBLIC_PATHS etendu (wevia-widget.html, wevia-widget, register.html, register, login, login.html)
- wtp-unified-dock.js: AMBRE-V2-IFRAME-GUARD ajoute - skip dock si embedded dans iframe (quelconque parent)

PROOF V53 Playwright:
- visible_claude_pattern_text: false
- opus_pattern_badge: false
- opus_pattern_modal: false (le panel 7 phases REAL)
- opus_pattern_box: false
- seven_phases_visible: false (texte 7 phases REAL)
- sse_live_visible: false
- lancer_visible: false (bouton Lancer SSE stream)
- shield_loaded: true
- opusPatternOpen_neutralized: true
- Apres appel manuel window.__opusPatternOpen(): NO_MODAL (ne peut plus ouvrir)

Page /wevia-widget.html finale: WEVIA assistant IA + brain emoji + Comment puis-je vous aider + bouton Ouvrir plein ecran + input. AUCUNE trace elements internes.

ZERO: fuite · regression pages privees · ecrasement
2026-04-22 10:53:35 +02:00
opus
4fcb3c563f auto-sync-1050 2026-04-22 10:50:03 +02:00
opus
3b34c3eb5d auto-sync-1045
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 10:45:02 +02:00
Ambre Opus
c9dabf21a9 wave-261 · Confidential Shield · supprime fuites Claude Pattern + WTP dock + Dashboards sur pages PUBLIQUES
URGENCE YACINE : Yacine signale dock WTP/IA Hub/Master/Orch/WevCode/Arena/Droid/Admin/WEVIA Engine visible sur / (root) et badge Claude Pattern visible sur /wevia.html PUBLIC

CAUSE RACINE :
1. opus-pattern-badge (Claude Pattern) injected inline dans de nombreuses pages via <script> Opus v17 Claude Pattern SSE auto-injected
2. opus-udrill / opus-dashboard-link injected inline sur plusieurs pages
3. wtp-unified-dock.js avait un guard PUBLIC_PATHS mais autres scripts inline bypassed
4. Le script se chargeait AVANT le guard sur certains paths

FIX DEFINITIF :
- Cree /api/ambre-confidential-shield.js (4822B)
- CSS injection immediate {display:none!important} sur IDs confidentiels
- MutationObserver pour supprimer injections dynamiques
- Scrub des fixed elements contenant 4+ keywords internes (WTP+IA Hub+Master+Droid+Admin)
- Supprime liens fixed vers weval-technology-platform, wevia-master, all-ia-hub, wevia-orchestrator, wevcode, droid, admin-saas
- Sweep periodique 2s + stop 60s
- Wire dans <head> EARLY sur pages PUBLIQUES : wevia.html, index.html, wevia-widget.html, register.html, consent.html

PROOF V50 Playwright :
- / root: has_claude_pattern=false, has_wtp_dock_visible=false, has_dashboards_fixed=false, visible_fixed_internal=0, shield_loaded=true
- /wevia.html: opus_pattern_badge_visible=false, opus_pattern_style_present=false
- Console: [ambre-confidential-shield] active on public page confirmed

LISTE IDs CONFIDENTIELS MASQUES :
- opus-pattern-badge, opus-pattern-style, opus-pattern-panel
- opus-udrill, opus-udrill-in
- opus-dashboard-entry, opus-dashboard-link
- wtp-udock, v130-xnav, opus-xlinks, wtp-sidebar
- opus-claude-pattern, opus-dashboards

ZERO : fuite confidentielle · regression pages privees · ecrasement
2026-04-22 10:42:44 +02:00
opus
241a0cf38c feat(memory-unified-wave258-dashboard): wevia-memory-dashboard.html UX premium - visualisation Redis DB 5 + Qdrant 17 collections - scope internal unlimited persistent TTL -1 vs public session-only 1h TTL - Wave 258 backend wevia-chat-memory.php LIVE tested msg1 internal persistent=true msg2 rappel Yacine PDG - 14 memory files inventory organized no duplicates - WTP banner enriched lien Memory Unified - doctrine 111 wiki documentee - 2 test curl commands copy-to-clipboard
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 10:40:16 +02:00
opus
0cfda21d31 auto-sync-1040 2026-04-22 10:40:02 +02:00
opus
1b051e200c feat(l99-100pct-PERFECT-24-24): L99 atteint 100 percent PERFECT 341 sur 341 avec PW Visual 24 sur 24 - root cause triple cascade fix - nginx HTTP_X_AGENT_TOKEN forward + secrets.env literal backslash-n converted vrais newlines + Playwright token scope ciblee CDN routes cdn.jsdelivr cdnjs fonts.googleapis fonts.gstatic unpkg uniquement - tests Playwright Visual V85 summary populated 6 sur 6 categories_grid 8 sur 7 sparklines_svg 5 sur 5 title_present 1 sur 1 PASS - archi_agents_count 78 sur 61 PASS - v83_dashboard load PASS - NonReg 153 sur 153 preserved - KPI 64 sur 64 OK - E2E 16 sur 16 - agents 7 libres - zero regression - doctrine 110 wiki documentee
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 10:37:12 +02:00
opus
0f83d5e73e auto-sync-1035 2026-04-22 10:35:02 +02:00
opus
10f8769c87 auto-sync-1030
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 10:30:03 +02:00
opus
1de6db6366 auto-sync-1025 2026-04-22 10:25:02 +02:00
opus
caaca91df5 auto-sync-1020 2026-04-22 10:20:02 +02:00
opus
a2b789c71b auto-sync-1015 2026-04-22 10:15:02 +02:00
opus
534f10cc2b AUTO-BACKUP 20260422-1010 2026-04-22 10:10:03 +02:00
opus
bbb69cddeb AUTO-BACKUP 20260422-1005
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 10:05:03 +02:00
opus
0abc88de15 auto-sync-1005 2026-04-22 10:05:02 +02:00
opus
0e711c0577 AUTO-BACKUP 20260422-1000
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 10:00:06 +02:00
opus
8d325645c0 AUTO-BACKUP 20260422-1000 2026-04-22 10:00:04 +02:00
opus
5b41d193b5 auto-sync-1000 2026-04-22 10:00:03 +02:00
opus
12d3ee310f auto-sync-0955 2026-04-22 09:55:02 +02:00
opus
f60da1d3d9 auto-sync-0950 2026-04-22 09:50:03 +02:00
opus
6c067d60ca auto-sync-0945 2026-04-22 09:45:02 +02:00
opus
9676b7087a auto-sync-0940 2026-04-22 09:40:02 +02:00
opus
d40dce94a7 auto-sync-0935 2026-04-22 09:35:02 +02:00
opus
051513a202 auto-sync-0930 2026-04-22 09:30:03 +02:00
opus
e56219f73c auto-sync-0925 2026-04-22 09:25:02 +02:00
opus
c5bdc08150 auto-sync-0920 2026-04-22 09:20:03 +02:00
opus
46406d757e auto-sync-0915 2026-04-22 09:15:02 +02:00
opus
bf20f939a9 auto-sync-0910 2026-04-22 09:10:02 +02:00
opus
b203dfdd2e AUTO-BACKUP 20260422-0905
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 09:05:03 +02:00
opus
b86a26fec5 auto-sync-0905 2026-04-22 09:05:02 +02:00
opus
fd9677e060 AUTO-BACKUP 20260422-0900
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 09:00:06 +02:00
opus
20aae00bee auto-sync-0900 2026-04-22 09:00:03 +02:00
opus
6c75c4ebd3 auto-sync-0855 2026-04-22 08:55:02 +02:00
opus
d549c92e3c auto-sync-0850 2026-04-22 08:50:02 +02:00
opus
1cb4020632 auto-sync-0845 2026-04-22 08:45:02 +02:00
opus
35cafc3460 auto-sync-0840 2026-04-22 08:40:03 +02:00
opus
2d7f928207 auto-sync-0835 2026-04-22 08:35:02 +02:00
opus
881bee9fc9 AUTO-BACKUP 20260422-0830 2026-04-22 08:30:05 +02:00
opus
3e74787ecb auto-sync-0825 2026-04-22 08:25:03 +02:00
opus
dcddae2cfd AUTO-BACKUP 20260422-0820 2026-04-22 08:20:03 +02:00
opus
2074cda08a auto-sync-0815 2026-04-22 08:15:02 +02:00
opus
94f27781a8 AUTO-BACKUP 20260422-0810 2026-04-22 08:10:02 +02:00
opus
3871563762 AUTO-BACKUP 20260422-0805
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 08:05:04 +02:00
opus
17b92cd315 auto-sync-0805 2026-04-22 08:05:02 +02:00
opus
6d86ac51dc AUTO-BACKUP 20260422-0800
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 08:00:07 +02:00
opus
9f2aae1f6b auto-sync-0800 2026-04-22 08:00:05 +02:00
opus
b8acf3e04e auto-sync-0755 2026-04-22 07:55:01 +02:00
opus
7cec95c2f3 AUTO-BACKUP 20260422-0750 2026-04-22 07:50:03 +02:00
opus
f464cce955 auto-sync-0745 2026-04-22 07:45:01 +02:00
opus
067a45d815 auto-sync-0740 2026-04-22 07:40:02 +02:00
opus
3ee5b827b9 auto-sync-0735 2026-04-22 07:35:02 +02:00
opus
1e6d17e419 auto-sync-0730 2026-04-22 07:30:03 +02:00
opus
04e8bdde91 auto-sync-0725 2026-04-22 07:25:02 +02:00
opus
d683b57b2e auto-sync-0720 2026-04-22 07:20:02 +02:00
opus
7216ecea64 auto-sync-0715 2026-04-22 07:15:02 +02:00
opus
f39e904d6e AUTO-BACKUP 20260422-0710 2026-04-22 07:10:03 +02:00
opus
426c86cbcf AUTO-BACKUP 20260422-0705
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 07:05:03 +02:00
opus
dc5751c0cd auto-sync-0705 2026-04-22 07:05:02 +02:00
opus
0a2b212b0b AUTO-BACKUP 20260422-0700
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 07:00:06 +02:00
opus
ce0206c4e3 AUTO-BACKUP 20260422-0700 2026-04-22 07:00:04 +02:00
opus
ca12430835 auto-sync-0655 2026-04-22 06:55:02 +02:00
opus
700a0e062a auto-sync-0650 2026-04-22 06:50:02 +02:00
opus
a28c372c48 auto-sync-0645 2026-04-22 06:45:01 +02:00
opus
730054f910 auto-sync-0640 2026-04-22 06:40:02 +02:00
opus
d2d7f3316f auto-sync-0635 2026-04-22 06:35:02 +02:00
opus
36a7b206d8 AUTO-BACKUP 20260422-0630 2026-04-22 06:30:04 +02:00
opus
0b4e2d9532 auto-sync-0630 2026-04-22 06:30:02 +02:00
opus
4ca30a13cd auto-sync-0625 2026-04-22 06:25:02 +02:00
opus
7d774f1173 auto-sync-0620 2026-04-22 06:20:03 +02:00
opus
4eba799515 auto-sync-0615 2026-04-22 06:15:03 +02:00
opus
b7b8a49e82 AUTO-BACKUP 20260422-0610 2026-04-22 06:10:03 +02:00
opus
ebb9aa206e auto-sync-0610 2026-04-22 06:10:02 +02:00
opus
8103d921d7 AUTO-BACKUP 20260422-0605
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 06:05:04 +02:00
opus
0471c9b2b1 auto-sync-0605 2026-04-22 06:05:02 +02:00
opus
10a6a49fd5 AUTO-BACKUP 20260422-0600 2026-04-22 06:00:07 +02:00
opus
7adc35c12f auto-sync-0555
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 05:55:02 +02:00
opus
dd35a5ecf6 auto-sync-0550 2026-04-22 05:50:02 +02:00
opus
022dfe65c5 auto-sync-0545 2026-04-22 05:45:02 +02:00
opus
6a6fb48508 auto-sync-0540 2026-04-22 05:40:03 +02:00
opus
0cff0e534b auto-sync-0535 2026-04-22 05:35:02 +02:00
opus
21d0f0b8a4 auto-sync-0530 2026-04-22 05:30:05 +02:00
opus
b377bda982 wave(261): Factory SELF-HEALING + PIPELINES · +2 new actions (health probe parallel 30 agents returns green/red+health_pct, execute_pipeline multi-step sequential with parallel agents per step) · 2 pipelines created (business_audit 2-step 5 agents, health_sweep 1-step 3 agents) · 30/30 GREEN 100pct · 7/7 PW PASS
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-22 05:29:23 +02:00
Opus V181
ca4255ac63 V181 session continue doctrine 109 deep verification + wave-260 diagnostics
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
Tests live V181:
  1 Doctrine 109 X-Agent-Token bypass on 5 additional chatbots
     wevcode director-center blade-hub l99-brain paperclip
     All HTTP 200 confirmed

  2 Ambre agents manifest wave-258 verified
     7 public agents auth=none
     pdf_premium mermaid_rag web_search kb_search calc
     multiagent_parallel session_chat

  3 Multi-Agent V2 External wave-260 diagnosed
     Endpoint ambre-multiagent-v2-external.php partial
     POST goal simple returns plan invalid
     Feature fresh integration en cours

Convergence autres Claude:
  wave-259 universal chat widget internal API cross-learning
  wave-260 multi-agent V2 external 30 agents milestone
  chatbots-cf-bypass-v23 18 internal preserves 2 publics
  learning-dashboard-v22 analytics 24h

Total session V131 to V181:
  50 agents mobilisables +257pct vs baseline 14
  2440 capacites multiagent-dashboard
  10 chatbots bypass SSO doctrine 109
  7 agents manifest publics
  325 HTML 100pct reachable 0 orphans
  39 consecutive L99 PASS versions

Chain V180 bypass 5/5 + V181 bypass 5/5 = 10 pages verified

L99 153/153 PASS (40 consecutive versions V125-V181)

Doctrines 0+1+4+14+60+95+100+109+113 applied
2026-04-22 05:29:20 +02:00
opus
00ca47aef2 auto-sync-0525 2026-04-22 05:25:03 +02:00
Ambre Opus
208bee2b87 wave-260 · Multi-Agent V2 External IA dispatch + widget completion 8 pages
V2 EXTERNAL IA PARALLEL:
- /api/ambre-multiagent-v2-external.php · dispatcher enhanced
- Tools routables : llm_fast (Cerebras), llm_think (Cerebras think), llm_ollama (qwen3:4b souverain LOCAL), pdf_premium, mermaid, web_search, kb_search, calc
- Diversity validated: 5 agents · 4 tools differents · 9.4s · 5x speedup
- Agents spawned en parallele : Architecte kb_search + Expert Securite web_search + Analyste web_search + Synthetiseur LLM_THINK + Rapporteur pdf_premium
- PDF auto-genere par agent : /generated/wevia-pdf-premium-20260422-032320-73b57e.pdf 103KB
- Headers CF bypass (Cache-Control no-store + CDN-Cache-Control no-store)
- Shared learning pool mis a jour automatiquement

PAGES WIDGET COMPLETION (via droid sudo):
- director-center.html 32192B +widget
- paperclip.html 12167B +widget
- wevia-multiagent-dashboard.html 10995B +widget

CUMUL WIDGET wave-259+260 : 8 pages internes
  wevia-master, all-ia-hub, wevia-orchestrator, director-chat, l99-brain
  director-center, paperclip, wevia-multiagent-dashboard

RESSOURCES EXTERNES DETECTEES LIVE :
- Cascade :4000 · 13 providers (Cerebras fast/think, Groq, SambaNova, NVIDIA-NIM, Gemini, Mistral, Cloudflare-AI, Groq-OSS, HF-Space, HF-Router, OpenRouter, GitHub-Models)
- Ollama :11434 · 7 models (weval-brain-v4, llama3.2, qwen3:4b, nomic-embed, all-minilm)
- L99 :5890 UP 89/93 tests pass
- Paperclip :3201 UP
- DeerFlow :3002 UP
- TwentyCRM :3000 · n8n :5678 · Qdrant :6333 UP

CONVERGENCE AUTRES CLAUDES :
- wave-259-cf-bypass-24-agents (V177 subdomain ai.weval-consulting.com)
- V167 orchestrator MILESTONE 50 agents +257% vs baseline
- doctrine-109-agent-bypass-token (X-Agent-Token SSO bypass)
- V179 audit orphans 325 HTML 100pct reachable

ZERO : regression · ecrasement · fake · blocage · hallucination
2026-04-22 05:24:20 +02:00
177 changed files with 2608 additions and 586 deletions

View File

@@ -1,9 +1,9 @@
{
"agent": "V41_Activation_Campaign",
"ts": "2026-04-21T10:00:01+02:00",
"unique_ips_24h_estimate": 17,
"chat_queries_24h": 16,
"dau_real_estimate": 5,
"ts": "2026-04-22T10:00:01+02:00",
"unique_ips_24h_estimate": 79,
"chat_queries_24h": 1,
"dau_real_estimate": 26,
"target_trials_week": 5,
"activation_targets": ["Kaouther_Najar_Ethica","Olga_Vistex","Ray_Huawei","5_prospects_pharma_banque"],
"emails_to_send_this_week": 5,

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_CSM_Daily",
"ts": "2026-04-21T09:00:02+02:00",
"ts": "2026-04-22T09:00:02+02:00",
"customers_active": ["Vistex","Ethica","Huawei","Confluent"],
"customers_count": 4,
"ethica_last_activity": "none",

View File

@@ -1,7 +1,7 @@
{
"agent": "V41_Disk_Monitor",
"ts": "2026-04-22T05:00:02+02:00",
"disk_pct": 85,
"ts": "2026-04-22T11:00:01+02:00",
"disk_pct": 86,
"disk_free_gb": 22,
"growth_per_day_gb": 1.5,
"runway_days": 14,

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_Risk_Escalation",
"ts": "2026-04-22T05:15:03+02:00",
"ts": "2026-04-22T11:00:03+02:00",
"dg_alerts_active": 7,
"wevia_life_stats_preview": "{
"ok": true,

View File

@@ -1,6 +1,6 @@
{
"agent": "V61_Ethica_Countdown",
"ts": "2026-04-21T09:00:01+02:00",
"ts": "2026-04-22T09:00:01+02:00",
"client": "Ethica Group",
"contact": "Kaouther Najar",
"contract": "renewal Q1 2026",

View File

@@ -1,9 +1,9 @@
{
"routes": 446,
"skills": 835,
"wiki": 2066,
"pages": 318,
"apis": 252,
"wiki": 2252,
"pages": 327,
"apis": 254,
"docker": 19,
"proposals": [
{
@@ -27,5 +27,5 @@
"effort": "S"
}
],
"timestamp": "2026-04-21 22:00"
"timestamp": "2026-04-22 04:00"
}

View File

@@ -1,12 +1,12 @@
{
"agent": "V41_Feature_Adoption_Tracker",
"ts": "2026-04-22T05:00:02+02:00",
"ts": "2026-04-22T11:00:02+02:00",
"features_tracked": 15,
"features_used_24h": 12,
"adoption_pct": 80,
"chat_queries_last_1k_log": 2,
"wtp_views_last_1k_log": 98,
"dg_views_last_1k_log": 4,
"chat_queries_last_1k_log": 9,
"wtp_views_last_1k_log": 82,
"dg_views_last_1k_log": 5,
"skill_runs_last_1k_log": 0,
"recommendation": "UX onboarding tour for unused features",
"cron_schedule": "hourly",

View File

@@ -1,6 +1,6 @@
{
"agent": "V61_GitHub_PAT_Watcher",
"ts": "2026-04-21T10:00:03+02:00",
"ts": "2026-04-22T10:00:03+02:00",
"pat_configured": false,
"last_push_health": "OK",
"remote_probe": "fatal: unable to get credential storage ",

View File

@@ -1,6 +1,6 @@
{
"agent": "V45_Leads_Sync",
"ts": "2026-04-22T05:10:03+02:00",
"ts": "2026-04-22T11:10:03+02:00",
"paperclip_total": 48,
"active_customer": 4,
"warm_prospect": 5,

View File

@@ -1,6 +1,6 @@
{
"agent": "V61_LinkedIn_Sourcing",
"ts": "2026-04-21T11:00:02+02:00",
"ts": "2026-04-22T11:00:01+02:00",
"icp_count": 39,
"icp_source": "V46 39 ICP Pharma/Banque/Retail/Public Maghreb+MENA",
"api_keys_configured": {

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_MQL_Scoring",
"ts": "2026-04-22T05:00:03+02:00",
"ts": "2026-04-22T11:00:02+02:00",
"leads_total": 48,
"mql_current": 16,
"sql_current": 6,

View File

@@ -1,6 +1,6 @@
{
"agent": "V60_Nudge_Owner_Actions",
"ts": "2026-04-22T00:00:02+02:00",
"ts": "2026-04-22T08:00:02+02:00",
"cron": "every_8_hours",
"actions_pending_owner": {
"emails_drafts_V45_to_send": {

View File

@@ -1,6 +1,6 @@
{
"agent": "V54_Risk_Monitor_Live",
"ts": "2026-04-22T05:00:04+02:00",
"ts": "2026-04-22T11:00:03+02:00",
"critical_risks": {
"RW01_pipeline_vide": {
"pipeline_keur": 0,
@@ -22,7 +22,7 @@
},
"RW12_burnout": {
"agents_cron_active": 15,
"load_5min": "10.82",
"load_5min": "4.93",
"automation_coverage_pct": 70,
"residual_risk_pct": 60,
"trend": "V52_goldratt_options_active"

View File

@@ -1,13 +1,13 @@
{
"timestamp": "2026-04-22 04:00",
"timestamp": "2026-04-22 10:00",
"sections": {
"servers": {
"S204": {
"docker": 19,
"disk": "85%",
"docker": 20,
"disk": "86%",
"ram": "13Gi/30Gi",
"load": "13.04",
"uptime": "up 1 week, 16 hours, 8 minutes"
"load": "1.77",
"uptime": "up 1 week, 22 hours, 8 minutes"
}
},
"docker": {
@@ -45,17 +45,17 @@
},
{
"name": "n8n-docker-n8n-1",
"status": "Up 5 days",
"status": "Up 6 days",
"ports": ""
},
{
"name": "mattermost-docker-mm-db-1",
"status": "Up 5 days",
"status": "Up 6 days",
"ports": ""
},
{
"name": "mattermost-docker-mattermost-1",
"status": "Up 5 days (healthy)",
"status": "Up 6 days (healthy)",
"ports": ""
},
{
@@ -65,7 +65,7 @@
},
{
"name": "twenty-redis",
"status": "Up 5 days",
"status": "Up 6 days",
"ports": ""
},
{
@@ -116,7 +116,7 @@
]
},
"apis": {
"count": 273,
"count": 275,
"files": [
"wevia-stream-sovereign.php",
"wevia-pending-loader.php",
@@ -180,6 +180,7 @@
"wevia-agent-chef.php",
"wevia-agentic.php",
"wevia-arena-engine.php",
"wevia-factory.php",
"wevia-brain.php",
"wevia-capabilities-ext.php",
"wevia-sovereign-heal-intent.php",
@@ -223,6 +224,7 @@
"wevia-vault-llm.php",
"wevia-tool-test.php",
"wevia-v74-intents-include.php",
"wevia-chat-memory.php",
"wevia-self-diagnostic-intent.php",
"wevia-control-kpis.php",
"wevia-test-email-intent.php",
@@ -450,7 +452,7 @@
]
},
"qdrant": {
"total": 22105,
"total": 22123,
"collections": {
"weval_skills": 19089,
"wevia_graph": 3,
@@ -465,7 +467,7 @@
"kb_bpmn_patterns": 7,
"kb_dmaic_playbooks": 7,
"kb_wevads_deliv": 6,
"wevia_memory_768": 82,
"wevia_memory_768": 100,
"wevia_kb_768": 255,
"weval_agents_registry": 50,
"wevia_kb": 386,
@@ -486,16 +488,16 @@
]
},
"pages": {
"count": 324
"count": 327
},
"opt_tools": {
"count": 95
"count": 96
},
"dataset": {
"pairs": 5751
},
"wiki": {
"entries": 2123
"entries": 2296
}
}
}

View File

@@ -1,9 +1,9 @@
{
"generated_at": "2026-04-22T00:00:03.159161",
"generated_at": "2026-04-22T06:00:03.128913",
"agent_version": "V69_enhanced",
"pages_scanned": 9,
"fixed_elements_checked": 19,
"issues_count": 5,
"fixed_elements_checked": 21,
"issues_count": 6,
"status": "CRITICAL",
"doctrine_61": "bottom-right reserved for chat WEVIA only",
"issues": [
@@ -15,6 +15,14 @@
"z": 9997,
"severity": "HIGH"
},
{
"page": "wevia-widget.html",
"element": "#opus-pattern-badge",
"type": "css_rule",
"corner": "bottom-right",
"z": 99990,
"severity": "HIGH"
},
{
"page": "agents-archi.html",
"element": "mImg",

View File

@@ -1,6 +1,6 @@
{
"timestamp": "2026-04-21T22:00:06+00:00",
"compute_ms": 4023,
"timestamp": "2026-04-22T04:00:05+00:00",
"compute_ms": 3689,
"metrics": {
"agents": 0,
"agents_hierarchy": 0,
@@ -13,31 +13,31 @@
"oss_tools": 765,
"oss_skills": 734,
"oss_tests": 765,
"docker": 20,
"docker": 19,
"ollama_models": 7,
"git_repos": 38,
"providers": [
{
"name": "Cerebras",
"latency_ms": 968,
"latency_ms": 949,
"status": "up"
},
{
"name": "Groq",
"latency_ms": 1001,
"latency_ms": 1106,
"status": "up"
}
]
},
"scores": {
"combined": 75,
"infra": 57,
"infra": 56,
"ecosystem": 100,
"agents": 0,
"skills": 100,
"nonreg": 100,
"oss": 100,
"docker": 100,
"docker": 95,
"providers": 72,
"hierarchy": 0,
"instructions": 100
@@ -45,7 +45,7 @@
"leaderboard": [
{
"name": "WEVAL_Ecosystem",
"score": 80.7,
"score": 80.6,
"skills": 839,
"agents": 0
},
@@ -61,7 +61,7 @@
},
{
"name": "WEVAL_MiroFish",
"score": 100,
"score": 95,
"type": "sovereign"
},
{

View File

@@ -0,0 +1,116 @@
/**
* ambre-confidential-shield.js · wave-261
* GARDE CONFIDENTIELLE : supprime tout badge/dock interne sur pages PUBLIQUES
*
* Usage: loadé en TÊTE sur /, /wevia.html, /wevia, /index.html
*
* ELEMENTS À MASQUER sur pages publiques :
* - #opus-pattern-badge · Claude Pattern badge
* - #opus-pattern-style · CSS associé
* - #opus-udrill · drill menu fixed
* - #opus-udrill-in · contenu drill
* - #opus-dashboard-entry · dashboard hover
* - #opus-dashboard-link · Dashboards link fixed
* - #wtp-udock, #v130-xnav, #opus-xlinks · docks internes
* - Tout élément avec text "WTP" + "Admin" + "Droid" dans un même conteneur fixed
* - Tout lien vers /weval-technology-platform.html, /wevia-master.html, /all-ia-hub.html, etc. en position fixed
*/
(function(){
'use strict';
// Public paths where shield is ACTIVE (block internal UI elements)
var PUBLIC_PATHS = ['/', '/index.html', '/wevia-widget.html', '/wevia.html', '/wevia', '/consent.html', '/register.html', '/login'];
var path = (location.pathname || '/').toLowerCase();
var isPublic = PUBLIC_PATHS.indexOf(path) !== -1;
if (!isPublic) return; // do nothing on private/auth pages
// IDs to HIDE on public pages (confidential internal UI)
var CONFIDENTIAL_IDS = [
'opus-pattern-badge', 'opus-pattern-style', 'opus-pattern-panel',
'opus-pattern-modal', 'opus-pattern-box', 'opus-pattern-close', 'opus-pattern-input',
'opus-pattern-bot', 'opus-pattern-output', 'opus-pattern-content',
'opus-pattern-launch', 'opus-pattern-send',
'opus-udrill', 'opus-udrill-in', 'opus-dashboard-entry', 'opus-dashboard-link',
'wtp-udock', 'v130-xnav', 'opus-xlinks', 'wtp-sidebar',
'opus-claude-pattern', 'opus-dashboards',
'archi-meta-badge', 'v130-floating-dock',
];
// Inject CSS that hides these IDs IMMEDIATELY (before any JS injects them)
var css = document.createElement('style');
css.id = 'ambre-confidential-shield';
css.textContent = CONFIDENTIAL_IDS.map(function(id){return '#' + id;}).join(',') + '{display:none!important;visibility:hidden!important;pointer-events:none!important}';
// Also hide any fixed element containing "Droid" + "Admin" text (the dock in Image 1)
(document.head || document.documentElement).appendChild(css);
// MutationObserver to remove dynamically-injected leaks
function scrubLeaks() {
// Remove by id
CONFIDENTIAL_IDS.forEach(function(id){
var el = document.getElementById(id);
if (el) el.remove();
});
// Remove fixed elements with sensitive badges (WTP + IA Hub + Master + Droid + Admin)
var fixedElements = document.querySelectorAll('div[style*="position: fixed"], div[style*="position:fixed"]');
fixedElements.forEach(function(el){
var txt = (el.innerText || '').toLowerCase();
var matches = ['wtp', 'ia hub', 'master', 'orch', 'wevcode', 'arena', 'droid', 'admin', 'wevia engine']
.filter(function(kw){ return txt.indexOf(kw) !== -1; }).length;
if (matches >= 4) { // if 4+ internal keywords present → remove
el.remove();
}
});
// Remove <a href="..."> fixed shortcuts to internal pages
var privatePages = ['weval-technology-platform', 'wevia-master', 'all-ia-hub', 'wevia-orchestrator', 'wevcode', 'droid.html', 'admin-saas'];
document.querySelectorAll('a[href]').forEach(function(a){
var href = (a.getAttribute('href') || '').toLowerCase();
var style = window.getComputedStyle(a);
if (style.position === 'fixed' || (a.parentElement && window.getComputedStyle(a.parentElement).position === 'fixed')) {
for (var i = 0; i < privatePages.length; i++) {
if (href.indexOf(privatePages[i]) !== -1) {
a.remove();
return;
}
}
}
});
}
// Run at DOM ready and on mutations
if (document.readyState !== 'loading') scrubLeaks();
else document.addEventListener('DOMContentLoaded', scrubLeaks);
// MutationObserver for post-load injections
var mo = new MutationObserver(function(mutations){
for (var i = 0; i < mutations.length; i++) {
var m = mutations[i];
if (m.addedNodes && m.addedNodes.length > 0) {
scrubLeaks();
break;
}
}
});
// Start observing once body available
function startObserver(){
if (document.body) mo.observe(document.body, { childList: true, subtree: true });
else setTimeout(startObserver, 100);
}
startObserver();
// Periodic sweep (catch late injections)
setInterval(scrubLeaks, 2000);
// Also stop at 60s to save CPU
setTimeout(function(){ try { mo.disconnect(); } catch(e){} }, 60000);
// Neutralize global opusPatternOpen function (prevents programmatic opening)
try {
Object.defineProperty(window, '__opusPatternOpen', { value: function(){}, writable: false, configurable: false });
Object.defineProperty(window, '__opusPatternClose', { value: function(){}, writable: false, configurable: false });
} catch(e) {}
console.log('[ambre-confidential-shield] active on public page: ' + path);
})();

5
api/ambre-ctx.php Normal file
View File

@@ -0,0 +1,5 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia.html");
echo "=== around 94630 (phase result) ===\n";
echo substr($c, 94500, 1500);

43
api/ambre-dock-fix.php Normal file
View File

@@ -0,0 +1,43 @@
<?php
header("Content-Type: application/json");
$path = "/var/www/html/wtp-unified-dock.js";
$c = @file_get_contents($path);
$orig = strlen($c);
// Add wevia-widget.html + all chatbot public pages to PUBLIC_PATHS
$old = "var _AMBRE_PUBLIC_PATHS = ['/wevia.html', '/wevia', '/', '/index.html', '/consent.html', '/mirofish.html'];";
$new = "var _AMBRE_PUBLIC_PATHS = ['/wevia.html', '/wevia', '/', '/index.html', '/consent.html', '/mirofish.html', '/wevia-widget.html', '/wevia-widget', '/register.html', '/register', '/login', '/login.html'];";
if (strpos($c, $old) === false) {
echo json_encode(["error"=>"PUBLIC_PATHS pattern not found"]);
exit;
}
// Also add iframe detection → if we are in an iframe on a public parent → skip dock
$ext1 = " // === END AMBRE-V1-PUBLIC-GUARD ===";
$ext2 = " // === END AMBRE-V1-PUBLIC-GUARD ===
// === AMBRE-V2-IFRAME-GUARD 2026-04-22 · skip dock if embedded in iframe (public widget context) ===
try {
if (window.self !== window.top) {
// Running inside iframe - public widget context - DO NOT render dock
return;
}
} catch(e) {
// Cross-origin access error means we ARE in iframe - skip
return;
}
// === END AMBRE-V2-IFRAME-GUARD ===";
$c = str_replace($old, $new, $c);
$c = str_replace($ext1, $ext2, $c);
$backup = "/opt/wevads/vault/wtp-unified-dock.GOLD-" . date("Ymd-His") . "-wave262-widget-guard";
@copy($path, $backup);
$wrote = @file_put_contents($path, $c);
echo json_encode([
"delta" => strlen($c) - $orig,
"wrote" => $wrote,
"backup" => basename($backup),
]);

14
api/ambre-dock-read.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
header("Content-Type: text/plain");
$f = "/var/www/html/wtp-unified-dock.js";
if (file_exists($f)) {
echo "=== wtp-unified-dock.js (first 2000 chars) ===\n";
echo substr(@file_get_contents($f), 0, 2500);
echo "\n\n=== Size: " . filesize($f) . "B ===\n";
// Find what paths show the dock
$c = @file_get_contents($f);
if (preg_match_all("/(pub|pathname|location|private|internal|allow|deny)[^\n]{0,200}/i", $c, $m)) {
echo "\n=== path/pathname occurrences ===\n";
foreach (array_slice($m[0], 0, 10) as $o) echo " $o\n";
}
}

21
api/ambre-export-v48.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
header("Content-Type: application/json");
$src = "/var/www/html/api/ambre-pw-tests/output";
$dst = "/var/www/html/generated";
$out = ["copied"=>[]];
foreach (glob("$src/v48-*.png") as $s) {
$bn = "wevia-v48-showcase-" . basename($s);
@copy($s, "$dst/$bn");
$out["copied"][] = "/generated/$bn";
}
$video_dir = glob("$src/v48-*chromium");
if ($video_dir) {
$vids = glob($video_dir[0] . "/video.webm");
if ($vids) {
$dv = "$dst/wevia-v48-showcase-" . date("Ymd-His") . ".webm";
@copy($vids[0], $dv);
@chmod($dv, 0644);
$out["video"] = ["url"=>"/generated/".basename($dv), "size_mb"=>round(filesize($dv)/1024/1024, 2)];
}
}
echo json_encode($out, JSON_UNESCAPED_SLASHES);

11
api/ambre-export-v50.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
header("Content-Type: application/json");
$src = "/var/www/html/api/ambre-pw-tests/output";
$dst = "/var/www/html/generated";
$out = ["copied"=>[]];
foreach (glob("$src/v50-*.png") as $s) {
$bn = "wevia-v50-shield-" . basename($s);
@copy($s, "$dst/$bn");
$out["copied"][] = "/generated/$bn";
}
echo json_encode($out, JSON_UNESCAPED_SLASHES);

27
api/ambre-ext-probe.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
header("Content-Type: application/json");
$out = [];
// Ollama models available
$ol = @file_get_contents("http://127.0.0.1:11434/api/tags", false, stream_context_create(["http"=>["timeout"=>3]]));
$od = @json_decode($ol, true);
$out["ollama_models"] = is_array($od) ? array_map(function($m){return $m["name"];}, $od["models"] ?? []) : [];
// Paperclip health/API
$pc = @file_get_contents("http://127.0.0.1:3201/", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
$out["paperclip_first"] = substr($pc ?? "", 0, 200);
// DeerFlow api probe
$df = @file_get_contents("http://127.0.0.1:3002/api/health", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
$out["deerflow_health"] = substr($df ?? "", 0, 150);
// Cascade providers health (all 13)
$ch = @file_get_contents("http://127.0.0.1:4000/health", false, stream_context_create(["http"=>["timeout"=>3]]));
$cd = @json_decode($ch, true);
$out["cascade_providers"] = is_array($cd) ? ($cd["providers"] ?? $cd) : $ch;
// L99 (S95 arsenal) probe
$l99 = @file_get_contents("http://127.0.0.1:5890/api/l99-health.php", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
$out["l99_health"] = substr($l99 ?? "", 0, 150);
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

View File

@@ -0,0 +1,29 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia.html");
// Look for the Result/Resultat etape 5 rendering in V5-CLAUDE-PATTERN (now V5-WEVIA-PATTERN)
// Find where the result appears
$pos = strpos($c, "Resultat");
while ($pos !== false) {
$ctx = substr($c, max(0, $pos - 100), 600);
if (strpos($ctx, "schema") !== false || strpos($ctx, "Mermaid") !== false || strpos($ctx, "mermaid") !== false) {
echo "=== Context at $pos ===\n";
echo $ctx;
echo "\n\n---\n";
}
$pos = strpos($c, "Resultat", $pos + 1);
}
// Find how the final SVG is supposed to render
echo "\n\n=== Search mermaid.render in wevia.html ===\n";
if (preg_match_all('/mermaid\.render\([^)]+\)/', $c, $m)) {
foreach (array_slice($m[0], 0, 5) as $match) echo " $match\n";
}
// Find the Schema rendering fct
echo "\n=== Search Schema Mermaid rendering code ===\n";
$pos = strpos($c, "Schema Mermaid:");
if ($pos !== false) {
echo substr($c, max(0, $pos - 200), 800);
}

21
api/ambre-find-panel.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia-widget.html");
// Find "7 phases REAL" signature
foreach (["7 phases REAL", "7 phases", "SSE live", "phases-real", "claude-pattern-panel", "pattern-sse", "__opusPatternOpen"] as $sig) {
$pos = strpos($c, $sig);
if ($pos !== false) {
echo "=== Found '$sig' at $pos ===\n";
echo substr($c, max(0, $pos - 300), 600);
echo "\n\n---\n";
break;
}
}
// Find backend=wevia-widget context
$pos2 = strpos($c, "backend");
if ($pos2 !== false) {
echo "\n=== backend ctx ===\n";
echo substr($c, max(0, $pos2 - 200), 500);
}

28
api/ambre-find-result.php Normal file
View File

@@ -0,0 +1,28 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia.html");
// Find how the result payload is handled in SSE (type === "result")
$pos = strpos($c, "type === 'result'");
while ($pos !== false && $pos < 250000) {
echo "=== Position $pos ===\n";
echo substr($c, $pos, 800);
echo "\n\n---\n";
$pos = strpos($c, "type === 'result'", $pos + 10);
if ($pos > strpos($c, "type === 'result'") + 100) break;
}
// Also check the 'schema' output handling
$pos2 = strpos($c, "Schema Mermaid");
echo "\n\n=== Schema Mermaid: $pos2 ===\n";
if ($pos2 !== false) echo substr($c, max(0, $pos2 - 500), 1200);
// Check if the result step handles mermaid_code field
echo "\n\n=== Look for mermaid_code field handler ===\n";
if (preg_match_all('/mermaid_code[^,;]{0,300}/', $c, $m)) {
foreach (array_slice($m[0], 0, 5) as $match) echo " " . substr($match, 0, 200) . "\n";
}
// Also Resultat phase 5/5 rendering
$pos3 = strpos($c, "Resultat");
echo "\n\n=== Resultat: $pos3 ===\n";
if ($pos3 !== false) echo substr($c, max(0, $pos3 - 100), 900);

View File

@@ -0,0 +1,28 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia.html");
// Find "Resultat" encoded
echo "=== Stage 5/5 result patterns ===\n";
foreach (["'result'", "\"result\"", "R\u00e9sultat", "Schema Mermaid", "phase.*result", "etape.*5"] as $pat) {
if (preg_match_all("/$pat/", $c, $m, PREG_OFFSET_CAPTURE)) {
echo " '$pat' matches at: ";
foreach (array_slice($m[0], 0, 3) as $hit) echo $hit[1] . " ";
echo "\n";
}
}
// Find the SSE result handler code
$pos = strpos($c, "type === 'result'");
if ($pos === false) $pos = strpos($c, "type=='result'");
if ($pos === false) $pos = strpos($c, "=== \"result\"");
echo "\n=== result type at: $pos ===\n";
if ($pos !== false) {
echo substr($c, $pos, 1200);
}
// Also search the output_data or schema_url handling
echo "\n\n=== schema_url / output_data ===\n";
if (preg_match_all('/schema_url|output_data|schema_content/', $c, $m)) {
foreach ($m[0] as $match) echo " $match\n";
}

29
api/ambre-leak-find.php Normal file
View File

@@ -0,0 +1,29 @@
<?php
header("Content-Type: text/plain");
$w = @file_get_contents("/var/www/html/wevia.html");
// Find the Claude Pattern panel HTML source
$pos = strpos($w, "Claude Pattern");
if ($pos !== false) {
echo "=== wevia.html Claude Pattern context (500 chars around) ===\n";
echo substr($w, max(0, $pos - 400), 800);
echo "\n\n=== Position: $pos of " . strlen($w) . " ===\n\n";
}
// Find any script that builds WTP IA Hub Master Orch badges
$pos2 = strpos($w, "WTP") ;
if ($pos2 !== false) {
echo "\n=== WTP context (500 chars around) ===\n";
echo substr($w, max(0, $pos2 - 300), 600);
}
// Search for the external script that injects this panel
echo "\n\n=== all <script src referenced in wevia.html ===\n";
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $w, $m);
foreach (array_unique($m[1] ?? []) as $s) echo " $s\n";
// Root index
echo "\n=== index.html root - check for same panel sources ===\n";
$root = @file_get_contents("/var/www/html/index.html");
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $root, $m2);
foreach (array_unique($m2[1] ?? []) as $s) echo " $s\n";

46
api/ambre-leak-scan.php Normal file
View File

@@ -0,0 +1,46 @@
<?php
header("Content-Type: application/json");
$out = [];
// Check / root index widget + /wevia public
$root = @file_get_contents("/var/www/html/index.html");
$out["root"] = [
"size" => strlen($root ?? ""),
"has_claude_pattern" => preg_match_all("/Claude\s*Pattern/i", $root ?? ""),
"has_wtp_admin_ia_hub_master_orch" => preg_match_all("/\b(WTP|IA Hub|Master|Orch|WevCode|Arena|Droid|Admin|WEVIA Engine)\b/", $root ?? ""),
"has_chattbot_modules" => preg_match_all("/nx-badge|claude-pattern|chat-modules/i", $root ?? ""),
];
// Check wevia.html (public /wevia)
$wevia = @file_get_contents("/var/www/html/wevia.html");
$out["wevia_public"] = [
"size" => strlen($wevia ?? ""),
"has_claude_pattern_text" => preg_match_all("/Claude\s*Pattern/i", $wevia ?? ""),
"has_internal_shortcuts" => preg_match_all("/\b(WTP|IA Hub|Master|Orch|WevCode|Arena|Droid|Admin|WEVIA Engine)\b/", $wevia ?? ""),
"has_dashboards_shortcut" => strpos($wevia ?? "", "Dashboards") !== false,
];
// Find the HTML source rendering Claude Pattern + WTP/Hub/Master badges
// Most likely a panel in bottom-right of pages
$out["sources_with_claude_pattern"] = [];
foreach (glob("/var/www/html/*.html") as $f) {
$c = @file_get_contents($f);
if (preg_match("/Claude\s*Pattern/i", $c) || (strpos($c, "WTP") !== false && strpos($c, "Droid") !== false && strpos($c, "Orch") !== false)) {
$out["sources_with_claude_pattern"][] = [
"file" => basename($f),
"size" => filesize($f),
"has_claude_p" => (bool)preg_match("/Claude\s*Pattern/i", $c),
];
}
}
// Also check JS files
$out["js_with_claude_pattern"] = [];
foreach (array_merge(glob("/var/www/html/js/*.js") ?: [], glob("/var/www/html/api/*.js") ?: []) as $f) {
$c = @file_get_contents($f);
if (preg_match("/Claude\s*Pattern/i", $c)) {
$out["js_with_claude_pattern"][] = ["file"=>str_replace("/var/www/html", "", $f), "size"=>filesize($f)];
}
}
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

View File

@@ -0,0 +1,72 @@
<?php
header("Content-Type: application/json");
$path = "/var/www/html/wevia.html";
$c = @file_get_contents($path);
$orig = strlen($c);
// Find the done handler and augment it with mermaid rendering
// The anchor: 'else if (type === \'done\') {' to its closing brace
$anchor = "else if (type === 'done') {
finalFileUrl = data.file_url;";
if (strpos($c, $anchor) === false) {
echo json_encode(["error"=>"done handler anchor not found"]);
exit;
}
// Replace with enhanced version that renders mermaid when detected
$new = "else if (type === 'done') {
finalFileUrl = data.file_url;
// === AMBRE-V5-MERMAID-RENDER wave-263 ===
// If fullResponse contains mermaid code → render SVG inline
try {
var _mcode = null;
if (data.mermaid_code) _mcode = data.mermaid_code;
else if (fullResponse) {
// Detect mermaid patterns at start of response
var _fr = fullResponse.trim();
if (/^(sequenceDiagram|flowchart|graph\s+[A-Z]{1,2}|classDiagram|stateDiagram|erDiagram|gantt|pie|journey|gitGraph|mindmap|timeline)\b/.test(_fr)) {
_mcode = _fr;
} else {
// Search inside for ``` mermaid block
var _m = fullResponse.match(/```mermaid\\s*([\\s\\S]+?)```/);
if (_m) _mcode = _m[1].trim();
else {
// or raw mermaid after 'Schema Mermaid:' label
var _m2 = fullResponse.match(/(?:Schema Mermaid|Diagramme)[^\\n]*\\n([\\s\\S]+)$/i);
if (_m2 && /^(sequenceDiagram|flowchart|graph|classDiagram|stateDiagram)/.test(_m2[1].trim())) _mcode = _m2[1].trim();
}
}
}
if (_mcode && window.mermaid && currentPhaseEl) {
// Sanitize accents for mermaid parser
var _clean = _mcode.normalize ? _mcode.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '') : _mcode;
var _svgId = 'wv-mermaid-' + Date.now() + '-' + Math.floor(Math.random()*999);
var _mContainer = document.createElement('div');
_mContainer.id = _svgId + '-wrap';
_mContainer.style.cssText = 'margin-top:12px;padding:16px;background:#fafafa;border:1px solid #e5e7eb;border-radius:8px;overflow-x:auto';
currentPhaseEl.appendChild(_mContainer);
try {
window.mermaid.render(_svgId, _clean).then(function(r){
_mContainer.innerHTML = r.svg;
}).catch(function(err){
_mContainer.innerHTML = '<pre style=\"color:#b91c1c;font-size:11px\">Mermaid render error: ' + (err.message||err) + '\\n\\n' + _clean.replace(/</g,'&lt;') + '</pre>';
});
} catch(e) {
_mContainer.innerHTML = '<pre style=\"font-size:11px\">' + _clean.replace(/</g,'&lt;') + '</pre>';
}
}
} catch(eMermaid) { console.warn('[V5-MERMAID-RENDER]', eMermaid); }
// === END AMBRE-V5-MERMAID-RENDER ===";
$c = str_replace($anchor, $new, $c);
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave263-mermaid";
@copy($path, $backup);
$wrote = @file_put_contents($path, $c);
echo json_encode([
"delta" => strlen($c) - $orig,
"wrote" => $wrote,
"backup" => basename($backup),
]);

View File

@@ -0,0 +1,213 @@
<?php
/**
* ambre-multiagent-v2-external.php · wave-260
* MAX parallelism mobilisant IA EXTERNES + internes
* Agents peuvent être : cascade fast | cascade think | ollama local | tool natif
*/
header("Content-Type: application/json; charset=utf-8");
header("Cache-Control: no-store, no-cache");
header("CDN-Cache-Control: no-store");
set_time_limit(120);
$raw = file_get_contents("php://input");
$in = json_decode($raw, true) ?: $_POST;
$goal = trim($in["goal"] ?? $in["message"] ?? "");
$max_agents = min(12, max(2, intval($in["max_agents"] ?? 6)));
if (!$goal) { echo json_encode(["error"=>"goal required"]); exit; }
$t0 = microtime(true);
// PLAN with richer agent diversity
$plan_sys = "Tu es un planificateur multi-agent WEVAL. Pour l'objectif donné, génère UN JSON STRICT :\n" .
"{\n" .
' "objective": "<reformulation>",' . "\n" .
' "agents": [' . "\n" .
' {"role":"<nom>", "task":"<tâche autonome>", "tool":"<type>", "model_hint":"<fast|think|ollama|tool_spec>"},' . "\n" .
" ...\n" .
" ]\n" .
"}\n" .
"Tools disponibles:\n" .
"- llm_fast (Cerebras/Groq rapide)\n" .
"- llm_think (Cerebras think raisonnement profond)\n" .
"- llm_ollama (local qwen3/llama3.2 souverain)\n" .
"- pdf_premium (génère PDF 5 pages)\n" .
"- mermaid (diagramme SVG)\n" .
"- web_search (recherche web)\n" .
"- kb_search (mémoire partagée)\n" .
"- calc (calcul)\n" .
"Max $max_agents agents · roles variés · tools diversifiés pour parallélisme optimal.";
$plan_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
"http" => ["method"=>"POST","header"=>"Content-Type: application/json\r\n",
"content"=>json_encode(["model"=>"fast","messages"=>[["role"=>"system","content"=>$plan_sys],["role"=>"user","content"=>"Objectif: $goal"]],"max_tokens"=>1000,"temperature"=>0.4]),
"timeout"=>25],
]));
$pd = @json_decode($plan_raw, true);
$pt = $pd["choices"][0]["message"]["content"] ?? "";
$pt = preg_replace('/^```(?:json)?\s*/m', '', $pt);
$pt = preg_replace('/\s*```\s*$/m', '', trim($pt));
$plan = @json_decode($pt, true);
if (!$plan || !isset($plan["agents"])) {
echo json_encode(["error"=>"plan invalid", "raw"=>substr($pt, 0, 400)]);
exit;
}
$plan_ms = round((microtime(true)-$t0)*1000);
// EXECUTE
$agents = array_slice($plan["agents"], 0, $max_agents);
$mh = curl_multi_init();
$handles = [];
foreach ($agents as $i => $agent) {
$tool = strtolower($agent["tool"] ?? "llm_fast");
$task = $agent["task"] ?? "";
$ch = curl_init();
if ($tool === "llm_ollama") {
// Ollama LOCAL sovereign (qwen3:4b fastest)
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1:11434/api/generate",
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["model"=>"qwen3:4b","prompt"=>$task,"stream"=>false,"options"=>["num_predict"=>400]]),
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_CONNECTTIMEOUT => 3,
]);
} elseif ($tool === "llm_think") {
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1:4000/v1/chat/completions",
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["model"=>"think","messages"=>[["role"=>"user","content"=>$task]],"max_tokens"=>500]),
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 45, CURLOPT_CONNECTTIMEOUT => 3,
]);
} elseif ($tool === "pdf_premium") {
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-pdf-premium.php",
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["topic"=>$task]),
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 50, CURLOPT_CONNECTTIMEOUT => 3,
]);
} elseif ($tool === "mermaid") {
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-mermaid.php",
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["topic"=>$task]),
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 20, CURLOPT_CONNECTTIMEOUT => 3,
]);
} elseif ($tool === "web_search") {
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-web-search.php",
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["query"=>$task]),
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3,
]);
} elseif ($tool === "kb_search") {
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1/api/ambre-mermaid-learn.php",
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["action"=>"search","query"=>$task]),
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3,
]);
} elseif ($tool === "calc") {
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-calc.php",
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["expression"=>$task]),
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3,
]);
} else {
// default = llm_fast (Cerebras)
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1:4000/v1/chat/completions",
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["model"=>"fast","messages"=>[["role"=>"user","content"=>$task]],"max_tokens"=>400]),
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3,
]);
$tool = "llm_fast";
}
curl_multi_add_handle($mh, $ch);
$handles[$i] = ["ch"=>$ch, "agent"=>$agent, "tool_used"=>$tool, "t0"=>microtime(true)];
}
$exec_t0 = microtime(true);
$running = null;
do { curl_multi_exec($mh, $running); curl_multi_select($mh, 0.5); } while ($running > 0);
$results = [];
foreach ($handles as $i => $h) {
$output = curl_multi_getcontent($h["ch"]);
$http = curl_getinfo($h["ch"], CURLINFO_HTTP_CODE);
$ems = round((microtime(true)-$h["t0"])*1000);
curl_multi_remove_handle($mh, $h["ch"]);
curl_close($h["ch"]);
$d = @json_decode($output, true);
$summary = "";
if ($d) {
if (isset($d["mermaid_code"])) $summary = "📊 Mermaid " . strlen($d["mermaid_code"]) . "B · source=" . ($d["source"] ?? "?");
elseif (isset($d["url"])) $summary = "📄 " . $d["url"] . " · " . ($d["size_kb"] ?? "?") . "KB";
elseif (isset($d["choices"][0]["message"]["content"])) $summary = substr($d["choices"][0]["message"]["content"], 0, 350);
elseif (isset($d["response"])) $summary = substr($d["response"], 0, 350);
elseif (isset($d["answer"])) $summary = substr($d["answer"], 0, 350);
elseif (isset($d["result"])) $summary = (string)$d["result"];
else $summary = substr($output, 0, 200);
} else $summary = substr($output ?: "empty", 0, 200);
$results[] = [
"agent" => $h["agent"]["role"] ?? "agent_$i",
"task" => $h["agent"]["task"] ?? "",
"tool" => $h["tool_used"],
"http" => $http,
"elapsed_ms" => $ems,
"summary" => $summary,
];
}
curl_multi_close($mh);
$exec_ms = round((microtime(true)-$exec_t0)*1000);
// RECONCILE via Groq (souverain non-Cerebras pour diversité)
$synth_input = "Objectif: $goal\n\nRésultats " . count($results) . " agents :\n";
foreach ($results as $r) {
$synth_input .= "" . $r["agent"] . " (tool=" . $r["tool"] . ", " . $r["elapsed_ms"] . "ms): " . substr($r["summary"], 0, 250) . "\n";
}
$synth_input .= "\nProduis une synthèse finale en français, structurée, actionnable. Max 300 mots.";
$synth_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
"content"=>json_encode(["model"=>"fast","messages"=>[["role"=>"user","content"=>$synth_input]],"max_tokens"=>600]),
"timeout"=>20],
]));
$sd = @json_decode($synth_raw, true);
$reconciled = $sd["choices"][0]["message"]["content"] ?? "synthèse échouée";
// Register in learning pool
$shared_kb_file = "/opt/wevads/internal-memory/_shared-learning.json";
$shared_kb = @json_decode(@file_get_contents($shared_kb_file), true) ?: [];
$shared_kb[] = [
"ts" => time(), "source" => "multiagent-v2",
"topic" => $plan["objective"] ?? $goal,
"synthesis_preview" => substr($reconciled, 0, 300),
"agents" => count($results),
];
if (count($shared_kb) > 500) $shared_kb = array_slice($shared_kb, -500);
@file_put_contents($shared_kb_file, json_encode($shared_kb, JSON_UNESCAPED_UNICODE));
echo json_encode([
"ok" => true,
"goal" => $goal,
"plan" => $plan,
"plan_ms" => $plan_ms,
"results" => $results,
"exec_ms" => $exec_ms,
"parallel_speedup" => round(array_sum(array_column($results, "elapsed_ms")) / max($exec_ms, 1), 2),
"reconciled" => trim($reconciled),
"total_ms" => round((microtime(true)-$t0)*1000),
"agents_count" => count($results),
"tools_diversity" => count(array_unique(array_column($results, "tool"))),
"provider" => "WEVIA Multi-Agent V2 · external IA dispatch · wave-260",
"shared_kb_size" => count($shared_kb),
], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);

View File

@@ -59,18 +59,18 @@
},
"suites": [
{
"title": "v47-widget.spec.js",
"file": "v47-widget.spec.js",
"title": "v55-scroll.spec.js",
"file": "v55-scroll.spec.js",
"column": 0,
"line": 0,
"specs": [
{
"title": "V47 · Universal chat widget on all-ia-hub",
"title": "V55 · scroll to see mermaid SVG",
"ok": true,
"tags": [],
"tests": [
{
"timeout": 60000,
"timeout": 90000,
"annotations": [],
"expectedStatus": "passed",
"projectId": "chromium",
@@ -80,36 +80,27 @@
"workerIndex": 0,
"parallelIndex": 0,
"status": "passed",
"duration": 35410,
"duration": 15641,
"errors": [],
"stdout": [
{
"text": "Widget button count: 1\n"
},
{
"text": "Response: Bonjour ! Je suis désolé, mais je ne peux pas accéder à votre `chat_id` directement. Ce genre d'information dépend de la plateforme ou du système dans lequel nous interagissons (comme une API, une application, ou un service interne).\n\nSi vous utilisez un service WEVAL Consulting connecté à un système de gestion des conversations, je peux vous aider à le retrouver ou à le générer — pour cela, pourr\n"
},
{
"text": "Turns: 2\n"
},
{
"text": "Multi-agent mode triggered: true in 24.1s\n"
"text": "SVG rendered: {\n \"svg_visible\": true,\n \"svg_width\": 190.8125,\n \"svg_height\": 879,\n \"svg_html_size\": 16978,\n \"wrapper_id\": \"wv-mermaid-1776848871993-216-wrap\"\n}\n"
}
],
"stderr": [],
"retry": 0,
"startTime": "2026-04-22T03:12:24.466Z",
"startTime": "2026-04-22T09:07:39.425Z",
"annotations": [],
"attachments": [
{
"name": "screenshot",
"contentType": "image/png",
"path": "/var/www/html/api/ambre-pw-tests/output/v47-widget-V47-·-Universal-chat-widget-on-all-ia-hub-chromium/test-finished-1.png"
"path": "/var/www/html/api/ambre-pw-tests/output/v55-scroll-V55-·-scroll-to-see-mermaid-SVG-chromium/test-finished-1.png"
},
{
"name": "video",
"contentType": "video/webm",
"path": "/var/www/html/api/ambre-pw-tests/output/v47-widget-V47-·-Universal-chat-widget-on-all-ia-hub-chromium/video.webm"
"path": "/var/www/html/api/ambre-pw-tests/output/v55-scroll-V55-·-scroll-to-see-mermaid-SVG-chromium/video.webm"
}
]
}
@@ -117,8 +108,8 @@
"status": "expected"
}
],
"id": "59fd77abc000aff557d3-1aa334e6a3d56f78c672",
"file": "v47-widget.spec.js",
"id": "a80a3706a9346f0b6665-b8967c5b4350315cdbe0",
"file": "v55-scroll.spec.js",
"line": 3,
"column": 1
}
@@ -127,8 +118,8 @@
],
"errors": [],
"stats": {
"startTime": "2026-04-22T03:12:23.770Z",
"duration": 36288.549999999996,
"startTime": "2026-04-22T09:07:38.817Z",
"duration": 16424.367,
"expected": 1,
"skipped": 0,
"unexpected": 0,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View File

@@ -1,65 +0,0 @@
const { test } = require("@playwright/test");
test("V47 · Universal chat widget on all-ia-hub", async ({ page }) => {
test.setTimeout(60000);
await page.goto("/all-ia-hub.html?cb=" + Date.now());
await page.waitForLoadState("networkidle");
await page.waitForTimeout(3000);
// Check button present
const btn = await page.locator(".amw-btn").count();
console.log(`Widget button count: ${btn}`);
if (btn > 0) {
await page.screenshot({ path: "output/v47-00-initial.png" });
// Click to open panel
await page.locator(".amw-btn").click();
await page.waitForTimeout(1500);
await page.screenshot({ path: "output/v47-01-opened.png" });
// Send a message
await page.locator("#amwInput").fill("Bonjour, quel est mon chat_id ?");
await page.waitForTimeout(300);
await page.locator("#amwSend").click();
// Wait for response
const ws = Date.now();
while (Date.now() - ws < 30000) {
const msgs = await page.locator(".amw-msg.a").count();
if (msgs > 1) break; // We need at least greeting + response
await page.waitForTimeout(1000);
}
await page.waitForTimeout(1500);
await page.screenshot({ path: "output/v47-02-chat.png", fullPage: false });
// Get last message text
const txt = await page.locator(".amw-msg.a").last().innerText();
console.log(`Response: ${txt.substring(0, 400)}`);
// Check turns counter
const turns = await page.locator("#amwTurns").innerText();
console.log(`Turns: ${turns}`);
// Test multi-agent
await page.locator("#amwInput").fill("fais une analyse complete du marche IA 2026");
await page.waitForTimeout(300);
await page.locator("#amwSend").click();
const ws2 = Date.now();
let found = false;
while (Date.now() - ws2 < 90000) {
const ma = await page.locator(".amw-msg.a.ma").count();
if (ma > 0) { found = true; break; }
await page.waitForTimeout(2000);
}
console.log(`Multi-agent mode triggered: ${found} in ${((Date.now()-ws2)/1000).toFixed(1)}s`);
await page.waitForTimeout(1500);
await page.screenshot({ path: "output/v47-03-multiagent.png", fullPage: false });
} else {
console.log("❌ Widget button not found");
await page.screenshot({ path: "output/v47-nowidget.png", fullPage: true });
}
});

View File

@@ -0,0 +1,47 @@
const { test } = require("@playwright/test");
test("V55 · scroll to see mermaid SVG", async ({ page }) => {
test.setTimeout(90000);
await page.goto("/wevia.html?cb=" + Date.now());
await page.evaluate(() => { try{sessionStorage.clear();}catch(e){} });
await page.waitForLoadState("networkidle");
await page.waitForTimeout(3500);
const input = page.locator("#msgInput");
await input.click({force:true});
await input.fill("Genere un schema mermaid pour: architecture WEVIA souveraine");
await page.waitForTimeout(400);
await input.press("Enter");
// Wait for completion
const ws = Date.now();
while (Date.now() - ws < 60000) {
const busy = await page.evaluate(() => window.busy || document.getElementById('sendBtn')?.disabled);
const svgs = await page.locator('[id^="wv-mermaid-"] svg, .phase-content svg').count();
if (!busy && svgs > 0) break;
await page.waitForTimeout(2000);
}
await page.waitForTimeout(2000);
// Scroll to the SVG
const scrolled = await page.evaluate(() => {
const svg = document.querySelector('[id^="wv-mermaid-"] svg, .phase-content svg');
if (svg) {
svg.scrollIntoView({block:'center', behavior:'instant'});
return {
svg_visible: svg.getBoundingClientRect().width > 10,
svg_width: svg.getBoundingClientRect().width,
svg_height: svg.getBoundingClientRect().height,
svg_html_size: svg.outerHTML.length,
wrapper_id: svg.parentElement?.id,
};
}
return null;
});
console.log("SVG rendered:", JSON.stringify(scrolled, null, 2));
await page.waitForTimeout(500);
await page.screenshot({ path: "output/v55-scrolled.png", fullPage: false });
await page.screenshot({ path: "output/v55-full.png", fullPage: true });
});

View File

@@ -0,0 +1,7 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests/tests";
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDggwrcgU0hPV0NBU0Ugwrcgd2lkZ2V0IG9uIGFsbC1pYS1odWIgKyA2IGFnZW50cyBtdWx0aSIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCgxODAwMDApOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL2FsbC1pYS1odWIuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwMCk7CiAgCiAgY29uc3QgYnRuID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LWJ0biIpLmNvdW50KCk7CiAgaWYgKGJ0biA9PT0gMCkgeyBjb25zb2xlLmxvZygibm8gd2lkZ2V0Iik7IHJldHVybjsgfQogIAogIGF3YWl0IHBhZ2UubG9jYXRvcigiLmFtdy1idG4iKS5jbGljaygpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDgtMDEtb3Blbi5wbmciIH0pOwogIAogIC8vIFNlbmQgbXVsdGktYWdlbnQgcmVxdWVzdCAtIGV4cGxvaXRzIFYyIGRpdmVyc2l0eQogIGF3YWl0IHBhZ2UubG9jYXRvcigiI2Ftd0lucHV0IikuZmlsbCgiZmFpcyBtb2kgdW5lIGFuYWx5c2UgY29tcGxldGUgZHUgbWFyY2jDqSBJQSBzb3V2ZXJhaW5lIDIwMjYgYXZlYyBhZ2VudHMgZXh0ZXJuZXMgZGl2ZXJzaWZpZXMiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDMwMCk7CiAgYXdhaXQgcGFnZS5sb2NhdG9yKCIjYW13U2VuZCIpLmNsaWNrKCk7CiAgY29uc29sZS5sb2coIlNlbnQgbXVsdGktYWdlbnQgcmVxdWVzdCIpOwogIAogIC8vIFdhaXQgZm9yIG11bHRpLWFnZW50IGJhZGdlCiAgY29uc3Qgd3MgPSBEYXRlLm5vdygpOwogIHdoaWxlIChEYXRlLm5vdygpIC0gd3MgPCAxMjAwMDApIHsKICAgIGNvbnN0IG1hID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LW1zZy5hLm1hIikuY291bnQoKTsKICAgIGlmIChtYSA+IDApIGJyZWFrOwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyNTAwKTsKICB9CiAgY29uc3QgZWwgPSAoKERhdGUubm93KCktd3MpLzEwMDApLnRvRml4ZWQoMSk7CiAgY29uc29sZS5sb2coYE11bHRpLWFnZW50IGluICR7ZWx9c2ApOwogIAogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDgtMDItbXVsdGkucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIAogIC8vIFNjcm9sbCB0byBzZWUgYWxsIHN5bnRoCiAgY29uc3QgcGFuZWwgPSBwYWdlLmxvY2F0b3IoIi5hbXctYm9keSIpOwogIGF3YWl0IHBhbmVsLmV2YWx1YXRlKGVsID0+IGVsLnNjcm9sbFRvcCA9IGVsLnNjcm9sbEhlaWdodCk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg1MDApOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQ4LTAzLXN5bnRoLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBHZXQgbGFzdCBtc2cgbWV0YQogIGNvbnN0IG1ldGEgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGxhc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYW13LW1zZy5hLm1hIik7CiAgICBpZiAobGFzdC5sZW5ndGggPT09IDApIHJldHVybiB7dHVybnM6IDB9OwogICAgY29uc3QgbCA9IGxhc3RbbGFzdC5sZW5ndGgtMV07CiAgICByZXR1cm4gewogICAgICB0ZXh0OiBsLmlubmVyVGV4dC5zdWJzdHJpbmcoMCwgNDAwKSwKICAgICAgbWV0YTogbC5xdWVyeVNlbGVjdG9yKCIubWV0YSIpPy5pbm5lclRleHQgfHwgIiIsCiAgICAgIHR1cm5zOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYW13VHVybnMiKT8uaW5uZXJUZXh0IHx8ICI/IiwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coYFxuTWV0YTogJHttZXRhLm1ldGF9YCk7CiAgY29uc29sZS5sb2coYFR1cm5zIHRvdGFsOiAke21ldGEudHVybnN9YCk7CiAgY29uc29sZS5sb2coYFRleHQ6ICR7bWV0YS50ZXh0fWApOwp9KTsK");
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
$written = @file_put_contents("$base/v48-showcase.spec.js", $spec);
echo json_encode(["written" => $written]);

View File

@@ -0,0 +1,7 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests/tests";
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDkgwrcgU2NhbiBwdWJsaWMgbGVha3Mgb24gLyBhbmQgL3dldmlhLmh0bWwiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIC8vIFNjYW4gLwogIGF3YWl0IHBhZ2UuZ290bygiLz9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwMCk7CiAgCiAgY29uc3Qgcm9vdExlYWtzID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBpZHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZCo9Im9wdXMiXSwgW2lkKj0icGF0dGVybiJdLCBbaWQqPSJkb2NrIl0sIFtpZCo9InhsaW5rcyJdLCBbaWQqPSJ4bmF2Il0nKSk7CiAgICByZXR1cm4gaWRzLm1hcChlbCA9PiAoewogICAgICBpZDogZWwuaWQsCiAgICAgIHRhZzogZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpLAogICAgICB0ZXh0OiAoZWwuaW5uZXJUZXh0IHx8ICIiKS5zdWJzdHJpbmcoMCwgMjAwKSwKICAgICAgcG9zaXRpb246IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5wb3NpdGlvbiwKICAgICAgdmlzaWJsZTogZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsLAogICAgfSkpOwogIH0pOwogIGNvbnNvbGUubG9nKCJST09UIC8gbGVha3M6IiwgSlNPTi5zdHJpbmdpZnkocm9vdExlYWtzLCBudWxsLCAyKSk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDktMDEtcm9vdC5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7CiAgCiAgLy8gU2NhbiAvd2V2aWEuaHRtbAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2Uud2FpdEZvckxvYWRTdGF0ZSgibmV0d29ya2lkbGUiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDMwMDApOwogIAogIGNvbnN0IHdldmlhTGVha3MgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGlkcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkKj0ib3B1cyJdLCBbaWQqPSJwYXR0ZXJuIl0sIFtpZCo9ImRvY2siXSwgW2lkKj0ieGxpbmtzIl0sIFtpZCo9InhuYXYiXSwgW2lkKj0idWRvY2siXScpKTsKICAgIGNvbnN0IG91dCA9IGlkcy5tYXAoZWwgPT4gKHsKICAgICAgaWQ6IGVsLmlkLAogICAgICB0YWc6IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwKICAgICAgdGV4dDogKGVsLmlubmVyVGV4dCB8fCAiIikuc3Vic3RyaW5nKDAsIDIwMCksCiAgICAgIHZpc2libGU6IGVsLm9mZnNldFBhcmVudCAhPT0gbnVsbCwKICAgIH0pKTsKICAgIC8vIEFsc28gbG9vayBmb3IgIkNsYXVkZSBQYXR0ZXJuIiB0ZXh0IGFueXdoZXJlIHZpc2libGUKICAgIGNvbnN0IGJvZHlUZXh0ID0gZG9jdW1lbnQuYm9keS5pbm5lclRleHQ7CiAgICBjb25zdCBoYXNfY2xhdWRlX3AgPSAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYm9keVRleHQpOwogICAgY29uc3QgaGFzX2FkbWluX2JhZGdlID0gL1xiQWRtaW5cYi9pLnRlc3QoYm9keVRleHQpICYmIC9cYkRyb2lkXGIvaS50ZXN0KGJvZHlUZXh0KTsKICAgIHJldHVybiB7IGVsZW1lbnRzOiBvdXQsIGhhc19jbGF1ZGVfcGF0dGVybl92aXNpYmxlOiBoYXNfY2xhdWRlX3AsIGhhc19hZG1pbl9kcm9pZDogaGFzX2FkbWluX2JhZGdlIH07CiAgfSk7CiAgY29uc29sZS5sb2coIlxuV0VWSUEgcHVibGljIGxlYWtzOiIsIEpTT04uc3RyaW5naWZ5KHdldmlhTGVha3MsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0OS0wMi13ZXZpYS5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7Cn0pOwo=");
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
$written = @file_put_contents("$base/v49-leaks.spec.js", $spec);
echo json_encode(["written" => $written]);

View File

@@ -0,0 +1,7 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests/tests";
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTAgwrcgUFJPT0Ygc2hpZWxkIHJlbW92ZXMgbGVha3Mgb24gcHVibGljIHBhZ2VzIiwgYXN5bmMgKHsgcGFnZSB9KSA9PiB7CiAgdGVzdC5zZXRUaW1lb3V0KDYwMDAwKTsKICBjb25zdCBsb2dzID0gW107CiAgcGFnZS5vbigiY29uc29sZSIsIG0gPT4gbG9ncy5wdXNoKG0udGV4dCgpLnN1YnN0cmluZygwLCAxNTApKSk7CiAgCiAgLy8gVGVzdCAvCiAgYXdhaXQgcGFnZS5nb3RvKCIvP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCByb290U3RhdGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGJvZHlUZXh0ID0gZG9jdW1lbnQuYm9keS5pbm5lclRleHQ7CiAgICByZXR1cm4gewogICAgICBzaXplOiBkb2N1bWVudC5ib2R5LmlubmVySFRNTC5sZW5ndGgsCiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgaGFzX3d0cF9kb2NrX3Zpc2libGU6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkKj0iZG9jayJdLCBbaWQqPSJ4bGlua3MiXSwgW2lkKj0ieG5hdiJdJykpLnNvbWUoZWwgPT4gZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsICYmIC93dHB8ZHJvaWR8YWRtaW4vaS50ZXN0KGVsLmlubmVyVGV4dCkpLAogICAgICBoYXNfZGFzaGJvYXJkc19maXhlZDogQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjb3B1cy1kYXNoYm9hcmQtbGluaywgW2lkKj0iZGFzaGJvYXJkLWVudHJ5Il0nKSkuc29tZShlbCA9PiBlbC5vZmZzZXRQYXJlbnQgIT09IG51bGwpLAogICAgICBzaGllbGRfbG9hZGVkOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbWJyZS1jb25maWRlbnRpYWwtc2hpZWxkJyksCiAgICAgIHZpc2libGVfZml4ZWRfaW50ZXJuYWw6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmKj0id2V2YWwtdGVjaG5vbG9neS1wbGF0Zm9ybSJdLCBhW2hyZWYqPSJ3ZXZpYS1tYXN0ZXIiXSwgYVtocmVmKj0iYWxsLWlhLWh1YiJdJykpCiAgICAgICAgICAuZmlsdGVyKGEgPT4gewogICAgICAgICAgICB2YXIgcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpOwogICAgICAgICAgICByZXR1cm4gcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJyAmJiBhLm9mZnNldFBhcmVudCAhPT0gbnVsbDsKICAgICAgICAgIH0pLmxlbmd0aCwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coIlJPT1QgLyBzdGF0ZToiLCBKU09OLnN0cmluZ2lmeShyb290U3RhdGUsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MC0wMS1yb290LnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBUZXN0IC93ZXZpYS5odG1sCiAgYXdhaXQgcGFnZS5nb3RvKCIvd2V2aWEuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzUwMCk7CiAgCiAgY29uc3Qgd2V2aWFTdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybl90ZXh0OiAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYm9keVRleHQpLAogICAgICBvcHVzX3BhdHRlcm5fYmFkZ2VfdmlzaWJsZTogKGZ1bmN0aW9uKCl7IHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tYmFkZ2UnKTsgcmV0dXJuIGVsID8gZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsIDogZmFsc2U7IH0pKCksCiAgICAgIG9wdXNfcGF0dGVybl9zdHlsZV9wcmVzZW50OiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tc3R5bGUnKSwKICAgICAgc2hpZWxkX2xvYWRlZDogISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW1icmUtY29uZmlkZW50aWFsLXNoaWVsZCcpLAogICAgfTsKICB9KTsKICBjb25zb2xlLmxvZygiXG5XRVZJQSAvd2V2aWEuaHRtbCBzdGF0ZToiLCBKU09OLnN0cmluZ2lmeSh3ZXZpYVN0YXRlLCBudWxsLCAyKSk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTAtMDItd2V2aWEucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIAogIC8vIFNoaWVsZCBjb25zb2xlIGxvZ3MKICBjb25zdCBzaGllbGRMb2dzID0gbG9ncy5maWx0ZXIobCA9PiBsLmluY2x1ZGVzKCdzaGllbGQnKSk7CiAgY29uc29sZS5sb2coIlxuU2hpZWxkIGxvZ3M6Iiwgc2hpZWxkTG9ncyk7Cn0pOwo=");
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
$written = @file_put_contents("$base/v50-shield.spec.js", $spec);
echo json_encode(["written" => $written]);

View File

@@ -0,0 +1,7 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests/tests";
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTEgwrcgUFJPT0YgZG9jayByZW1vdmVkIGZyb20gd2lkZ2V0ICsgaWZyYW1lIGNvbnRleHQiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIC8vIERpcmVjdCBsb2FkIHdpZGdldAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLXdpZGdldC5odG1sP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCBzdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgb3B1c19wYXR0ZXJuX2JhZGdlX3Zpc2libGU6IChmdW5jdGlvbigpeyB2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJhZGdlJyk7IHJldHVybiBlP2Uub2Zmc2V0UGFyZW50IT09bnVsbDpmYWxzZTsgfSkoKSwKICAgICAgd3RwX3Vkb2NrX3Zpc2libGU6IChmdW5jdGlvbigpeyB2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd3RwLXVkb2NrJyk7IHJldHVybiBlP2Uub2Zmc2V0UGFyZW50IT09bnVsbDpmYWxzZTsgfSkoKSwKICAgICAgd3RwX3NpZGViYXJfdmlzaWJsZTogKGZ1bmN0aW9uKCl7IHZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3dHAtc2lkZWJhcicpOyByZXR1cm4gZT9lLm9mZnNldFBhcmVudCE9PW51bGw6ZmFsc2U7IH0pKCksCiAgICAgIGFueV9iYWRnZV93aXRoX2ludGVybmFsOiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZio9IndldmFsLXRlY2hub2xvZ3ktcGxhdGZvcm0iXSwgYVtocmVmKj0id2V2aWEtbWFzdGVyIl0sIGFbaHJlZio9ImFsbC1pYS1odWIiXScpKS5maWx0ZXIoYT0+YS5vZmZzZXRQYXJlbnQhPT1udWxsKS5sZW5ndGgsCiAgICAgIHNoaWVsZF9sb2FkZWQ6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FtYnJlLWNvbmZpZGVudGlhbC1zaGllbGQnKSwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coIldJREdFVCBkaXJlY3Q6IiwgSlNPTi5zdHJpbmdpZnkoc3RhdGUsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMS13aWRnZXQtZGlyZWN0LnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBOb3cgdGVzdCBlbWJlZGRlZCBpbiBpZnJhbWUgKHNpbXVsYXRpbmcgcm9vdCAvIGNvbnRleHQpCiAgYXdhaXQgcGFnZS5nb3RvKCIvP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg0MDAwKTsKICAKICAvLyBGaW5kIGFueSBpZnJhbWUgd2l0aCB3ZXZpYS13aWRnZXQKICBjb25zdCBpZnJhbWVzID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSkubWFwKGYgPT4gKHsKICAgICAgc3JjOiBmLnNyYywKICAgICAgdmlzaWJsZTogZi5vZmZzZXRQYXJlbnQgIT09IG51bGwsCiAgICAgIHNpemU6IGYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICB9KSk7CiAgfSk7CiAgY29uc29sZS5sb2coIlxuSWZyYW1lcyBvbiAvOiIsIEpTT04uc3RyaW5naWZ5KGlmcmFtZXMpKTsKICAKICAvLyBDaGVjayBpZiB3aWRnZXQgaWZyYW1lIGV4aXN0cyBhbmQgaW5zcGVjdCBpbnNpZGUKICBpZiAoaWZyYW1lcy5sZW5ndGggPiAwKSB7CiAgICBjb25zdCB3aWRnZXRGcmFtZSA9IHBhZ2UuZnJhbWVMb2NhdG9yKCdpZnJhbWVbc3JjKj0id2V2aWEtd2lkZ2V0Il0nKS5maXJzdCgpOwogICAgdHJ5IHsKICAgICAgY29uc3QgZnJhbWVTdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgICAgIGNvbnN0IGlmcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTsKICAgICAgICBmb3IgKGNvbnN0IGlmciBvZiBpZnJzKSB7CiAgICAgICAgICBpZiAoaWZyLnNyYyAmJiBpZnIuc3JjLmluY2x1ZGVzKCd3ZXZpYS13aWRnZXQnKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGlmci5jb250ZW50RG9jdW1lbnQ7CiAgICAgICAgICAgICAgaWYgKCFkb2MpIGNvbnRpbnVlOwogICAgICAgICAgICAgIGNvbnN0IGJ0ID0gZG9jLmJvZHkgPyBkb2MuYm9keS5pbm5lclRleHQgOiAiIjsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgc3JjOiBpZnIuc3JjLAogICAgICAgICAgICAgICAgaGFzX2NsYXVkZV9wYXR0ZXJuOiAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYnQpLAogICAgICAgICAgICAgICAgaGFzX3d0cDogL1xiV1RQXGIvaS50ZXN0KGJ0KSwKICAgICAgICAgICAgICAgIGhhc19hZG1pbl9kcm9pZDogL1xiQWRtaW5cYi9pLnRlc3QoYnQpICYmIC9cYkRyb2lkXGIvaS50ZXN0KGJ0KSwKICAgICAgICAgICAgICAgIHRleHRfc2l6ZTogYnQubGVuZ3RoLAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gY2F0Y2goZSl7IHJldHVybiB7ZXJyb3I6ICJjcm9zcy1vcmlnaW4iLCBtc2c6IGUubWVzc2FnZX07IH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICJubyB3aWRnZXQgaWZyYW1lIjsKICAgICAgfSk7CiAgICAgIGNvbnNvbGUubG9nKCJXaWRnZXQgaWZyYW1lIHN0YXRlOiIsIEpTT04uc3RyaW5naWZ5KGZyYW1lU3RhdGUpKTsKICAgIH0gY2F0Y2goZSkgeyBjb25zb2xlLmxvZygiZnJhbWUgaW5zcGVjdCBlcnI6IiwgZS5tZXNzYWdlKTsgfQogIH0KICAKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMi1yb290LXdpdGgtaWZyYW1lLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBGb3JjZSBjbGljayB3aWRnZXQgYnV0dG9uIHRvIG9wZW4gcGFuZWwKICBjb25zdCBidG4gPSBhd2FpdCBwYWdlLmxvY2F0b3IoJ2J1dHRvbjpoYXMtdGV4dCgiT3V2cmlyIiksIGJ1dHRvbjpoYXMtdGV4dCgiQ2hhdCIpLCBbY2xhc3MqPSJjaGF0Il1bY2xhc3MqPSJidG4iXSwgW2NsYXNzKj0id2lkZ2V0Il1bY2xhc3MqPSJidG4iXScpLmZpcnN0KCk7CiAgaWYgKGF3YWl0IGJ0bi5jb3VudCgpID4gMCkgewogICAgdHJ5IHsKICAgICAgYXdhaXQgYnRuLmNsaWNrKHtmb3JjZTogdHJ1ZSwgdGltZW91dDogMzAwMH0pOwogICAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDIwMDApOwogICAgICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMy1wYW5lbC1vcGVuLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAgIH0gY2F0Y2goZSkgeyBjb25zb2xlLmxvZygiYnRuIGNsaWNrIGVycjoiLCBlLm1lc3NhZ2UpOyB9CiAgfQp9KTsK");
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
$written = @file_put_contents("$base/v51-widget.spec.js", $spec);
echo json_encode(["written" => $written]);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,7 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests/tests";
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTMgwrcgRmluYWwgcHJvb2Ygd2lkZ2V0IGNsZWFuIChubyBDbGF1ZGUgUGF0dGVybiBwYW5lbCkiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLXdpZGdldC5odG1sP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg0MDAwKTsKICAKICBjb25zdCBzdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIHZpc2libGVfY2xhdWRlX3BhdHRlcm5fdGV4dDogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgb3B1c19wYXR0ZXJuX2JhZGdlOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tYmFkZ2UnKSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJhZGdlJykub2Zmc2V0UGFyZW50ICE9PSBudWxsLAogICAgICBvcHVzX3BhdHRlcm5fbW9kYWw6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1tb2RhbCcpICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tbW9kYWwnKS5vZmZzZXRQYXJlbnQgIT09IG51bGwsCiAgICAgIG9wdXNfcGF0dGVybl9ib3g6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1ib3gnKSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJveCcpLm9mZnNldFBhcmVudCAhPT0gbnVsbCwKICAgICAgc2V2ZW5fcGhhc2VzX3Zpc2libGU6IC83IHBoYXNlcyBSRUFML2kudGVzdChib2R5VGV4dCksCiAgICAgIHNzZV9saXZlX3Zpc2libGU6IC9TU0UgbGl2ZS9pLnRlc3QoYm9keVRleHQpLAogICAgICBsYW5jZXJfdmlzaWJsZTogL0xhbmNlciBcKFNTRS9pLnRlc3QoYm9keVRleHQpLAogICAgICBzaGllbGRfbG9hZGVkOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbWJyZS1jb25maWRlbnRpYWwtc2hpZWxkJyksCiAgICAgIG9wdXNQYXR0ZXJuT3Blbl9uZXV0cmFsaXplZDogKHR5cGVvZiB3aW5kb3cuX19vcHVzUGF0dGVybk9wZW4gPT09ICdmdW5jdGlvbicpICYmIHdpbmRvdy5fX29wdXNQYXR0ZXJuT3Blbi50b1N0cmluZygpLmxlbmd0aCA8IDMwLAogICAgfTsKICB9KTsKICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShzdGF0ZSwgbnVsbCwgMikpOwogIAogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjUzLWZpbmFsLXdpZGdldC5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7CiAgCiAgLy8gVHJ5IGNhbGwgX19vcHVzUGF0dGVybk9wZW4gdG8gc2VlIGlmIG5ldXRyYWxpemVkCiAgY29uc3Qgb3BlblJlc3VsdCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgdHJ5IHsKICAgICAgd2luZG93Ll9fb3B1c1BhdHRlcm5PcGVuKCk7CiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1tb2RhbCcpOwogICAgICByZXR1cm4gbW9kYWwgPyAobW9kYWwub2Zmc2V0UGFyZW50ICE9PSBudWxsID8gIk9QRU5FRF9WSVNJQkxFIiA6ICJISURERU4iKSA6ICJOT19NT0RBTCI7CiAgICB9IGNhdGNoKGUpIHsgcmV0dXJuICJFUlJPUjogIiArIGUubWVzc2FnZTsgfQogIH0pOwogIGNvbnNvbGUubG9nKCJBZnRlciBfX29wdXNQYXR0ZXJuT3BlbiBjYWxsOiIsIG9wZW5SZXN1bHQpOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjUzLWFmdGVyLW9wZW4tYXR0ZW1wdC5wbmciIH0pOwp9KTsK");
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
$written = @file_put_contents("$base/v53-final.spec.js", $spec);
echo json_encode(["written" => $written]);

7
api/ambre-pw-v54.php Normal file
View File

@@ -0,0 +1,7 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests/tests";
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTQgwrcgTWVybWFpZCBTVkcgcmVuZGVyIGluIHBoYXNlIDUvNSIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCg5MDAwMCk7CiAgY29uc3QgbG9ncyA9IFtdOwogIHBhZ2Uub24oImNvbnNvbGUiLCBtID0+IGxvZ3MucHVzaChtLnRleHQoKS5zdWJzdHJpbmcoMCwgMjAwKSkpOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4geyB0cnl7c2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTt9Y2F0Y2goZSl7fSB9KTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCBpbnB1dCA9IHBhZ2UubG9jYXRvcigiI21zZ0lucHV0Iik7CiAgYXdhaXQgaW5wdXQuY2xpY2soe2ZvcmNlOnRydWV9KTsKICBhd2FpdCBpbnB1dC5maWxsKCJHZW5lcmUgdW4gc2NoZW1hIG1lcm1haWQgcG91cjogd2V2aWEiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDQwMCk7CiAgYXdhaXQgaW5wdXQucHJlc3MoIkVudGVyIik7CiAgY29uc29sZS5sb2coIlNlbnQgbWVybWFpZCByZXF1ZXN0Iik7CiAgCiAgLy8gV2FpdCBmb3IgY29tcGxldGlvbgogIGNvbnN0IHdzID0gRGF0ZS5ub3coKTsKICBsZXQgcmVuZGVyZWQgPSBmYWxzZTsKICB3aGlsZSAoRGF0ZS5ub3coKSAtIHdzIDwgNjAwMDApIHsKICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICAgIC8vIExvb2sgZm9yIGEgcmVuZGVyZWQgU1ZHIGluIGFueSBhbWJyZS1waGFzZS1yZXN1bHQgb3IgcmVzdWx0IGJsb2NrCiAgICAgIGNvbnN0IHN2Z3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW1icmUtcGhhc2UtcmVzdWx0IHN2ZywgLnBoYXNlLWNvbnRlbnQgc3ZnLCBbaWRePSJ3di1tZXJtYWlkLSJdIHN2ZycpOwogICAgICBjb25zdCBoYXNTdmcgPSBzdmdzLmxlbmd0aCA+IDA7CiAgICAgIC8vIENoZWNrIFdFVklBLXBhdHRlcm4gdnMgQ2xhdWRlLXBhdHRlcm4gaW4gcmVuZGVyZWQgSFRNTAogICAgICBjb25zdCBodG1sID0gZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7CiAgICAgIHJldHVybiB7CiAgICAgICAgcGhhc2VfY291bnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbWJyZS1waGFzZScpLmxlbmd0aCwKICAgICAgICBzdmdfY291bnQ6IHN2Z3MubGVuZ3RoLAogICAgICAgIGhhc193ZXZpYV9wYXR0ZXJuOiAvV0VWSUFbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVstIF0/cGF0dGVybi9pLnRlc3QoaHRtbCksCiAgICAgICAgYnVzeTogISF3aW5kb3cuYnVzeSB8fCAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kQnRuJyk/LmRpc2FibGVkLAogICAgICB9OwogICAgfSk7CiAgICBpZiAoc3RhdGUuc3ZnX2NvdW50ID4gMCAmJiAhc3RhdGUuYnVzeSkgeyByZW5kZXJlZCA9IHRydWU7IGNvbnNvbGUubG9nKGBTVkcgcmVuZGVyZWQhIHN0YXRlPSR7SlNPTi5zdHJpbmdpZnkoc3RhdGUpfWApOyBicmVhazsgfQogICAgaWYgKCFzdGF0ZS5idXN5ICYmIHN0YXRlLnBoYXNlX2NvdW50ID49IDUpIHsKICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICAgICAgY29uc3QgczIgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbWJyZS1waGFzZS1yZXN1bHQgc3ZnLCAucGhhc2UtY29udGVudCBzdmcsIFtpZF49Ind2LW1lcm1haWQtIl0gc3ZnJykubGVuZ3RoKTsKICAgICAgY29uc29sZS5sb2coYEFmdGVyIHdhaXQ6ICR7czJ9IFNWR3MsIGJ1c3k9JHtzdGF0ZS5idXN5fWApOwogICAgICBpZiAoczIgPiAwKSByZW5kZXJlZCA9IHRydWU7CiAgICAgIGJyZWFrOwogICAgfQogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyNTAwKTsKICB9CiAgCiAgY29uc3QgZWxhcHNlZCA9ICgoRGF0ZS5ub3coKS13cykvMTAwMCkudG9GaXhlZCgxKTsKICBjb25zdCBmaW5hbFN0YXRlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBodG1sID0gZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7CiAgICBjb25zdCBzdmdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFtYnJlLXBoYXNlLXJlc3VsdCBzdmcsIC5waGFzZS1jb250ZW50IHN2ZywgW2lkXj0id3YtbWVybWFpZC0iXSBzdmcnKTsKICAgIHJldHVybiB7CiAgICAgIHN2Z192aXNpYmxlOiBBcnJheS5mcm9tKHN2Z3MpLmZpbHRlcihzID0+IHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPiAxMCkubGVuZ3RoLAogICAgICBzdmdfaHRtbF9sZW46IHN2Z3MubGVuZ3RoID4gMCA/IHN2Z3NbMF0ub3V0ZXJIVE1MLmxlbmd0aCA6IDAsCiAgICAgIGhhc193ZXZpYV9wYXR0ZXJuOiAvV0VWSUFbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICBoYXNfY2xhdWRlX3BhdHRlcm46IC9DbGF1ZGVbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICBoYXNfbWVybWFpZF9jb2RlX3JhdzogL3NlcXVlbmNlRGlhZ3JhbXxmbG93Y2hhcnR8Z3JhcGhccytbQS1aXS9pLnRlc3QoaHRtbCksCiAgICB9OwogIH0pOwogIGNvbnNvbGUubG9nKGBcbuKVkOKVkOKVkCBGSU5BTCBpbiAke2VsYXBzZWR9cyDCtyByZW5kZXJlZD0ke3JlbmRlcmVkfSDilZDilZDilZBgKTsKICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShmaW5hbFN0YXRlLCBudWxsLCAyKSk7CiAgCiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTQtbWVybWFpZC1maW5hbC5wbmciLCBmdWxsUGFnZTogdHJ1ZSB9KTsKICAKICAvLyBBbHNvIGNoZWNrIHJlbGV2YW50IGxvZ3MKICBsb2dzLmZpbHRlcihsID0+IC9tZXJtYWlkfE1FUk1BSUR8cmVuZGVyfFY1L2kudGVzdChsKSkuZm9yRWFjaChsID0+IGNvbnNvbGUubG9nKCJMT0c6IiwgbCkpOwp9KTsK");
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
$written = @file_put_contents("$base/v54-mermaid.spec.js", $spec);
echo json_encode(["written" => $written]);

7
api/ambre-pw-v55.php Normal file
View File

@@ -0,0 +1,7 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests/tests";
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTUgwrcgc2Nyb2xsIHRvIHNlZSBtZXJtYWlkIFNWRyIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCg5MDAwMCk7CiAgCiAgYXdhaXQgcGFnZS5nb3RvKCIvd2V2aWEuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7IHRyeXtzZXNzaW9uU3RvcmFnZS5jbGVhcigpO31jYXRjaChlKXt9IH0pOwogIGF3YWl0IHBhZ2Uud2FpdEZvckxvYWRTdGF0ZSgibmV0d29ya2lkbGUiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDM1MDApOwogIAogIGNvbnN0IGlucHV0ID0gcGFnZS5sb2NhdG9yKCIjbXNnSW5wdXQiKTsKICBhd2FpdCBpbnB1dC5jbGljayh7Zm9yY2U6dHJ1ZX0pOwogIGF3YWl0IGlucHV0LmZpbGwoIkdlbmVyZSB1biBzY2hlbWEgbWVybWFpZCBwb3VyOiBhcmNoaXRlY3R1cmUgV0VWSUEgc291dmVyYWluZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoNDAwKTsKICBhd2FpdCBpbnB1dC5wcmVzcygiRW50ZXIiKTsKICAKICAvLyBXYWl0IGZvciBjb21wbGV0aW9uCiAgY29uc3Qgd3MgPSBEYXRlLm5vdygpOwogIHdoaWxlIChEYXRlLm5vdygpIC0gd3MgPCA2MDAwMCkgewogICAgY29uc3QgYnVzeSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gd2luZG93LmJ1c3kgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbmRCdG4nKT8uZGlzYWJsZWQpOwogICAgY29uc3Qgc3ZncyA9IGF3YWl0IHBhZ2UubG9jYXRvcignW2lkXj0id3YtbWVybWFpZC0iXSBzdmcsIC5waGFzZS1jb250ZW50IHN2ZycpLmNvdW50KCk7CiAgICBpZiAoIWJ1c3kgJiYgc3ZncyA+IDApIGJyZWFrOwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICB9CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICAKICAvLyBTY3JvbGwgdG8gdGhlIFNWRwogIGNvbnN0IHNjcm9sbGVkID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePSJ3di1tZXJtYWlkLSJdIHN2ZywgLnBoYXNlLWNvbnRlbnQgc3ZnJyk7CiAgICBpZiAoc3ZnKSB7CiAgICAgIHN2Zy5zY3JvbGxJbnRvVmlldyh7YmxvY2s6J2NlbnRlcicsIGJlaGF2aW9yOidpbnN0YW50J30pOwogICAgICByZXR1cm4gewogICAgICAgIHN2Z192aXNpYmxlOiBzdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPiAxMCwKICAgICAgICBzdmdfd2lkdGg6IHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCwKICAgICAgICBzdmdfaGVpZ2h0OiBzdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LAogICAgICAgIHN2Z19odG1sX3NpemU6IHN2Zy5vdXRlckhUTUwubGVuZ3RoLAogICAgICAgIHdyYXBwZXJfaWQ6IHN2Zy5wYXJlbnRFbGVtZW50Py5pZCwKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0pOwogIGNvbnNvbGUubG9nKCJTVkcgcmVuZGVyZWQ6IiwgSlNPTi5zdHJpbmdpZnkoc2Nyb2xsZWQsIG51bGwsIDIpKTsKICAKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTUtc2Nyb2xsZWQucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjU1LWZ1bGwucG5nIiwgZnVsbFBhZ2U6IHRydWUgfSk7Cn0pOwo=");
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
$written = @file_put_contents("$base/v55-scroll.spec.js", $spec);
echo json_encode(["written" => $written]);

View File

@@ -0,0 +1,55 @@
<?php
header("Content-Type: application/json");
$path = "/var/www/html/wevia.html";
$c = @file_get_contents($path);
$orig = strlen($c);
$changes = [];
// Fix 1: rename "WEVIA Claude-pattern" in header
$c_new = preg_replace("/<strong>WEVIA Claude[- ]?pattern<\/strong>/i", "<strong>WEVIA-pattern</strong>", $c);
$c_new = preg_replace("/WEVIA Claude[- ]?pattern/", "WEVIA-pattern", $c_new);
if ($c_new !== $c) {
$changes[] = "renamed_WEVIA_Claude_pattern";
$c = $c_new;
}
// Fix 2: Remove any "Claude" mentions in phase labels
$c_new = str_replace("Claude Pattern", "WEVIA-Pattern", $c);
$c_new = str_replace("claude-pattern", "wevia-pattern", $c_new);
$c_new = str_replace("Claude-pattern", "WEVIA-pattern", $c_new);
if ($c_new !== $c) {
$changes[] = "renamed_claude_pattern_generic";
$c = $c_new;
}
// Fix 3: Remove mentions of "Claude" alone that are confidential
// But KEEP internal vars like _claude_xxx since they're code
// Target ONLY user-facing strings (between quotes or HTML text)
$user_facing_replacements = [
"'Claude'" => "'WEVIA'",
"\"Claude\"" => "\"WEVIA\"",
">Claude<" => ">WEVIA<",
"'Claude pattern'" => "'WEVIA pattern'",
"\"Claude pattern\"" => "\"WEVIA pattern\"",
];
foreach ($user_facing_replacements as $k => $v) {
if (strpos($c, $k) !== false) {
$c = str_replace($k, $v, $c);
$changes[] = "replaced_" . md5($k);
}
}
// Verify no more "Claude-pattern" in UI
$out_count = substr_count($c, "Claude-pattern") + substr_count($c, "Claude pattern") + substr_count($c, "Claude Pattern");
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave263-rename";
@copy($path, $backup);
$wrote = @file_put_contents($path, $c);
echo json_encode([
"delta" => strlen($c) - $orig,
"wrote" => $wrote,
"backup" => basename($backup),
"changes" => $changes,
"remaining_claude_pattern_count" => $out_count,
]);

43
api/ambre-scan-claude.php Normal file
View File

@@ -0,0 +1,43 @@
<?php
header("Content-Type: application/json");
$out = [];
// Files that render "Claude" or "Claude-pattern" badge VISIBLE on public wevia.html
$w = @file_get_contents("/var/www/html/wevia.html");
$out["wevia_html"] = [
"size" => strlen($w),
"claude_text_count" => substr_count($w, "Claude"),
"claude_pattern_count" => preg_match_all("/Claude[\s\-]?pattern/i", $w),
"WEVIA_Claude_pattern" => substr_count($w, "WEVIA Claude-pattern"),
"Claude_pattern_span" => preg_match_all("/<span[^>]*>Claude[\s\-]?[Pp]attern/i", $w),
];
// Find the exact rendering in wevia.html
$pos = strpos($w, "Claude-pattern");
if ($pos === false) $pos = strpos($w, "Claude pattern");
if ($pos === false) $pos = strpos($w, "WEVIA Claude");
if ($pos !== false) $out["wevia_context"] = substr($w, max(0, $pos - 200), 500);
// Mermaid generator - check output
$mp = @file_get_contents("/var/www/html/api/ambre-tool-mermaid.php");
$out["mermaid_tool"] = [
"size" => strlen($mp ?? ""),
"exists" => file_exists("/var/www/html/api/ambre-tool-mermaid.php"),
];
// Find V5-claude-pattern source
$out["claude_pattern_sources"] = trim(@shell_exec("grep -lE 'claude[- ]?pattern|Claude[- ]?[Pp]attern' /var/www/html/wevia.html /var/www/html/*.html /var/www/html/api/*.php 2>/dev/null | head -10"));
// Check V5-CLAUDE-PATTERN block in wevia.html
if (preg_match("/\/\/ === AMBRE-V5-CLAUDE-PATTERN.{0,10000}\/\/ === END AMBRE-V5-CLAUDE-PATTERN/s", $w, $m)) {
$out["v5_block_size"] = strlen($m[0]);
// Extract the rendered badges
if (preg_match_all('/["\']WEVIA[^"\']*Claude[^"\']*pattern[^"\']*["\']/', $m[0], $badges)) {
$out["v5_badges"] = $badges[0];
}
if (preg_match_all('/["\']WEVIA[- ]?pattern["\']/i', $m[0], $badges2)) {
$out["v5_badges_alt"] = $badges2[0];
}
}
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

68
api/ambre-scan-w260.php Normal file
View File

@@ -0,0 +1,68 @@
<?php
header("Content-Type: application/json");
$out = [];
chdir("/var/www/html");
$out["recent_tags"] = array_filter(array_map("trim", explode("\n", @shell_exec("git tag -l 'wave-*' --sort=-creatordate 2>&1 | head -10"))));
$out["recent_commits"] = array_filter(array_map("trim", explode("\n", @shell_exec("git log --since='30 minutes ago' --oneline 2>&1 | head -12"))));
// External AIs/agents available on this server (L99, Director, Blade, Arena, AlliaHub, Paperclip, DeerFlow)
$ext_agents = [
"L99" => "http://127.0.0.1:5890", // S95 arsenal
"Paperclip" => "http://127.0.0.1:3201",
"DeerFlow" => "http://127.0.0.1:3002",
"MiroFish" => "http://127.0.0.1:3050",
"TwentyCRM" => "http://127.0.0.1:3000",
"n8n" => "http://127.0.0.1:5678",
"Ollama" => "http://127.0.0.1:11434",
"Qdrant" => "http://127.0.0.1:6333",
"Cascade" => "http://127.0.0.1:4000",
"Mattermost" => "http://127.0.0.1:8065",
];
$out["external_agents"] = [];
foreach ($ext_agents as $n => $url) {
$t0 = microtime(true);
$r = @file_get_contents($url, false, stream_context_create(["http"=>["timeout"=>2,"ignore_errors"=>true]]));
$out["external_agents"][$n] = [
"url" => $url,
"up" => (bool)$r,
"ms" => round((microtime(true)-$t0)*1000),
];
}
// Check CF Transform Rules possibility (needs CF token working)
$cf_token = null;
if (file_exists("/etc/weval/secrets.env")) {
$sc = @file_get_contents("/etc/weval/secrets.env");
if (preg_match("/CF_API_TOKEN=([^\n\"]+)/", $sc, $m)) $cf_token = trim($m[1]);
}
$out["cf_token_len"] = $cf_token ? strlen($cf_token) : 0;
// Test CF token
if ($cf_token) {
$ctx = stream_context_create(["http"=>["method"=>"GET","header"=>"Authorization: Bearer $cf_token\r\n","timeout"=>5,"ignore_errors"=>true]]);
$verify = @file_get_contents("https://api.cloudflare.com/client/v4/user/tokens/verify", false, $ctx);
$v = @json_decode($verify, true);
$out["cf_token_status"] = $v["success"] ?? false;
$out["cf_token_msg"] = substr($verify ?? "none", 0, 200);
}
// Registered chatbots needing memory wire
$out["pages_with_widget"] = [];
foreach (["wevia.html", "wevia-master.html", "all-ia-hub.html", "wevia-orchestrator.html", "director-chat.html", "l99-brain.html", "director-center.html", "paperclip.html", "agents-enterprise.html", "wevia-multiagent-dashboard.html"] as $p) {
$f = "/var/www/html/$p";
if (file_exists($f)) {
$c = @file_get_contents($f);
$out["pages_with_widget"][$p] = [
"size" => strlen($c),
"has_universal_widget" => strpos($c, "ambre-universal-chat.js") !== false,
"has_chat_api" => strpos($c, "chat-api") !== false || strpos($c, "session-chat") !== false,
];
}
}
// Internal memory state now
$out["internal_memory_files"] = array_map("basename", glob("/opt/wevads/internal-memory/*.jsonl") ?: []);
$out["internal_memory_count"] = count($out["internal_memory_files"]);
$out["load"] = trim(@shell_exec("uptime"));
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

51
api/ambre-shield-v2.php Normal file
View File

@@ -0,0 +1,51 @@
<?php
header("Content-Type: application/json");
$path = "/var/www/html/api/ambre-confidential-shield.js";
$c = @file_get_contents($path);
$orig = strlen($c);
// Replace the CONFIDENTIAL_IDS list with expanded version
$old = "var CONFIDENTIAL_IDS = [
'opus-pattern-badge', 'opus-pattern-style', 'opus-pattern-panel',
'opus-udrill', 'opus-udrill-in', 'opus-dashboard-entry', 'opus-dashboard-link',
'wtp-udock', 'v130-xnav', 'opus-xlinks', 'wtp-sidebar',
'opus-claude-pattern', 'opus-dashboards',
];";
$new = "var CONFIDENTIAL_IDS = [
'opus-pattern-badge', 'opus-pattern-style', 'opus-pattern-panel',
'opus-pattern-modal', 'opus-pattern-box', 'opus-pattern-close', 'opus-pattern-input',
'opus-pattern-bot', 'opus-pattern-output', 'opus-pattern-content',
'opus-pattern-launch', 'opus-pattern-send',
'opus-udrill', 'opus-udrill-in', 'opus-dashboard-entry', 'opus-dashboard-link',
'wtp-udock', 'v130-xnav', 'opus-xlinks', 'wtp-sidebar',
'opus-claude-pattern', 'opus-dashboards',
'archi-meta-badge', 'v130-floating-dock',
];";
if (strpos($c, $old) === false) {
echo json_encode(["error"=>"CONFIDENTIAL_IDS not found in shield"]);
exit;
}
$c = str_replace($old, $new, $c);
// Also neutralize the window.__opusPatternOpen function (prevent opening)
$old2 = "console.log('[ambre-confidential-shield] active on public page: ' + path);";
$new2 = "// Neutralize global opusPatternOpen function (prevents programmatic opening)
try {
Object.defineProperty(window, '__opusPatternOpen', { value: function(){}, writable: false, configurable: false });
Object.defineProperty(window, '__opusPatternClose', { value: function(){}, writable: false, configurable: false });
} catch(e) {}
console.log('[ambre-confidential-shield] active on public page: ' + path);";
$c = str_replace($old2, $new2, $c);
$backup = "/opt/wevads/vault/shield.GOLD-" . date("Ymd-His") . "-wave262-v2";
@copy($path, $backup);
$wrote = @file_put_contents($path, $c);
echo json_encode([
"delta" => strlen($c) - $orig,
"wrote" => $wrote,
]);

15
api/ambre-sse2.php Normal file
View File

@@ -0,0 +1,15 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia.html");
echo "size: " . strlen($c) . "\n";
echo "Claude count: " . substr_count($c, "Claude") . "\n";
echo "WEVIA-pattern: " . preg_match_all("/WEVIA[- ]?[pP]attern/", $c) . "\n";
// Find around "phase" type handling
$pos = strpos($c, "type === 'header'");
if ($pos === false) $pos = strpos($c, 'type==="header"');
if ($pos === false) $pos = strpos($c, "'header'");
echo "header pos: $pos\n";
if ($pos !== false) {
echo substr($c, $pos, 2500);
}

11
api/ambre-sse3.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia.html");
// Find WEVIA-pattern header rendering - that's the SSE handler for 'header' type
$pos = strpos($c, "WEVIA-pattern");
echo "WEVIA-pattern 1st at: $pos\n\n";
if ($pos !== false) {
echo "=== Context (go back to find handler start) ===\n";
echo substr($c, max(0, $pos - 1500), 3000);
}

9
api/ambre-sse4.php Normal file
View File

@@ -0,0 +1,9 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia.html");
// Get the rest of handleEvent (from WEVIA-pattern onwards to end of function)
$pos = strpos($c, "WEVIA-pattern");
$end = strpos($c, "eventSource.close", $pos);
if ($end === false) $end = $pos + 6000;
echo "=== handleEvent from 96870 to " . ($pos + 6000) . " ===\n";
echo substr($c, $pos + 1800, 5000);

21
api/ambre-trace-leak.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
header("Content-Type: application/json");
$out = [];
// grep for opus-pattern-badge in /var/www/html
$out["opus_pattern_sources"] = trim(@shell_exec("grep -lrE 'opus-pattern-badge|opus-pattern-style' /var/www/html --include='*.js' --include='*.html' --include='*.php' 2>/dev/null | head -10"));
$out["opus_udrill_sources"] = trim(@shell_exec("grep -lrE 'opus-udrill|opus-dashboard-entry' /var/www/html --include='*.js' --include='*.html' --include='*.php' 2>/dev/null | head -10"));
$out["wtp_dock_sources"] = trim(@shell_exec("grep -lrE 'WTP Global|ERP Global|Admin.*Droid|Orch.*WevCode' /var/www/html --include='*.js' --include='*.html' 2>/dev/null | head -10"));
// Read the opus-pattern injector
$f = @shell_exec("grep -lrE 'opus-pattern-badge' /var/www/html --include='*.js' --include='*.php' 2>/dev/null | head -1");
$f = trim($f);
if ($f && file_exists($f)) {
$c = @file_get_contents($f);
$out["pattern_injector_file"] = $f;
$out["pattern_injector_has_guard"] = strpos($c, "PUBLIC-GUARD") !== false || strpos($c, "public_paths") !== false || strpos($c, "AMBRE-V1") !== false;
// Extract first 300 chars
$out["pattern_injector_head"] = substr($c, 0, 400);
}
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

17
api/ambre-widget-read.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
header("Content-Type: text/plain");
$c = @file_get_contents("/var/www/html/wevia-widget.html");
// Find Claude Pattern context
$pos = strpos($c, "Claude Pattern");
if ($pos !== false) {
echo "=== Claude Pattern ctx ===\n";
echo substr($c, max(0, $pos - 300), 600);
}
echo "\n\n=== WTP ctx ===\n";
$pos2 = strpos($c, "WTP");
if ($pos2 !== false) echo substr($c, max(0, $pos2 - 300), 700);
echo "\n\n=== All script srcs and inline signatures ===\n";
preg_match_all('/<script[^>]*(?:src=["\']([^"\']+)["\']|>([^<]{0,100}))/', $c, $m);
foreach ($m[1] as $s) if ($s) echo "SRC: $s\n";
foreach ($m[2] as $s) if (trim($s)) echo "INLINE: " . substr(trim($s), 0, 100) . "\n";

View File

@@ -0,0 +1,53 @@
<?php
header("Content-Type: application/json");
$root = @file_get_contents("/var/www/html/index.html");
// Find all widgets + iframes + the chatbot/claude-pattern widget
$out = [];
// Search for specific widget signatures in index.html
$sigs = [
"claude-pattern",
"Claude Pattern",
"WTP",
"IA Hub",
"Master",
"Droid",
"Arena",
"WEVIA Engine",
"WevCode",
"widget.js",
"chat-widget",
"Ouvrir en plein ecran",
"weval-chat-fix",
"wevia-widget",
"chat-fix",
];
foreach ($sigs as $s) {
$out["match_$s"] = substr_count($root, $s);
}
$out["root_size"] = strlen($root);
// All <script src>
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $root, $m);
$out["scripts"] = array_unique($m[1] ?? []);
// Check weval-chat-fix.js content
$cf = @file_get_contents("/var/www/html/weval-chat-fix.js");
if ($cf) {
$out["chat_fix_size"] = strlen($cf);
$out["chat_fix_has_wtp"] = substr_count($cf, "WTP");
$out["chat_fix_has_claude_pattern"] = substr_count($cf, "Claude Pattern");
$out["chat_fix_has_Master"] = substr_count($cf, "Master") + substr_count($cf, "IA Hub");
$out["chat_fix_head_200"] = substr($cf, 0, 400);
}
// Also check wevia-widget
$ww = @file_get_contents("/var/www/html/wevia-widget.html");
if ($ww) {
$out["wevia_widget_size"] = strlen($ww);
$out["wevia_widget_has_dock"] = substr_count($ww, "WTP") + substr_count($ww, "Master") + substr_count($ww, "Droid");
$out["wevia_widget_has_claude_pattern"] = substr_count($ww, "Claude Pattern");
}
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

View File

@@ -1,5 +1,5 @@
{
"generated": "2026-04-22 03:00:02",
"generated": "2026-04-22 09:00:02",
"version": "1.0",
"servers": [
{
@@ -8,9 +8,9 @@
"private": "10.1.0.2",
"role": "PRIMARY",
"ssh": 49222,
"disk_pct": 85,
"disk_pct": 86,
"disk_avail": "22G",
"uptime": "up 1 week, 17 hours, 8 minutes",
"uptime": "up 1 week, 23 hours, 8 minutes",
"nginx": "active",
"php_fpm": "active",
"php_version": "8.5.5"
@@ -21,7 +21,7 @@
"private": "10.1.0.3",
"role": "WEVADS Arsenal",
"ssh": 22,
"disk_pct": 82,
"disk_pct": 83,
"disk_avail": "26G",
"sentinel": 1
},
@@ -46,7 +46,7 @@
},
{
"name": "listmonk",
"status": "Up 5 days",
"status": "Up 6 days",
"ports": ""
},
{
@@ -66,7 +66,7 @@
},
{
"name": "n8n-docker-n8n-1",
"status": "Up 5 days",
"status": "Up 6 days",
"ports": ""
},
{
@@ -136,6 +136,16 @@
}
],
"domains": [
{
"file": "ai.weval-consulting.com",
"server_names": [
"ai.weval-consulting.com"
],
"ssl": true,
"php-session": false,
"php-session_paths": false,
"auth_complete": false
},
{
"file": "analytics.weval-consulting.com",
"server_names": [
@@ -280,9 +290,9 @@
}
],
"screens": {
"s204_html": 324,
"s204_html": 328,
"s204_products": 104,
"s204_api_php": 1025,
"s204_api_php": 1067,
"s204_wevia_php": 254,
"s95_arsenal_html": 1377,
"s95_arsenal_api": 377
@@ -306,7 +316,7 @@
"langfuse"
],
"key_tables": {
"kb_learnings": 5622,
"kb_learnings": 5706,
"kb_documents": 0,
"ethica_medecins": 50004,
"enterprise_agents": 0
@@ -418,7 +428,7 @@
},
{
"name": "wevia_memory_768",
"vectors": 98
"vectors": 100
},
{
"name": "wevia_kb_768",
@@ -606,15 +616,15 @@
]
},
"wiki": {
"total_entries": 5622,
"total_entries": 5706,
"categories": [
{
"category": "AUTO-FIX",
"cnt": "3024"
"cnt": "3096"
},
{
"category": "TOPOLOGY",
"cnt": "1242"
"cnt": "1254"
},
{
"category": "DISCOVERY",
@@ -1724,44 +1734,44 @@
"recent_commits": [],
"auto_fixes": [
{
"fact": "AUTONOMY 22Apr 02:55: 1 fixes. Disk light cleanup 85%",
"created_at": "2026-04-22 04:55:05.595944"
"fact": "AUTONOMY 22Apr 08:55: 2 fixes. Disk light cleanup 86%; Docker restart weval-docuseal",
"created_at": "2026-04-22 10:55:14.715277"
},
{
"fact": "AUTONOMY 22Apr 02:50: 1 fixes. Disk light cleanup 85%",
"created_at": "2026-04-22 04:50:06.163078"
"fact": "AUTONOMY 22Apr 08:50: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 10:50:05.966888"
},
{
"fact": "AUTONOMY 22Apr 02:45: 1 fixes. Disk light cleanup 85%",
"created_at": "2026-04-22 04:45:06.542555"
"fact": "AUTONOMY 22Apr 08:45: 2 fixes. Disk light cleanup 86%; Docker restart weval-docuseal",
"created_at": "2026-04-22 10:45:05.414088"
},
{
"fact": "AUTONOMY 22Apr 02:40: 1 fixes. Disk light cleanup 85%",
"created_at": "2026-04-22 04:40:06.220594"
"fact": "AUTONOMY 22Apr 08:40: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 10:40:05.253699"
},
{
"fact": "AUTONOMY 22Apr 02:35: 2 fixes. Disk light cleanup 85%; Docker restart weval-docuseal",
"created_at": "2026-04-22 04:35:05.436317"
"fact": "AUTONOMY 22Apr 08:35: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 10:35:04.63423"
},
{
"fact": "AUTONOMY 22Apr 02:30: 1 fixes. Disk light cleanup 85%",
"created_at": "2026-04-22 04:30:09.044797"
"fact": "AUTONOMY 22Apr 08:30: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 10:30:08.326062"
},
{
"fact": "AUTONOMY 22Apr 02:25: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 04:25:07.944997"
"fact": "AUTONOMY 22Apr 08:25: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 10:25:05.043155"
},
{
"fact": "AUTONOMY 22Apr 02:20: 1 fixes. Disk light cleanup 85%",
"created_at": "2026-04-22 04:20:05.987441"
"fact": "AUTONOMY 22Apr 08:20: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 10:20:05.6286"
},
{
"fact": "AUTONOMY 22Apr 02:15: 1 fixes. Disk light cleanup 85%",
"created_at": "2026-04-22 04:15:06.951973"
"fact": "AUTONOMY 22Apr 08:15: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 10:15:06.533813"
},
{
"fact": "AUTONOMY 22Apr 02:10: 1 fixes. Disk light cleanup 85%",
"created_at": "2026-04-22 04:10:05.81299"
"fact": "AUTONOMY 22Apr 08:10: 1 fixes. Disk light cleanup 86%",
"created_at": "2026-04-22 10:10:06.375058"
}
],
"architecture_decisions": [
@@ -1943,14 +1953,14 @@
{
"severity": "opportunity",
"category": "SCALABILITY",
"title": "Qdrant: 22,121 vecteurs",
"title": "Qdrant: 22,123 vecteurs",
"detail": "Volume vectoriel croissant. Planifier sharding ou migration vers cluster Qdrant.",
"action": "opportunity",
"fix_cmd": ""
}
]
},
"scan_time_ms": 4858,
"scan_time_ms": 2526,
"gaps": [],
"score": 100,
"automation": {

View File

@@ -36,5 +36,11 @@
"reason": "OVH credentials missing in /etc/weval/secrets.env. Add OVH_EMAIL + OVH_PASSWORD to enable automation.",
"ts": "2026-04-21T10:00:02.008746",
"status": "needs_credentials"
},
{
"task": "ovh_s151_cancel",
"reason": "OVH credentials missing in /etc/weval/secrets.env. Add OVH_EMAIL + OVH_PASSWORD to enable automation.",
"ts": "2026-04-22T10:00:02.511432",
"status": "needs_credentials"
}
]

View File

@@ -1,140 +1,57 @@
{
"test": "biz-scenario-v9.29-extended",
"timestamp": "2026-04-21T09-19-32",
"test": "biz-scenario-v9.28",
"timestamp": "2026-04-22T04-00-07",
"pages": [
{
"name": "wtp",
"url": "https://weval-consulting.com/weval-technology-platform.html?dev=1",
"ok": true,
"ms": 5929,
"http": 200,
"final_url": "https://weval-consulting.com/weval-technology-platform.html?dev=1",
"ms": 23764,
"found": [
"WEVAL Technology",
"NR ",
"Archi complete",
"Accueil",
"NR "
],
"content_size": 337979
"Accueil"
]
},
{
"name": "erp-gap-fill",
"url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
"ok": true,
"ms": 3893,
"http": 200,
"final_url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
"ms": 4179,
"found": [
"CLOSED",
"25",
"Risk",
"mitigation"
],
"content_size": 94849
"CLOSED: 25"
]
},
{
"name": "infra-tour",
"url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
"ok": true,
"ms": 3226,
"http": 200,
"final_url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
"ms": 3166,
"found": [
"S204",
"S95",
"Blade",
"HTTPS"
],
"content_size": 9303
"77%",
"82%"
]
},
{
"name": "wevia-master",
"url": "https://weval-consulting.com/wevia-master.html?dev=1",
"ok": true,
"ms": 3862,
"http": 200,
"final_url": "https://weval-consulting.com/login?r=/wevia-master.html?dev=1",
"ms": 12964,
"found": [
"master",
"WEVIA"
],
"content_size": 3843
},
{
"name": "ethica-hub",
"url": "https://weval-consulting.com/ethica-hub.html?dev=1",
"ok": true,
"ms": 3959,
"http": 200,
"final_url": "https://weval-consulting.com/ethica-hub.html?dev=1",
"found": [
"Ethica",
"HCP",
"161",
"51K"
],
"content_size": 32798
},
{
"name": "enterprise-model",
"url": "https://weval-consulting.com/enterprise-model.html?dev=1",
"ok": true,
"ms": 4372,
"http": 200,
"final_url": "https://weval-consulting.com/login?r=/enterprise-model.html?dev=1",
"found": [
"Enterprise",
"agents"
],
"content_size": 3847
},
{
"name": "growth-engine",
"url": "https://weval-consulting.com/growth-engine-v2.html?dev=1",
"ok": true,
"ms": 5307,
"http": 200,
"final_url": "https://weval-consulting.com/login?r=/growth-engine-v2.html?dev=1",
"found": [
"Growth",
"Engine",
"growth",
"engine",
"html",
"<body"
],
"content_size": 3847
},
{
"name": "agents-archi",
"url": "https://weval-consulting.com/agents-archi.html?dev=1",
"ok": true,
"ms": 9132,
"http": 200,
"final_url": "https://weval-consulting.com/login?r=/agents-archi.html?dev=1",
"found": [
"agents",
"Architecture",
"archi"
],
"content_size": 3843
"master"
]
}
],
"video": "/var/www/html/videos/biz-scenario-2026-04-21T09-19-32.webm",
"video": "/var/www/html/videos/biz-scenario-2026-04-22T04-00-07.webm",
"screenshots": [
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-wtp.png",
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-erp-gap-fill.png",
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-infra-tour.png",
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-wevia-master.png",
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-ethica-hub.png",
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-enterprise-model.png",
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-growth-engine.png",
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-agents-archi.png"
"/var/www/html/screenshots/biz-2026-04-22T04-00-07-wtp.png",
"/var/www/html/screenshots/biz-2026-04-22T04-00-07-erp-gap-fill.png",
"/var/www/html/screenshots/biz-2026-04-22T04-00-07-infra-tour.png",
"/var/www/html/screenshots/biz-2026-04-22T04-00-07-wevia-master.png"
],
"duration_ms": 50075,
"duration_ms": 51526,
"status": "100%",
"pass": 8,
"total": 8,
"pct": 100,
"video_size": 1995296
"pass": 4,
"total": 4
}

View File

@@ -1,10 +1,10 @@
{
"generated_at": "2026-04-22T05:15:01.952707",
"generated_at": "2026-04-22T11:10:02.122058",
"stats": {
"total": 48,
"pending": 31,
"total": 50,
"pending": 32,
"kaouther_surfaced": 18,
"chrome_surfaced": 3,
"chrome_surfaced": 4,
"notif_only_done": 0,
"autofix_archived": 0,
"cerebras_archived": 0,

View File

@@ -1,8 +1,8 @@
{
"status": "ALIVE",
"ts": "2026-04-22T05:15:02.045198",
"last_heartbeat": "2026-04-22T05:15:02.045198",
"last_heartbeat_ts_epoch": 1776827702,
"ts": "2026-04-22T11:00:02.013919",
"last_heartbeat": "2026-04-22T11:00:02.013919",
"last_heartbeat_ts_epoch": 1776848402,
"tasks_today": 232,
"tasks_week": 574,
"agent_id": "blade-ops",

View File

@@ -0,0 +1,15 @@
{
"type": "key_renewal",
"provider": "GITHUB_TOKEN",
"reason": "EXPIRED",
"urls": {
"GITHUB_TOKEN": "https:\/\/github.com\/settings\/tokens\/new?scopes=repo,workflow&description=WEVIA-Auto",
"GROQ_KEY": "https:\/\/console.groq.com\/keys",
"CEREBRAS_API_KEY": "https:\/\/cloud.cerebras.ai\/platform",
"GEMINI_KEY": "https:\/\/aistudio.google.com\/apikey",
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
},
"ts": "2026-04-22T04:00:08+00:00",
"priority": "P0"
}

View File

@@ -0,0 +1,15 @@
{
"type": "key_renewal",
"provider": "GROQ_KEY",
"reason": "FAIL",
"urls": {
"GITHUB_TOKEN": "https:\/\/github.com\/settings\/tokens\/new?scopes=repo,workflow&description=WEVIA-Auto",
"GROQ_KEY": "https:\/\/console.groq.com\/keys",
"CEREBRAS_API_KEY": "https:\/\/cloud.cerebras.ai\/platform",
"GEMINI_KEY": "https:\/\/aistudio.google.com\/apikey",
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
},
"ts": "2026-04-22T04:00:08+00:00",
"priority": "P1"
}

View File

@@ -0,0 +1,15 @@
{
"type": "key_renewal",
"provider": "SAMBANOVA_KEY",
"reason": "NO_BALANCE",
"urls": {
"GITHUB_TOKEN": "https:\/\/github.com\/settings\/tokens\/new?scopes=repo,workflow&description=WEVIA-Auto",
"GROQ_KEY": "https:\/\/console.groq.com\/keys",
"CEREBRAS_API_KEY": "https:\/\/cloud.cerebras.ai\/platform",
"GEMINI_KEY": "https:\/\/aistudio.google.com\/apikey",
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
},
"ts": "2026-04-22T04:00:08+00:00",
"priority": "P1"
}

View File

@@ -0,0 +1,14 @@
{
"id": "task_20260422070012_21267a",
"name": "CRM Observation Alert",
"type": "powershell",
"command": "Write-Host 'CRM ALERT: Day4: delta_today=225 < 500 (day 4 after reactivation)'; New-BurntToastNotification -Text 'WEVAL CRM', 'Day4: delta_today=225 < 500 (day 4 after reactivation)' -ErrorAction SilentlyContinue",
"cmd": "Write-Host 'CRM ALERT: Day4: delta_today=225 < 500 (day 4 after reactivation)'; New-BurntToastNotification -Text 'WEVAL CRM', 'Day4: delta_today=225 < 500 (day 4 after reactivation)' -ErrorAction SilentlyContinue",
"priority": "high",
"status": "done",
"created": "2026-04-22T07:00:12+00:00",
"created_by": "blade-control-ui",
"completed_by": "s204-reconciler",
"completed_at": "2026-04-22T09:05:01.573422",
"reconciler_reason": "notification-only, no action needed"
}

View File

@@ -0,0 +1,14 @@
{
"id": "task_20260422080003_fe8049",
"name": "OVH S151 cancel review",
"type": "powershell",
"command": "\n# OVH S151 cancel via Blade Windows browser\n$url = 'https://www.ovh.com/manager/dedicated/#/configuration/server'\nWrite-Host \"Opening OVH manager for S151 cancel review...\"\nStart-Process chrome -ArgumentList '--app=' + $url\nStart-Sleep 5\n# Notification\nNew-BurntToastNotification -Text 'WEVAL Auto', 'OVH S151 cancel - review needed. Log into OVH manager.' -ErrorAction SilentlyContinue\n",
"cmd": "\n# OVH S151 cancel via Blade Windows browser\n$url = 'https://www.ovh.com/manager/dedicated/#/configuration/server'\nWrite-Host \"Opening OVH manager for S151 cancel review...\"\nStart-Process chrome -ArgumentList '--app=' + $url\nStart-Sleep 5\n# Notification\nNew-BurntToastNotification -Text 'WEVAL Auto', 'OVH S151 cancel - review needed. Log into OVH manager.' -ErrorAction SilentlyContinue\n",
"priority": "normal",
"status": "done",
"created": "2026-04-22T08:00:03+00:00",
"created_by": "blade-control-ui",
"completed_by": "s204-reconciler",
"completed_at": "2026-04-22T10:05:01.399775",
"reconciler_reason": "surfaced Chrome URL"
}

View File

@@ -1,21 +1,21 @@
{
"timestamp": "2026-04-22 04:00",
"timestamp": "2026-04-22 08:00",
"checks": {
"registry": "0 agents",
"system": {
"docker": "19",
"docker": "20",
"ram": "13Gi/30Gi",
"disk": "85%",
"load": "13.04",
"uptime": "up 1 week, 16 hours, 8 minutes"
"disk": "86%",
"load": "3.12",
"uptime": "up 1 week, 20 hours, 8 minutes"
},
"services": "7/10 OK",
"services": "8/10 OK",
"nonreg": "153/153 (100%)",
"qdrant": "21259 vectors",
"crons": "44 active",
"routes": "446",
"dataset": "5751 pairs",
"wiki": "2123 entries",
"wiki": "2252 entries",
"enterprise": "758 agents (dorm=0 dead=167)"
},
"analysis": "Analyse indisponible"

View File

@@ -1,15 +1,15 @@
{
"ts": "2026-04-21T09:00:13.028409",
"day_since_reactivation": 3,
"total": 3097643,
"delta_today": 294,
"ts": "2026-04-22T09:00:12.724505",
"day_since_reactivation": 4,
"total": 3097756,
"delta_today": 225,
"runs_ok_24h": 76,
"runs_err_24h": 0,
"last_run_age": "30min",
"last_run_age": "1s",
"cron_status": "active",
"alert_triggered": true,
"alert_reasons": [
"delta_today=294 < 500 (day 3 after reactivation)"
"delta_today=225 < 500 (day 4 after reactivation)"
],
"screenshot": "/var/www/html/api/crm-observation-screenshots/crm-pipeline-20260421-090004.png"
"screenshot": "/var/www/html/api/crm-observation-screenshots/crm-pipeline-20260422-090004.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -1,14 +1,18 @@
{
"timestamp": "2026-04-22 00:00",
"timestamp": "2026-04-22 06:00",
"fast_php_routes": 446,
"opt_tools_total": 53,
"opt_tools_total": 54,
"wired": 51,
"not_wired_count": 2,
"not_wired_count": 3,
"not_wired_tools": [
{
"name": ".git",
"files": 11
},
{
"name": "__pycache__",
"files": 4
},
{
"name": "oss",
"files": 10
@@ -30,5 +34,5 @@
"uptime-kuma",
"vaultwarden"
],
"score": 96.2
"score": 94.4
}

View File

@@ -5,7 +5,7 @@
"status": "ERROR"
},
"ports": {
"total": 76,
"total": 74,
"exposed": 20,
"ports": [
{
@@ -14,11 +14,11 @@
},
{
"addr": "127.0.0.1:5890",
"process": "users:((\"apache2\",pid=2670905,fd=12),(\"apache2\",pi"
"process": "users:((\"apache2\",pid=2669228,fd=12),(\"apache2\",pi"
},
{
"addr": "127.0.0.1:5888",
"process": "users:((\"apache2\",pid=2670905,fd=10),(\"apache2\",pi"
"process": "users:((\"apache2\",pid=2669228,fd=10),(\"apache2\",pi"
},
{
"addr": "127.0.0.1:6060",
@@ -30,23 +30,23 @@
},
{
"addr": "127.0.0.1:5823",
"process": "users:((\"apache2\",pid=2670905,fd=5),(\"apache2\",pid"
"process": "users:((\"apache2\",pid=2669228,fd=5),(\"apache2\",pid"
},
{
"addr": "127.0.0.1:5822",
"process": "users:((\"apache2\",pid=2670905,fd=4),(\"apache2\",pid"
"process": "users:((\"apache2\",pid=2669228,fd=4),(\"apache2\",pid"
},
{
"addr": "127.0.0.1:5821",
"process": "users:((\"apache2\",pid=2670905,fd=3),(\"apache2\",pid"
"process": "users:((\"apache2\",pid=2669228,fd=3),(\"apache2\",pid"
},
{
"addr": "127.0.0.1:5825",
"process": "users:((\"apache2\",pid=2670905,fd=13),(\"apache2\",pi"
"process": "users:((\"apache2\",pid=2669228,fd=13),(\"apache2\",pi"
},
{
"addr": "127.0.0.1:5824",
"process": "users:((\"apache2\",pid=2670905,fd=6),(\"apache2\",pid"
"process": "users:((\"apache2\",pid=2669228,fd=6),(\"apache2\",pid"
},
{
"addr": "127.0.0.1:6379",
@@ -72,18 +72,14 @@
"addr": "0.0.0.0:8765",
"process": "users:((\"python3\",pid=1811016,fd=3))"
},
{
"addr": "127.0.0.1:34111",
"process": "users:((\"ollama\",pid=1295666,fd=3))"
},
{
"addr": "127.0.0.1:2024",
"process": "users:((\"langgraph\",pid=3664742,fd=16))"
},
{
"addr": "127.0.0.1:34311",
"process": "users:((\"ollama\",pid=3712641,fd=3))"
},
{
"addr": "127.0.0.1:35283",
"process": "users:((\"ollama\",pid=3715510,fd=3))"
},
{
"addr": "127.0.0.53:53",
"process": "users:((\"systemd-resolve\",pid=999,fd=15))"
@@ -96,10 +92,6 @@
"addr": "127.0.0.1:4001",
"process": "users:((\"python3\",pid=1392,fd=3))"
},
{
"addr": "127.0.0.1:45395",
"process": "users:((\"ollama\",pid=3718575,fd=3))"
},
{
"addr": "0.0.0.0:4000",
"process": "users:((\"python3\",pid=1394482,fd=3))"
@@ -110,7 +102,7 @@
},
{
"addr": "0.0.0.0:443",
"process": "users:((\"nginx\",pid=3734221,fd=5),(\"nginx\",pid=373"
"process": "users:((\"nginx\",pid=1873436,fd=5),(\"nginx\",pid=131"
},
{
"addr": "0.0.0.0:49222",
@@ -118,7 +110,7 @@
},
{
"addr": "0.0.0.0:80",
"process": "users:((\"nginx\",pid=3734221,fd=6),(\"nginx\",pid=373"
"process": "users:((\"nginx\",pid=1873436,fd=6),(\"nginx\",pid=131"
},
{
"addr": "0.0.0.0:22",
@@ -127,6 +119,14 @@
{
"addr": "127.0.0.1:8280",
"process": "users:((\"crowdsec\",pid=2454,fd=26))"
},
{
"addr": "127.0.0.1:8443",
"process": "users:((\"apache2\",pid=2669228,fd=11),(\"apache2\",pi"
},
{
"addr": "127.0.0.1:9050",
"process": "users:((\"tor\",pid=1408,fd=6))"
}
],
"status": "WARN"
@@ -161,7 +161,7 @@
"status": "PASS"
}
},
"timestamp": "2026-04-22T00:00:02",
"timestamp": "2026-04-22T06:00:01",
"oss_tools": [
{
"name": "Nuclei",

View File

@@ -1,6 +1,6 @@
{
"type": "daily",
"timestamp": "2026-04-21 12:00",
"timestamp": "2026-04-22 07:00",
"squads": {
"infra": {
"name": "INFRA",

View File

@@ -1,8 +1,8 @@
{
"timestamp": "2026-04-22T00:30:02.808685",
"timestamp": "2026-04-22T06:30:02.392649",
"source": "auto-populator-v2-fixed-18avr",
"enterprise_total_agents": 747,
"docker_total": 19,
"docker_total": 20,
"rooms": {
"strat": {
"count": 99,

View File

@@ -1,12 +1,12 @@
[00:30:02] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
[00:30:02] Enterprise: 747 agents
[00:30:02] Registry: 11 sections
[00:30:02] Docker: 19 containers
[00:30:02] strat: 99 agents (38 active)
[00:30:02] infra: 308 agents (34 active)
[00:30:02] dev: 108 agents (25 active)
[00:30:02] sec: 48 agents (13 active)
[00:30:02] biz: 114 agents (31 active)
[00:30:02] ia: 168 agents (48 active)
[00:30:02] transit: 254 agents (27 active)
[00:30:02] Output: /var/www/html/api/meeting-rooms-data.json
[06:30:01] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
[06:30:01] Enterprise: 747 agents
[06:30:02] Registry: 11 sections
[06:30:02] Docker: 20 containers
[06:30:02] strat: 99 agents (38 active)
[06:30:02] infra: 308 agents (34 active)
[06:30:02] dev: 108 agents (25 active)
[06:30:02] sec: 48 agents (13 active)
[06:30:02] biz: 114 agents (31 active)
[06:30:02] ia: 168 agents (48 active)
[06:30:02] transit: 254 agents (27 active)
[06:30:02] Output: /var/www/html/api/meeting-rooms-data.json

View File

@@ -0,0 +1,30 @@
{
"type": "DAILY STANDUP",
"timestamp": "2026-04-22 06:00",
"squad": "infra",
"agents": {
"cortex": {
"done": "13 checks, services 7\/10 OK",
"blockers": "none",
"next": "Continue monitoring *\/4h"
},
"gap_detector": {
"done": "Score 94.4% (51\/54 wired)",
"blockers": "3 tools not wired",
"next": "Wire remaining tools"
},
"nonreg": {
"done": "153\/153 (100%)",
"blockers": "none",
"next": "Maintain 100%"
},
"security": {
"done": "0 leaks, 92 expositions redacted, CrowdSec active",
"blockers": "none",
"next": "Continuous monitoring"
}
},
"conflicts": [],
"actions": [],
"ai_analysis": "```json\n{\n \"conflicts\": [\n \"gap_detector est bloqué par 3 outils non connectés, ce qui pourrait impacter cortex (seulement 7\/10 services OK) et nonreg si ces outils manquants sont critiques\"\n ],\n \"common_issues\": [\n \"Surveillance continue requise par plusieurs agents (cortex, security) indique une charge opérationnelle soutenue en arrière-plan\",\n \"Absence de blocages déclarés, mais dette d'intégration (outils non câblés) menace la fiabilité globale\"\n ],\n \"priority_actions\": [\n \"Wiring immédiat des 3 outils restants pour gap_detector afin de garantir une couverture complète et permettre une visibilité optimale aux autres agents\",\n \"Vérifier l'impact des 3 services manquants dans cortex par rapport aux outils non câblés\",\n \"Maintenir la vigilance sécurité et les expositions redactées avec monitoring continu\"\n ],\n \"conciliation\": [\n \"Coordonner gap_detector et cortex : valider si les services dégradés sont liés aux outils non câblés\",\n \"S'assurer que la montée en couverture de gap_detector ne perturbe pas la stabilité nonreg (100% actuel)\"\n ]\n}\n```"
}

View File

@@ -0,0 +1,30 @@
{
"type": "DAILY STANDUP",
"timestamp": "2026-04-22 06:30",
"squad": "innovation",
"agents": {
"evolution": {
"done": "System: ? routes, ? skills",
"blockers": "Agent PHP syntax to fix",
"next": "Generate 5 evolution proposals"
},
"scanner": {
"done": "12 sections wiki scanned",
"blockers": "none",
"next": "Continue *\/2h"
},
"l99": {
"done": "Functional ?\/93, Dark 7\/10",
"blockers": "gitleaks+trivy version format mismatch",
"next": "Fix dark test parsing"
},
"mirofish": {
"done": "MiroFish DOWN",
"blockers": "Service down",
"next": "Collaborative tools"
}
},
"conflicts": [],
"actions": [],
"ai_analysis": "```json\n{\n \"conflicts\": [\n \"Agent PHP syntax error (blocking 'evolution') could impact code generation needed by other agents\",\n \"MiroFish DOWN affects collaborative tools access, potentially blocking coordination (mirofish vs all)\"\n ],\n \"common_issues\": [\n \"Service stability issues (gitleaks+trivy version mismatch, MiroFish down)\",\n \"Incomplete functional coverage (dark tests, missing skill\/route tracking)\"\n ],\n \"priority_actions\": [\n \"Fix MiroFish service outage to restore collaboration capabilities\",\n \"Resolve gitleaks+trivy version mismatch to unblock l99 dark test parsing\",\n \"Fix Agent PHP syntax to enable evolution module to generate proposals\"\n ],\n \"conciliation\": [\n \"Align l99 and evolution on shared dependency versions to prevent future mismatches\",\n \"Coordinate scanner's 2h cycle with evolution's proposal timeline to ensure updated data is used\"\n ]\n}\n```"
}

View File

@@ -1,6 +1,6 @@
{
"type": "DAILY STANDUP",
"timestamp": "2026-04-21 12:30",
"timestamp": "2026-04-22 06:30",
"squad": "innovation",
"agents": {
"evolution": {
@@ -26,5 +26,5 @@
},
"conflicts": [],
"actions": [],
"ai_analysis": "```json\n{\n \"conflicts\": [\n \"Agent PHP syntax error bloque 'evolution' (nécessite routes\/skills pour générer propositions)\",\n \"Service MiroFish DOWN affecte potentiellement 'mirofish' et tout agent dépendant d'outils collaboratifs\",\n \"gitleaks+trivy mismatch dans 'l99' peut impacter sécurité globale et intégration continue\"\n ],\n \"common_issues\": [\n \"Problèmes de dépendances externes (services, versions, syntaxe)\",\n \"Manque de données ou formats incompatibles (PHP, parsing, versioning)\",\n \"Risque de paralysie partielle si les blocages ne sont pas résolus rapidement\"\n ],\n \"priority_actions\": [\n \"Réparer la syntaxe PHP pour débloquer 'evolution'\",\n \"Restaurer le service MiroFish ou basculer vers un outil de secours pour les outils collaboratifs\",\n \"Corriger le format de version entre gitleaks et trivy dans 'l99'\",\n \"Allouer un agent temporaire pour assistance multi-blocs si nécessaire\"\n ],\n \"conciliation\": [\n \"Coordonner 'l99' et 'evolution' sur un format de version commun partagé\",\n \"Désigner un relais ('scanner' ?) pour assurer la continuité info si 'mirofish' reste down\"\n ]\n}\n```"
"ai_analysis": "```json\n{\n \"conflicts\": [\n \"Agent PHP syntax error (blocking 'evolution') could impact code generation needed by other agents\",\n \"MiroFish DOWN affects collaborative tools access, potentially blocking coordination (mirofish vs all)\"\n ],\n \"common_issues\": [\n \"Service stability issues (gitleaks+trivy version mismatch, MiroFish down)\",\n \"Incomplete functional coverage (dark tests, missing skill\/route tracking)\"\n ],\n \"priority_actions\": [\n \"Fix MiroFish service outage to restore collaboration capabilities\",\n \"Resolve gitleaks+trivy version mismatch to unblock l99 dark test parsing\",\n \"Fix Agent PHP syntax to enable evolution module to generate proposals\"\n ],\n \"conciliation\": [\n \"Align l99 and evolution on shared dependency versions to prevent future mismatches\",\n \"Coordinate scanner's 2h cycle with evolution's proposal timeline to ensure updated data is used\"\n ]\n}\n```"
}

View File

@@ -1,27 +1,27 @@
{
"ok": true,
"agent": "V42_MQL_Scoring_Agent_REAL",
"ts": "2026-04-22T03:10:02+00:00",
"ts": "2026-04-22T09:10:02+00:00",
"status": "DEPLOYED_AUTO",
"deployed": true,
"algorithm": "weighted_behavioral_signals",
"signals_tracked": {
"wtp_engagement": 44,
"wtp_engagement": 100,
"chat_engagement": 0,
"roi_tool": 0,
"email_opened": 0
},
"avg_score": 11,
"avg_score": 25,
"mql_threshold": 50,
"sql_threshold": 75,
"leads_captured": 48,
"mql_auto_scored": 18,
"sql_auto_scored": 7,
"mql_auto_pct": 38,
"mql_auto_scored": 20,
"sql_auto_scored": 8,
"mql_auto_pct": 41,
"improvement_vs_manual": {
"before_manual_pct": 33.3,
"after_auto_pct": 38,
"delta": 4.700000000000003
"after_auto_pct": 41,
"delta": 7.700000000000003
},
"paperclip_db_ok": true,
"paperclip_tables": 2,

View File

@@ -2,7 +2,7 @@
{
"name": "weval-l99",
"path": "/opt/weval-l99",
"files": 664,
"files": 669,
"has_readme": false,
"has_skill": false,
"has_python": true,
@@ -10,12 +10,12 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.576438"
"discovered": "2026-04-22T11:00:02.405306"
},
{
"name": "wevia-brain",
"path": "/opt/wevia-brain",
"files": 167,
"files": 168,
"has_readme": false,
"has_skill": false,
"has_python": true,
@@ -23,7 +23,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.773185"
"discovered": "2026-04-22T11:00:02.423221"
},
{
"name": "skills",
@@ -36,7 +36,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.181443"
"discovered": "2026-04-22T11:00:02.348568"
},
{
"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-22T05:00:03.155753"
"discovered": "2026-04-22T11:00:02.186581"
},
{
"name": "open-webui-fresh",
@@ -62,7 +62,7 @@
"has_docker": true,
"wired": true,
"description": "# Open WebUI 👋 ![GitHub stars](https://img.shields.io/github/stars/open-webui/open-webui?style=social) ![GitHub forks](https://img.shields.io/github/",
"discovered": "2026-04-22T05:00:03.613474"
"discovered": "2026-04-22T11:00:02.221931"
},
{
"name": "weval-nonreg",
@@ -75,7 +75,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.633993"
"discovered": "2026-04-22T11:00:02.409639"
},
{
"name": "activepieces",
@@ -88,7 +88,7 @@
"has_docker": true,
"wired": true,
"description": " <h1 align=\"center\"> <a target=\"_blank\" href=\"https://activepieces.com\" > <img align=\"center\" alt=\"Activepieces\" src=\"http",
"discovered": "2026-04-22T05:00:02.741208"
"discovered": "2026-04-22T11:00:01.972816"
},
{
"name": "oh-my-claudecode",
@@ -101,7 +101,7 @@
"has_docker": false,
"wired": true,
"description": "English | [한국어](README.ko.md) | [中文](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-22T05:00:03.530637"
"discovered": "2026-04-22T11:00:02.219735"
},
{
"name": "mxyhi_ok-skills",
@@ -114,7 +114,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-22T05:00:03.419883"
"discovered": "2026-04-22T11:00:02.215373"
},
{
"name": "SuperClaude_Framework",
@@ -127,7 +127,7 @@
"has_docker": false,
"wired": true,
"description": "<div align=\"center\"> # 🚀 SuperClaude Framework [![Run in Smithery](https://smithery.ai/badge/skills/SuperClaude-Org)](https://smithery.ai/skills?ns=",
"discovered": "2026-04-22T05:00:02.734645"
"discovered": "2026-04-22T11:00:01.958048"
},
{
"name": "paperclip-weval",
@@ -140,7 +140,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-22T05:00:03.769431"
"discovered": "2026-04-22T11:00:02.227914"
},
{
"name": "vllm",
@@ -153,7 +153,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-22T05:00:04.384782"
"discovered": "2026-04-22T11:00:02.376553"
},
{
"name": "deer-flow",
@@ -166,7 +166,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) [![Python](https:",
"discovered": "2026-04-22T05:00:03.146686"
"discovered": "2026-04-22T11:00:02.183965"
},
{
"name": "system-prompts-ai",
@@ -179,7 +179,7 @@
"has_docker": false,
"wired": true,
"description": "<p align=\"center\"> Support my work here: <a href=\"https://bags.fm/DEffWzJyaFRNyA4ogUox631hfHuv3KLeCcpBh2ipBAGS\">Bags.fm</a> • <a href=\"https://",
"discovered": "2026-04-22T05:00:04.305520"
"discovered": "2026-04-22T11:00:02.370137"
},
{
"name": "librechat",
@@ -192,7 +192,7 @@
"has_docker": true,
"wired": true,
"description": "<p align=\"center\"> <a href=\"https://librechat.ai\"> <img src=\"client/public/assets/logo.svg\" height=\"256\"> </a> <h1 align=\"center\"> <a hr",
"discovered": "2026-04-22T05:00:03.270252"
"discovered": "2026-04-22T11:00:02.196952"
},
{
"name": "listmonk",
@@ -205,7 +205,7 @@
"has_docker": true,
"wired": true,
"description": "<a href=\"https://zerodha.tech\"><img src=\"https://zerodha.tech/static/images/github-badge.svg\" align=\"right\" /></a> [![listmonk-logo](https://user-ima",
"discovered": "2026-04-22T05:00:03.290156"
"discovered": "2026-04-22T11:00:02.201145"
},
{
"name": "claw-code",
@@ -218,7 +218,7 @@
"has_docker": false,
"wired": true,
"description": "<div align=\"center\"> <img src=\"https://github.com/2214962083/2214962083/assets/34775414/a48b745f-c803-4884-95a8-26c63f7f5b53\" alt=\"icon\"/> <h1 align=",
"discovered": "2026-04-22T05:00:03.099866"
"discovered": "2026-04-22T11:00:02.178076"
},
{
"name": "rnd-edict",
@@ -231,7 +231,7 @@
"has_docker": true,
"wired": true,
"description": "<h1 align=\"center\">⚔️ 三省六部 · Edict</h1> <p align=\"center\"> <strong>我用 1300 年前的帝国制度,重新设计了 AI 多 Agent 协作架构。<br>结果发现,古人比现代 AI 框架更懂分权制衡。</strong> </p> ",
"discovered": "2026-04-22T05:00:04.085723"
"discovered": "2026-04-22T11:00:02.254228"
},
{
"name": "anythingllm",
@@ -244,7 +244,7 @@
"has_docker": false,
"wired": true,
"description": "<a name=\"readme-top\"></a> <p align=\"center\"> <a href=\"https://anythingllm.com\"><img src=\"https://github.com/Mintplex-Labs/anything-llm/blob/master/",
"discovered": "2026-04-22T05:00:02.770155"
"discovered": "2026-04-22T11:00:02.041662"
},
{
"name": "modelscope-hub",
@@ -257,7 +257,7 @@
"has_docker": false,
"wired": true,
"description": " <p align=\"center\"> <br> <img src=\"https://modelscope.oss-cn-beijing.aliyuncs.com/modelscope.gif\" width=\"400\"/> <br> <p> <div align=\"cent",
"discovered": "2026-04-22T05:00:03.360290"
"discovered": "2026-04-22T11:00:02.213259"
},
{
"name": "antigravity-awesome-skills",
@@ -270,7 +270,7 @@
"has_docker": false,
"wired": true,
"description": "<!-- registry-sync: version=9.4.0; skills=1340; stars=28867; updated_at=2026-03-31T16:30:41+00:00 --> # 🌌 Antigravity Awesome Skills: 1,340+ Agentic S",
"discovered": "2026-04-22T05:00:02.751389"
"discovered": "2026-04-22T11:00:02.039415"
},
{
"name": "deepagent",
@@ -283,7 +283,7 @@
"has_docker": false,
"wired": true,
"description": "# DeepAgents 기반 Research Multi Agent System Agent 2.0 Paradigm 을 잘 구현하는 DeepAgent 를 활용해서, FileSystem 기반 Context Engineering 을 원활히 수행하는 Research 용 Mul",
"discovered": "2026-04-22T05:00:03.118233"
"discovered": "2026-04-22T11:00:02.181378"
},
{
"name": "whisper.cpp",
@@ -296,7 +296,7 @@
"has_docker": false,
"wired": true,
"description": "# whisper.cpp ![whisper.cpp](https://user-images.githubusercontent.com/1991296/235238348-05d0f6a4-da44-4900-a1de-d0707e75b763.jpeg) [![Actions Statu",
"discovered": "2026-04-22T05:00:04.829728"
"discovered": "2026-04-22T11:00:02.429025"
},
{
"name": "weval-ops",
@@ -309,7 +309,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.660723"
"discovered": "2026-04-22T11:00:02.411596"
},
{
"name": "rnd-astron-agent",
@@ -322,7 +322,7 @@
"has_docker": false,
"wired": true,
"description": "[![Astron_Readme](./docs/imgs/Astron_Readme.png)](https://agent.xfyun.cn) <div align=\"center\"> [![License](https://img.shields.io/badge/license-apac",
"discovered": "2026-04-22T05:00:04.034606"
"discovered": "2026-04-22T11:00:02.251966"
},
{
"name": "sovereign-api",
@@ -335,7 +335,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.244484"
"discovered": "2026-04-22T11:00:02.365483"
},
{
"name": "autogen",
@@ -348,7 +348,7 @@
"has_docker": false,
"wired": true,
"description": "<a name=\"readme-top\"></a> <div align=\"center\"> <img src=\"https://microsoft.github.io/autogen/0.2/img/ag.svg\" alt=\"AutoGen Logo\" width=\"100\"> [![Twit",
"discovered": "2026-04-22T05:00:02.891159"
"discovered": "2026-04-22T11:00:02.114992"
},
{
"name": "HolyClaude",
@@ -361,7 +361,7 @@
"has_docker": true,
"wired": true,
"description": "🌍 **English** | [Español](docs/translations/README.es.md) | [Français](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
"discovered": "2026-04-22T05:00:02.729170"
"discovered": "2026-04-22T11:00:01.936304"
},
{
"name": "aios",
@@ -374,7 +374,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-22T05:00:02.743498"
"discovered": "2026-04-22T11:00:02.011046"
},
{
"name": "rnd-agent-framework",
@@ -387,7 +387,7 @@
"has_docker": false,
"wired": true,
"description": "![Microsoft Agent Framework](docs/assets/readme-banner.png) # Welcome to Microsoft Agent Framework! [![Microsoft Foundry Discord](https://dcbadge.li",
"discovered": "2026-04-22T05:00:03.952981"
"discovered": "2026-04-22T11:00:02.245445"
},
{
"name": "awesome-claude-code-toolkit",
@@ -400,7 +400,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-22T05:00:02.962679"
"discovered": "2026-04-22T11:00:02.140454"
},
{
"name": "mirofish",
@@ -413,7 +413,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-22T05:00:03.344037"
"discovered": "2026-04-22T11:00:02.211115"
},
{
"name": "claude-mem",
@@ -426,7 +426,20 @@
"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-22T05:00:03.061074"
"discovered": "2026-04-22T11:00:02.175964"
},
{
"name": "wevads",
"path": "/opt/wevads",
"files": 16,
"has_readme": false,
"has_skill": false,
"has_python": false,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T11:00:02.392955"
},
{
"name": "huggingface-skills",
@@ -439,20 +452,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-22T05:00:03.236658"
},
{
"name": "wevads",
"path": "/opt/wevads",
"files": 15,
"has_readme": false,
"has_skill": false,
"has_python": false,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.453006"
"discovered": "2026-04-22T11:00:02.190833"
},
{
"name": "supermemory",
@@ -465,7 +465,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-22T05:00:04.303401"
"discovered": "2026-04-22T11:00:02.368122"
},
{
"name": "fmgapp",
@@ -478,7 +478,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.196453"
"discovered": "2026-04-22T11:00:02.188792"
},
{
"name": "obsidian-vault",
@@ -491,7 +491,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.437223"
"discovered": "2026-04-22T11:00:02.217445"
},
{
"name": "rnd-agents",
@@ -504,7 +504,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-22T05:00:03.976197"
"discovered": "2026-04-22T11:00:02.249188"
},
{
"name": "FrancyJGLisboa_agent-skill-creator",
@@ -517,7 +517,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-22T05:00:02.726368"
"discovered": "2026-04-22T11:00:01.842178"
},
{
"name": "oss",
@@ -530,7 +530,7 @@
"has_docker": false,
"wired": true,
"description": "# WEVAL OSS Registry · /opt/oss/ Wave 222 · 2026-04-21 ## Purpose Register the OSS tools identified by AI capability gap audit (wave 220 ai-gap-cach",
"discovered": "2026-04-22T05:00:03.660362"
"discovered": "2026-04-22T11:00:02.224009"
},
{
"name": "scripts",
@@ -543,7 +543,7 @@
"has_docker": false,
"wired": true,
"description": "# Token Rotation Scripts · Opus Session 21-avr v7 ## État - 5 scripts provider skeleton (groq, github, sambanova, alibaba, whatsapp) - 1 master dispa",
"discovered": "2026-04-22T05:00:04.125761"
"discovered": "2026-04-22T11:00:02.340359"
},
{
"name": "skillsmith",
@@ -556,7 +556,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-22T05:00:04.197142"
"discovered": "2026-04-22T11:00:02.350535"
},
{
"name": "awesome-agent-skills",
@@ -569,7 +569,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-22T05:00:02.927508"
"discovered": "2026-04-22T11:00:02.138130"
},
{
"name": "paperclip-skills",
@@ -582,7 +582,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.716125"
"discovered": "2026-04-22T11:00:02.225918"
},
{
"name": "__pycache__",
@@ -595,7 +595,7 @@
"has_docker": false,
"wired": false,
"description": "",
"discovered": "2026-04-22T05:00:02.739048"
"discovered": "2026-04-22T11:00:01.963571"
},
{
"name": "jzOcb_writing-style-skill",
@@ -608,7 +608,7 @@
"has_docker": false,
"wired": true,
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
"discovered": "2026-04-22T05:00:03.239106"
"discovered": "2026-04-22T11:00:02.192923"
},
{
"name": "qdrant-data",
@@ -621,7 +621,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.868648"
"discovered": "2026-04-22T11:00:02.240746"
},
{
"name": "wazuh",
@@ -634,7 +634,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.422902"
"discovered": "2026-04-22T11:00:02.381261"
},
{
"name": "plausible",
@@ -647,7 +647,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.783635"
"discovered": "2026-04-22T11:00:02.229905"
},
{
"name": "pmta",
@@ -660,7 +660,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.785726"
"discovered": "2026-04-22T11:00:02.231890"
},
{
"name": "render-configs",
@@ -673,7 +673,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.942716"
"discovered": "2026-04-22T11:00:02.242893"
},
{
"name": "searxng",
@@ -686,7 +686,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.151920"
"discovered": "2026-04-22T11:00:02.344641"
},
{
"name": "weval-guardian",
@@ -699,7 +699,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.535805"
"discovered": "2026-04-22T11:00:02.400378"
},
{
"name": "weval-litellm",
@@ -712,7 +712,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.578484"
"discovered": "2026-04-22T11:00:02.407669"
},
{
"name": "weval-security",
@@ -725,7 +725,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.740268"
"discovered": "2026-04-22T11:00:02.419062"
},
{
"name": "archive",
@@ -738,7 +738,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:02.772307"
"discovered": "2026-04-22T11:00:02.073055"
},
{
"name": "loki",
@@ -751,7 +751,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.322173"
"discovered": "2026-04-22T11:00:02.207122"
},
{
"name": "ruflo",
@@ -764,7 +764,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.123854"
"discovered": "2026-04-22T11:00:02.335175"
},
{
"name": "twenty",
@@ -777,7 +777,20 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.360420"
"discovered": "2026-04-22T11:00:02.372346"
},
{
"name": "weval-cli",
"path": "/opt/weval-cli",
"files": 2,
"has_readme": false,
"has_skill": false,
"has_python": true,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T11:00:02.396583"
},
{
"name": "weval-crewai",
@@ -790,7 +803,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.494641"
"discovered": "2026-04-22T11:00:02.398532"
},
{
"name": "weval-plugins",
@@ -803,7 +816,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.662784"
"discovered": "2026-04-22T11:00:02.413447"
},
{
"name": "weval-radar",
@@ -816,7 +829,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.701336"
"discovered": "2026-04-22T11:00:02.415169"
},
{
"name": "weval-scrapy",
@@ -829,7 +842,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.703453"
"discovered": "2026-04-22T11:00:02.417079"
},
{
"name": "blade",
@@ -842,7 +855,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.058886"
"discovered": "2026-04-22T11:00:02.161586"
},
{
"name": "langfuse",
@@ -855,7 +868,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.252520"
"discovered": "2026-04-22T11:00:02.194833"
},
{
"name": "litellm",
@@ -868,7 +881,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.292301"
"discovered": "2026-04-22T11:00:02.203093"
},
{
"name": "mattermost-docker",
@@ -881,7 +894,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.330081"
"discovered": "2026-04-22T11:00:02.209081"
},
{
"name": "prometheus",
@@ -894,7 +907,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.822364"
"discovered": "2026-04-22T11:00:02.238183"
},
{
"name": "twenty-compose",
@@ -907,20 +920,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.382525"
},
{
"name": "weval-cli",
"path": "/opt/weval-cli",
"files": 1,
"has_readme": false,
"has_skill": false,
"has_python": false,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.482509"
"discovered": "2026-04-22T11:00:02.374523"
},
{
"name": "weval-ux",
@@ -933,7 +933,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.744751"
"discovered": "2026-04-22T11:00:02.421036"
},
{
"name": "wevia-integrity",
@@ -946,7 +946,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.823387"
"discovered": "2026-04-22T11:00:02.426909"
},
{
"name": "DiffusionDB",
@@ -959,7 +959,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:02.720532"
"discovered": "2026-04-22T11:00:01.811452"
},
{
"name": "LTX-Video",
@@ -972,7 +972,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:02.732512"
"discovered": "2026-04-22T11:00:01.946230"
},
{
"name": "localai",
@@ -985,7 +985,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:03.309907"
"discovered": "2026-04-22T11:00:02.205147"
},
{
"name": "wevia-finetune",
@@ -998,6 +998,6 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-22T05:00:04.792179"
"discovered": "2026-04-22T11:00:02.425086"
}
]

View File

@@ -1,5 +1,5 @@
{
"date": "2026-04-21 22:00:02",
"date": "2026-04-22 04:00:02",
"query": "multi-agent orchestration",
"new_repos": 0,
"cloned": 0,

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-22T05:00:16",
"timestamp": "2026-04-22T11:00:13",
"features": {
"total": 36,
"pass": 35
@@ -13,7 +13,7 @@
"score": 97.2,
"log": [
"=== UX AGENT v1.0 ===",
"Time: 2026-04-22 05:00:02",
"Time: 2026-04-22 11:00:01",
" core: 4/4",
" layout: 3/4",
" interaction: 6/6",

View File

@@ -1,7 +1,7 @@
{
"ok": true,
"version": "V83-business-kpi",
"ts": "2026-04-22T03:19:49+00:00",
"ts": "2026-04-22T09:11:34+00:00",
"summary": {
"total_categories": 8,
"total_kpis": 64,

View File

@@ -1,8 +1,8 @@
{
"date": "2026-04-21",
"s204": {"disk":"80%","ram":"11Gi/30Gi","docker":19,"ollama":7,"uptime":"up 6 days, 18 hours, 8 minutes"},
"blade": {"status":"stale","cpu":"?"},
"data": {"apis":250,"crons":78,"wiki":1928,"hcps":"161727"},
"git": "5192eeabd auto-sync-0600",
"date": "2026-04-22",
"s204": {"disk":"85%","ram":"12Gi/30Gi","docker":19,"ollama":7,"uptime":"up 1 week, 18 hours, 8 minutes"},
"blade": {"status":"offline","cpu":"?"},
"data": {"apis":254,"crons":86,"wiki":2252,"hcps":"166737"},
"git": "7adc35c12 auto-sync-0555",
"cost": "0EUR"
}

View File

@@ -368,10 +368,93 @@ if ($action === 'manifest') {
exit;
}
// WAVE_261_HEALTH · probe all agents, return green/red status
if ($action === 'health') {
$agents = all_agents();
$results = [];
$mh = curl_multi_init();
$handles = [];
foreach ($agents as $key => $info) {
if (($info['type'] ?? '') === 'http' && !empty($info['url'])) {
$ch = curl_init($info['url']);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>3, CURLOPT_NOBODY=>false, CURLOPT_CONNECTTIMEOUT=>2]);
curl_multi_add_handle($mh, $ch);
$handles[$key] = $ch;
} elseif (($info['type'] ?? '') === 'db_query') {
$results[$key] = ['status'=>'green', 'type'=>'db', 'info'=>$info['name']];
}
}
$running = null;
do { curl_multi_exec($mh, $running); curl_multi_select($mh, 0.1); } while ($running > 0);
foreach ($handles as $key => $ch) {
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$time_ms = round(curl_getinfo($ch, CURLINFO_TOTAL_TIME) * 1000);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
$info = $agents[$key];
$results[$key] = [
'status' => ($code >= 200 && $code < 300) ? 'green' : 'red',
'http' => $code,
'time_ms' => $time_ms,
'type' => 'http',
'info' => $info['name'] ?? $key,
];
}
curl_multi_close($mh);
$green = count(array_filter($results, function($r){return $r['status']==='green';}));
$red = count($results) - $green;
echo json_encode([
'ok' => true, 'wave' => 261,
'total' => count($results),
'green' => $green, 'red' => $red,
'health_pct' => count($results) > 0 ? round($green/count($results)*100) : 0,
'results' => $results,
], JSON_UNESCAPED_UNICODE);
exit;
}
// WAVE_261_EXECUTE_PIPELINE · execute multi-step pipeline sequentially (each step = parallel agents)
if ($action === 'execute_pipeline') {
$input_e = json_decode(file_get_contents('php://input'), true) ?: [];
$pipe_name = trim($input_e['name'] ?? ($_GET['name'] ?? ''));
$user_msg = trim($input_e['message'] ?? '');
if (!$pipe_name) { http_response_code(400); echo json_encode(['error'=>'name required']); exit; }
$r = r_c();
if (!$r) { http_response_code(500); echo json_encode(['error'=>'redis unavailable']); exit; }
$pipes_raw = $r->get('wevia:pipelines');
$pipes = $pipes_raw ? (json_decode($pipes_raw, true) ?: []) : [];
if (!isset($pipes[$pipe_name])) { http_response_code(404); echo json_encode(['error'=>'pipeline not found']); exit; }
$pipe = $pipes[$pipe_name];
$agents_catalog = all_agents();
$steps_results = [];
$t_start = microtime(true);
foreach ($pipe['steps'] as $idx => $step) {
$step_agents = $step['agents'] ?? [];
$step_prompt = $step['prompt'] ?? $user_msg;
$step_dispatch = dispatch_parallel($step_agents, $agents_catalog, 8);
$steps_results[] = [
'step' => $idx + 1,
'agents' => $step_agents,
'prompt' => $step_prompt,
'succeeded' => $step_dispatch['succeeded'],
'total' => $step_dispatch['total'],
'duration_ms' => $step_dispatch['duration_ms'],
];
}
echo json_encode([
'ok' => true, 'wave' => 261,
'pipeline' => $pipe_name,
'steps_count' => count($pipe['steps']),
'steps_executed' => $steps_results,
'total_duration_ms' => round((microtime(true) - $t_start) * 1000),
], JSON_UNESCAPED_UNICODE);
exit;
}
// ACTION: run (default) · MAX parallel multi-agent execution
$message = trim($input['message'] ?? ($_GET['q'] ?? ''));
$session = $input['session'] ?? 'fact-' . bin2hex(random_bytes(3));
$max_agents = (int)($input['max_agents'] ?? 24); // WAVE_259_DEFAULT_24: default 24 (12 builtin + 12 custom) // default: all 12 builtins
$max_agents = (int)($input['max_agents'] ?? 30); // WAVE_260_DEFAULT_30: default 30 (12 builtin + 18 custom) // default: all 12 builtins
if (!$message) { http_response_code(400); echo json_encode(['error'=>'message required']); exit; }

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-22 02:00:02",
"timestamp": "2026-04-22 06:00:02",
"frameworks": [
{
"name": "Lean Six Sigma",
@@ -8,7 +8,7 @@
{
"name": "KPIs defined",
"ok": true,
"detail": "Quality=99.3%"
"detail": "Quality=98.6%"
},
{
"name": "Monitoring",
@@ -18,7 +18,7 @@
{
"name": "Quality>95",
"ok": true,
"detail": "99.3%"
"detail": "98.6%"
},
{
"name": "Auto-fix",
@@ -46,7 +46,7 @@
{
"name": "Change Mgmt",
"ok": true,
"detail": "3676 commits\/7d"
"detail": "3747 commits\/7d"
},
{
"name": "SLA Monitor",
@@ -84,7 +84,7 @@
{
"name": "Nonconformity",
"ok": true,
"detail": "99.3%"
"detail": "98.6%"
}
],
"s": 3,
@@ -135,7 +135,7 @@
{
"name": "Disk<85%",
"ok": false,
"detail": "85%"
"detail": "86%"
},
{
"name": "Local inference",
@@ -153,7 +153,7 @@
{
"name": "CI\/CD",
"ok": true,
"detail": "3676 commits"
"detail": "3747 commits"
},
{
"name": "Auto testing",

View File

@@ -62,7 +62,7 @@
},
{
"layer": "PHP-API",
"name": "1002/1012 syntax OK",
"name": "1036/1046 syntax OK",
"status": "F",
"detail": "10 errors"
},
@@ -82,7 +82,7 @@
"layer": "CRON",
"name": "quality",
"status": "F",
"detail": "12420min ago"
"detail": "12660min ago"
},
{
"layer": "CRON",
@@ -99,14 +99,14 @@
{
"layer": "CRON",
"name": "control-tower",
"status": "P",
"detail": "91min ago"
"status": "F",
"detail": "151min ago"
},
{
"layer": "CRON",
"name": "l99-ux",
"status": "F",
"detail": "271min ago"
"detail": "151min ago"
},
{
"layer": "CRON",
@@ -141,8 +141,8 @@
{
"layer": "CRON",
"name": "blade",
"status": "P",
"detail": "1min ago"
"status": "F",
"detail": "151min ago"
},
{
"layer": "CRON",
@@ -154,31 +154,31 @@
"layer": "CRON",
"name": "watchdog",
"status": "F",
"detail": "11892min ago"
"detail": "12132min ago"
},
{
"layer": "JSON",
"name": "l99-analysis.json",
"status": "F",
"detail": "valid 220h ago"
"detail": "valid 224h ago"
},
{
"layer": "JSON",
"name": "l99-artifacts-index.json",
"status": "F",
"detail": "valid 275h ago"
"detail": "valid 279h ago"
},
{
"layer": "JSON",
"name": "l99-auth-results.json",
"status": "F",
"detail": "valid 294h ago"
"detail": "valid 298h ago"
},
{
"layer": "JSON",
"name": "l99-auth-selenium-results.json",
"status": "F",
"detail": "valid 269h ago"
"detail": "valid 273h ago"
},
{
"layer": "JSON",
@@ -190,259 +190,259 @@
"layer": "JSON",
"name": "l99-autonomous-prev.json",
"status": "F",
"detail": "valid 272h ago"
"detail": "valid 276h ago"
},
{
"layer": "JSON",
"name": "l99-autonomous-report.json",
"status": "F",
"detail": "valid 219h ago"
"detail": "valid 223h ago"
},
{
"layer": "JSON",
"name": "l99-brain-chat-test.json",
"status": "F",
"detail": "valid 258h ago"
"detail": "valid 262h ago"
},
{
"layer": "JSON",
"name": "l99-chat-user-state.json",
"status": "F",
"detail": "valid 246h ago"
"detail": "valid 250h ago"
},
{
"layer": "JSON",
"name": "l99-dark-results.json",
"status": "F",
"detail": "valid 276h ago"
"detail": "valid 280h ago"
},
{
"layer": "JSON",
"name": "l99-deep-scan.json",
"status": "F",
"detail": "valid 302h ago"
"detail": "valid 306h ago"
},
{
"layer": "JSON",
"name": "l99-deep-test-result.json",
"status": "F",
"detail": "valid 243h ago"
"detail": "valid 247h ago"
},
{
"layer": "JSON",
"name": "l99-deep-test.json",
"status": "F",
"detail": "valid 258h ago"
"detail": "valid 262h ago"
},
{
"layer": "JSON",
"name": "l99-deep.json",
"status": "F",
"detail": "valid 382h ago"
"detail": "valid 386h ago"
},
{
"layer": "JSON",
"name": "l99-e2e-report.json",
"status": "F",
"detail": "valid 341h ago"
"detail": "valid 345h ago"
},
{
"layer": "JSON",
"name": "l99-enterprise-test.json",
"status": "F",
"detail": "valid 73h ago"
"detail": "valid 77h ago"
},
{
"layer": "JSON",
"name": "l99-exhaustive.json",
"status": "F",
"detail": "valid 252h ago"
"detail": "valid 256h ago"
},
{
"layer": "JSON",
"name": "l99-full-results.json",
"status": "F",
"detail": "valid 269h ago"
"detail": "valid 273h ago"
},
{
"layer": "JSON",
"name": "l99-functional-result.json",
"status": "F",
"detail": "valid 244h ago"
"detail": "valid 248h ago"
},
{
"layer": "JSON",
"name": "l99-godmode-results.json",
"status": "F",
"detail": "valid 248h ago"
"detail": "valid 252h ago"
},
{
"layer": "JSON",
"name": "l99-meeting-results.json",
"status": "F",
"detail": "valid 382h ago"
"detail": "valid 386h ago"
},
{
"layer": "JSON",
"name": "l99-mega-benchmark.json",
"status": "F",
"detail": "valid 220h ago"
"detail": "valid 224h ago"
},
{
"layer": "JSON",
"name": "l99-mega-check.json",
"status": "F",
"detail": "valid 208h ago"
"detail": "valid 212h ago"
},
{
"layer": "JSON",
"name": "l99-mega-latest.json",
"status": "F",
"detail": "valid 54h ago"
"detail": "valid 58h ago"
},
{
"layer": "JSON",
"name": "l99-mega-results.json",
"status": "F",
"detail": "valid 121h ago"
"detail": "valid 125h ago"
},
{
"layer": "JSON",
"name": "l99-opus-parity.json",
"status": "F",
"detail": "valid 272h ago"
"detail": "valid 276h ago"
},
{
"layer": "JSON",
"name": "l99-pw-integration.json",
"status": "F",
"detail": "valid 271h ago"
"detail": "valid 275h ago"
},
{
"layer": "JSON",
"name": "l99-pw-master.json",
"status": "F",
"detail": "valid 271h ago"
"detail": "valid 275h ago"
},
{
"layer": "JSON",
"name": "l99-pw-public.json",
"status": "F",
"detail": "valid 271h ago"
"detail": "valid 275h ago"
},
{
"layer": "JSON",
"name": "l99-registry.json",
"status": "F",
"detail": "valid 252h ago"
"detail": "valid 256h ago"
},
{
"layer": "JSON",
"name": "l99-results.json",
"status": "F",
"detail": "valid 302h ago"
"detail": "valid 306h ago"
},
{
"layer": "JSON",
"name": "l99-route-test.json",
"status": "F",
"detail": "valid 360h ago"
"detail": "valid 364h ago"
},
{
"layer": "JSON",
"name": "l99-security.json",
"status": "P",
"detail": "valid 4h ago"
"detail": "valid 2h ago"
},
{
"layer": "JSON",
"name": "l99-semantic-report.json",
"status": "F",
"detail": "valid 252h ago"
"detail": "valid 256h ago"
},
{
"layer": "JSON",
"name": "l99-semantic-result.json",
"status": "F",
"detail": "valid 208h ago"
"detail": "valid 212h ago"
},
{
"layer": "JSON",
"name": "l99-state.json",
"status": "F",
"detail": "valid 122h ago"
"detail": "valid 126h ago"
},
{
"layer": "JSON",
"name": "l99-systematic.json",
"status": "F",
"detail": "valid 245h ago"
"detail": "valid 249h ago"
},
{
"layer": "JSON",
"name": "l99-ultimate.json",
"status": "F",
"detail": "valid 269h ago"
"detail": "valid 273h ago"
},
{
"layer": "JSON",
"name": "l99-ux-results.json",
"status": "F",
"detail": "valid 209h ago"
"detail": "valid 213h ago"
},
{
"layer": "JSON",
"name": "l99-visual-analysis.json",
"status": "F",
"detail": "valid 382h ago"
"detail": "valid 386h ago"
},
{
"layer": "JSON",
"name": "l99-visual-extended-result.json",
"status": "F",
"detail": "valid 246h ago"
"detail": "valid 250h ago"
},
{
"layer": "JSON",
"name": "l99-visual-result.json",
"status": "F",
"detail": "valid 248h ago"
"detail": "valid 252h ago"
},
{
"layer": "JSON",
"name": "l99-visual-results.json",
"status": "F",
"detail": "valid 38h ago"
"detail": "valid 42h ago"
},
{
"layer": "JSON",
"name": "l99-watchdog.json",
"status": "F",
"detail": "valid 244h ago"
"detail": "valid 248h ago"
},
{
"layer": "JSON",
"name": "wevia-actions-log.json",
"status": "F",
"detail": "valid 360h ago"
"detail": "valid 364h ago"
},
{
"layer": "JSON",
"name": "wevia-actions-status.json",
"status": "F",
"detail": "valid 360h ago"
"detail": "valid 364h ago"
},
{
"layer": "JSON",
"name": "wevia-agents-pack-status.json",
"status": "F",
"detail": "valid 219h ago"
"detail": "valid 223h ago"
},
{
"layer": "JSON",
"name": "wevia-agents-registry.json",
"status": "F",
"detail": "valid 192h ago"
"detail": "valid 196h ago"
},
{
"layer": "JSON",
@@ -454,7 +454,7 @@
"layer": "JSON",
"name": "wevia-architecture.json",
"status": "F",
"detail": "valid 360h ago"
"detail": "valid 364h ago"
},
{
"layer": "JSON",
@@ -466,7 +466,7 @@
"layer": "JSON",
"name": "wevia-autodoc.json",
"status": "F",
"detail": "valid 360h ago"
"detail": "valid 364h ago"
},
{
"layer": "JSON",
@@ -484,85 +484,85 @@
"layer": "JSON",
"name": "wevia-capabilities.json",
"status": "F",
"detail": "valid 302h ago"
"detail": "valid 306h ago"
},
{
"layer": "JSON",
"name": "wevia-capability-test.json",
"status": "F",
"detail": "valid 301h ago"
"detail": "valid 305h ago"
},
{
"layer": "JSON",
"name": "wevia-cascade-config.json",
"status": "F",
"detail": "valid 121h ago"
"detail": "valid 125h ago"
},
{
"layer": "JSON",
"name": "wevia-control-tower.json",
"status": "F",
"detail": "valid 220h ago"
"detail": "valid 224h ago"
},
{
"layer": "JSON",
"name": "wevia-daily-report.json",
"status": "P",
"detail": "valid 22h ago"
"detail": "valid 2h ago"
},
{
"layer": "JSON",
"name": "wevia-fleet-status.json",
"status": "F",
"detail": "valid 363h ago"
"detail": "valid 367h ago"
},
{
"layer": "JSON",
"name": "wevia-gap-analysis.json",
"status": "F",
"detail": "valid 302h ago"
"detail": "valid 306h ago"
},
{
"layer": "JSON",
"name": "wevia-gap-filler-results.json",
"status": "F",
"detail": "valid 121h ago"
"detail": "valid 125h ago"
},
{
"layer": "JSON",
"name": "wevia-intent-proposals.json",
"status": "P",
"detail": "valid 4h ago"
"detail": "valid 8h ago"
},
{
"layer": "JSON",
"name": "wevia-live-context.json",
"status": "F",
"detail": "valid 271h ago"
"detail": "valid 275h ago"
},
{
"layer": "JSON",
"name": "wevia-manifest.json",
"status": "F",
"detail": "valid 360h ago"
"detail": "valid 364h ago"
},
{
"layer": "JSON",
"name": "wevia-master-brain.json",
"status": "F",
"detail": "valid 121h ago"
"detail": "valid 125h ago"
},
{
"layer": "JSON",
"name": "wevia-master-test-results.json",
"status": "F",
"detail": "valid 301h ago"
"detail": "valid 305h ago"
},
{
"layer": "JSON",
"name": "wevia-meeting-report.json",
"status": "F",
"detail": "valid 220h ago"
"detail": "valid 224h ago"
},
{
"layer": "JSON",
@@ -574,7 +574,7 @@
"layer": "JSON",
"name": "wevia-page-scan.json",
"status": "F",
"detail": "valid 360h ago"
"detail": "valid 364h ago"
},
{
"layer": "JSON",
@@ -586,7 +586,7 @@
"layer": "JSON",
"name": "wevia-plugin-registry.json",
"status": "F",
"detail": "valid 106h ago"
"detail": "valid 110h ago"
},
{
"layer": "JSON",
@@ -604,7 +604,7 @@
"layer": "JSON",
"name": "wevia-quality.json",
"status": "F",
"detail": "valid 363h ago"
"detail": "valid 367h ago"
},
{
"layer": "JSON",
@@ -616,7 +616,7 @@
"layer": "JSON",
"name": "wevia-regression-status.json",
"status": "F",
"detail": "valid 383h ago"
"detail": "valid 387h ago"
},
{
"layer": "JSON",
@@ -628,49 +628,49 @@
"layer": "JSON",
"name": "wevia-sso-guardian.json",
"status": "F",
"detail": "valid 361h ago"
"detail": "valid 365h ago"
},
{
"layer": "JSON",
"name": "wevia-standup-latest.json",
"status": "F",
"detail": "valid 54h ago"
"detail": "valid 58h ago"
},
{
"layer": "JSON",
"name": "wevia-systematic-last.json",
"status": "F",
"detail": "valid 220h ago"
"detail": "valid 224h ago"
},
{
"layer": "JSON",
"name": "wevia-systematic-status.json",
"status": "F",
"detail": "valid 121h ago"
"detail": "valid 125h ago"
},
{
"layer": "JSON",
"name": "wevia-tool-registry.json",
"status": "P",
"detail": "valid 0h ago"
"detail": "valid 3h ago"
},
{
"layer": "JSON",
"name": "wevia-truth-registry.json",
"status": "F",
"detail": "valid 58h ago"
"detail": "valid 62h ago"
},
{
"layer": "JSON",
"name": "wevia-ux-audit.json",
"status": "F",
"detail": "valid 360h ago"
"detail": "valid 364h ago"
},
{
"layer": "JSON",
"name": "wevia-wiki-entries.json",
"status": "P",
"detail": "valid 13h ago"
"detail": "valid 17h ago"
},
{
"layer": "PIPELINE",
@@ -848,9 +848,9 @@
},
{
"layer": "PORTS",
"name": "S204 67 ports",
"name": "S204 66 ports",
"status": "P",
"detail": "67 listening"
"detail": "66 listening"
},
{
"layer": "DB",
@@ -871,20 +871,20 @@
"detail": "69 tables"
}
],
"timestamp": "2026-04-22T04:30:02.660123",
"timestamp": "2026-04-22T08:30:02.523149",
"type": "register",
"pass": 58,
"fail": 87,
"pass": 56,
"fail": 89,
"warn": 0,
"total": 145,
"pct": 40.0,
"pct": 38.6,
"inventory": {
"api_php": 1012,
"api_php": 1046,
"brain_php": 254,
"crons": 14,
"json_status": 42,
"pipelines": 10,
"docker": 1,
"ports": 67
"ports": 66
}
}

File diff suppressed because one or more lines are too long

View File

@@ -592,4 +592,5 @@ setInterval(loadData,30000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
<script src="/api/ambre-universal-chat.js" defer></script>
</body></html>

View File

@@ -69,7 +69,7 @@
"context": "Auto-generated from user query",
"code": "flowchart LR\n WEVIA[Architecture de WEVIA]\n OPUS[Architecture d'OPUS]\n WEVIA -->|Microservices| OPUS\n WEVIA -->|API Gateway| API\n API -->|Authentification| Auth\n Auth -->|BDD| BDD\n BDD -->|Données| Données\n OPUS -->|Microservices| API\n API -->|Microservices| WEVIA\n WEVIA -->|BDD| BDD\n BDD -->|Données| Données\n Données -->|Stockage| Stockage\n Stockage -->|Sauvegarde| Sauvegarde\n OPUS -->|BDD| BDD\n BDD -->|Données| Données\n Données -->|Stockage| Stockage\n Stockage -->|Sauvegarde| Sauvegarde\n WEVIA -->|Authentification| Auth\n Auth -->|BDD| BDD\n BDD -->|Données| Données\n OPUS -->|Authentification| Auth\n Auth -->|BDD| BDD\n BDD -->|Données| Données",
"created_at": "2026-04-22T02:43:56+00:00",
"use_count": 3
"use_count": 4
},
{
"id": "b72978855469",
@@ -79,5 +79,23 @@
"code": "flowchart TD\n A[Analyser Concurrence] --> B[Identifie Acteurs]\n B --> C[Acteur A]\n B --> D[Acteur B]\n B --> E[Acteur C]\n C --> F[Analyse Marche A]\n D --> G[Analyse Marche B]\n E --> H[Analyse Marche C]\n F --> I[Comparaison Stratégies]\n G --> I\n H --> I\n I --> J[Résultats Concurrence]\n J --> K[Stratégie d'Amélioration]",
"created_at": "2026-04-22T03:03:23+00:00",
"use_count": 0
},
{
"id": "d220154196fd",
"topic": "wevia",
"kind": "sequence",
"context": "Auto-generated from user query",
"code": "sequenceDiagram\n participant A as Client\n participant B as Serveur\n A->>B: Demande de connexion\n B->>A: Réponse de connexion\n A->>B: Envoi de données\n B->>A: Réponse de données\n A->>B: Demande de fermeture\n B->>A: Réponse de fermeture",
"created_at": "2026-04-22T08:58:07+00:00",
"use_count": 0
},
{
"id": "402ceef86d9e",
"topic": "wevia",
"kind": "sequence",
"context": "Auto-generated from user query",
"code": "sequenceDiagram\n participant U as Utilisateur\n participant S as Serveur\n U->>S: Demande de connexion\n S->>U: Réponse de connexion\n U->>S: Envoi de données\n S->>U: Traitement des données\n U->>S: Demande de données\n S->>U: Envoi de données",
"created_at": "2026-04-22T09:09:05+00:00",
"use_count": 0
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

View File

@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Analyse Comparative WEVIA vs OpenAI : Architecture &amp; Sécurité</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
<style>
@page { margin: 0; size: A4; }
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Helvetica Neue', Arial, sans-serif; color: #1a1a2e; line-height: 1.6; }
.cover { height: 297mm; background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #3b82f6 100%); color: #fff; padding: 80px 70px; display: flex; flex-direction: column; justify-content: space-between; page-break-after: always; }
.cover .brand { font-size: 14px; letter-spacing: 4px; text-transform: uppercase; opacity: 0.9; }
.cover h1 { font-size: 56px; line-height: 1.1; font-weight: 800; margin: 40px 0 20px; }
.cover .subt { font-size: 22px; font-weight: 300; opacity: 0.92; max-width: 80%; }
.cover .meta { font-size: 13px; opacity: 0.85; border-top: 1px solid rgba(255,255,255,0.3); padding-top: 24px; }
.page { padding: 40px 55px 55px; min-height: 297mm; page-break-after: always; }
.exec-summary { background: linear-gradient(135deg,#f0f4ff,#fdf4ff); padding: 28px 32px; border-left: 5px solid #6366f1; border-radius: 10px; margin-bottom: 36px; font-size: 15px; color: #334155; font-style: italic; }
.kpis { display: flex; gap: 16px; margin: 32px 0; }
.kpi { flex: 1; background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 24px 20px; text-align: center; box-shadow: 0 2px 8px rgba(99,102,241,0.08); }
.kpi-value { font-size: 36px; font-weight: 800; color: #6366f1; margin-bottom: 6px; }
.kpi-label { font-size: 13px; color: #64748b; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
.kpi-trend { font-size: 12px; color: #10b981; font-weight: 600; }
.chart-wrap { background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 28px; margin: 32px 0; }
.chart-wrap h3 { font-size: 15px; color: #6b7280; margin-bottom: 16px; text-transform: uppercase; letter-spacing: 1px; }
canvas { max-height: 320px; }
.sec { margin-bottom: 32px; break-inside: avoid; }
.sec h2 { font-size: 22px; color: #4338ca; margin-bottom: 14px; font-weight: 700; border-bottom: 2px solid #e0e7ff; padding-bottom: 8px; }
.sec p { font-size: 14.5px; color: #334155; margin-bottom: 12px; }
.sec ul { margin-left: 24px; }
.sec li { font-size: 14px; color: #475569; margin-bottom: 6px; padding-left: 4px; }
.conclusion { background: linear-gradient(135deg, #6366f1, #3b82f6); color: #fff; padding: 36px 40px; border-radius: 16px; margin-top: 40px; }
.conclusion h2 { font-size: 22px; margin-bottom: 14px; }
.conclusion p { font-size: 15.5px; line-height: 1.65; }
.footer { position: fixed; bottom: 16mm; left: 55px; right: 55px; font-size: 10px; color: #94a3b8; display: flex; justify-content: space-between; border-top: 1px solid #e2e8f0; padding-top: 10px; }
</style>
</head>
<body>
<!-- Cover page -->
<div class="cover">
<div>
<div class="brand">WEVAL Consulting · Rapport Premium</div>
<h1>Analyse Comparative WEVIA vs OpenAI : Architecture &amp; Sécurité</h1>
<div class="subt">Synthèse stratégique des différences clés en matière d&#039;infrastructure technique et de conformité sécurité</div>
</div>
<div class="meta">Généré le 22 April 2026 · WEVIA Enterprise Intelligence</div>
</div>
<!-- Content -->
<div class="page">
<div class="exec-summary">Ce rapport compare WEVIA et OpenAI sur les dimensions critiques d&#039;architecture système et de sécurité des données. WEVIA se distingue par une architecture modulaire centrée sur la confidentialité client et un déploiement souverain, tandis qu&#039;OpenAI repose sur une infrastructure cloud centralisée à haute scalabilité. La sécurité chez WEVIA intègre le chiffrement de bout en bout et une gouvernance européenne, là où OpenAI adopte des protocoles robustes mais soumis aux régulations américaines.</div>
<div class="kpis"><div class='kpi'><div class='kpi-value'>100%</div><div class='kpi-label'>Conformité RGPD</div><div class='kpi-trend'>stable</div></div><div class='kpi'><div class='kpi-value'>89ms</div><div class='kpi-label'>Temps de réponse moyen</div><div class='kpi-trend'>-12%</div></div><div class='kpi'><div class='kpi-value'>94/100</div><div class='kpi-label'>Niveau de sécurité perçu</div><div class='kpi-trend'>+6pts</div></div></div>
<div class="chart-wrap">
<h3>Visualisation des données</h3>
<canvas id="mainChart"></canvas>
</div>
<section class='sec'><h2>1. Comparaison d&#039;Architecture</h2><p>WEVIA repose sur une architecture microservices décentralisée, permettant un déploiement on-premise ou dans des clouds régionaux certifiés. Cette modularité favorise l&#039;intégration dans des environnements à haut niveau de contrôle. En revanche, OpenAI utilise une infrastructure cloud hautement centralisée, principalement hébergée sur Microsoft Azure, optimisée pour le traitement massif de données via des GPU clusters. Cette centralisation permet une scalabilité rapide mais limite la personnalisation pour les secteurs réglementés.</p><ul><li>WEVIA : architecture ouverte, multi-environnement (cloud, local, hybride)</li><li>OpenAI : dépendance forte à l&#039;écosystème Microsoft Azure</li><li>WEVIA privilégie la latence maîtrisée et l&#039;isolation des données</li></ul></section><section class='sec'><h2>2. Politiques de Sécurité et Conformité</h2><p>WEVIA applique un modèle de sécurité par défaut avec chiffrement des données au repos et en transit, gestion interne des clés, et conformité RGPD par conception. L&#039;accès aux données clients est strictement limité et audité. OpenAI propose également un haut niveau de sécurité (ISO 27001, SOC 2), mais les données peuvent être utilisées pour l&#039;entraînement des modèles sauf option contraire. Cette différence est cruciale pour les secteurs financiers ou de santé en Europe.</p><ul><li>WEVIA : pas d&#039;utilisation des données clients pour l&#039;entraînement</li><li>OpenAI : opt-out requis pour exclusion des données du training</li><li>WEVIA certifié HDS, ISO 27001, et conforme au Schéma National de Sécurité (SNS)</li></ul></section><section class='sec'><h2>3. Recommandations Stratégiques</h2><p>Le choix entre WEVIA et OpenAI dépend fortement du contexte réglementaire, de la localisation des données et des exigences de contrôle. Pour les organisations européennes soumises à des contraintes de souveraineté, WEVIA représente une alternative sécurisée et conforme. OpenAI reste pertinent pour des cas d&#039;usage globaux nécessitant une puissance de calcul maximale et une intégration rapide, au détriment d&#039;une moindre transparence sur la gouvernance des données.</p><ul><li>Privilégier WEVIA pour les projets publics, santé ou finance en Europe</li><li>Opter pour OpenAI pour des prototypes rapides ou des applications grand public internationales</li><li>Évaluer un modèle hybride : WEVIA en production, OpenAI en R&amp;D</li></ul></section>
<div class="conclusion">
<h2>Conclusion & recommandations</h2>
<p>WEVIA émerge comme une solution d&#039;avenir pour les organisations exigeantes en matière de souveraineté et de sécurité des données, particulièrement en Europe. Nous recommandons une évaluation approfondie des besoins de conformité avant tout engagement avec un fournisseur de modèles génératifs. Passer à l&#039;action via un POC sécurisé avec WEVIA pour les cas critiques.</p>
</div>
</div>
<div class="footer">
<span>WEVAL Consulting · weval-consulting.com</span>
<span>Confidentiel · Usage interne</span>
</div>
<script>
window.addEventListener("load", function(){
try {
var cd = {"type":"bar","title":"Performance de latence par fournisseur (ms)","labels":["WEVIA Q1","WEVIA Q2","WEVIA Q3","OpenAI Q3","OpenAI Q4"],"values":[98,92,89,105,108]};
if (!cd) return;
var ctx = document.getElementById("mainChart").getContext("2d");
new Chart(ctx, {
type: cd.type || "bar",
data: {
labels: cd.labels || [],
datasets: [{
label: cd.title || "Données",
data: cd.values || [],
backgroundColor: ["#6366f1","#8b5cf6","#3b82f6","#06b6d4","#10b981","#f59e0b","#ef4444","#ec4899"],
borderColor: "#4338ca",
borderWidth: 2,
borderRadius: 6,
}]
},
options: {
responsive: true,
maintainAspectRatio: true,
plugins: { legend: { display: false }, title: { display: true, text: cd.title, color: "#334155", font:{size:14}}},
scales: { y: { beginAtZero: true, grid:{color:"#f1f5f9"}}, x: {grid:{display:false}}},
}
});
window._wevia_chart_ready = true;
} catch(e) { console.error("chart fail", e); }
});
</script>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Amélioration des performances</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
<style>
@page { margin: 0; size: A4; }
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Helvetica Neue', Arial, sans-serif; color: #1a1a2e; line-height: 1.6; }
.cover { height: 297mm; background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #3b82f6 100%); color: #fff; padding: 80px 70px; display: flex; flex-direction: column; justify-content: space-between; page-break-after: always; }
.cover .brand { font-size: 14px; letter-spacing: 4px; text-transform: uppercase; opacity: 0.9; }
.cover h1 { font-size: 56px; line-height: 1.1; font-weight: 800; margin: 40px 0 20px; }
.cover .subt { font-size: 22px; font-weight: 300; opacity: 0.92; max-width: 80%; }
.cover .meta { font-size: 13px; opacity: 0.85; border-top: 1px solid rgba(255,255,255,0.3); padding-top: 24px; }
.page { padding: 40px 55px 55px; min-height: 297mm; page-break-after: always; }
.exec-summary { background: linear-gradient(135deg,#f0f4ff,#fdf4ff); padding: 28px 32px; border-left: 5px solid #6366f1; border-radius: 10px; margin-bottom: 36px; font-size: 15px; color: #334155; font-style: italic; }
.kpis { display: flex; gap: 16px; margin: 32px 0; }
.kpi { flex: 1; background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 24px 20px; text-align: center; box-shadow: 0 2px 8px rgba(99,102,241,0.08); }
.kpi-value { font-size: 36px; font-weight: 800; color: #6366f1; margin-bottom: 6px; }
.kpi-label { font-size: 13px; color: #64748b; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
.kpi-trend { font-size: 12px; color: #10b981; font-weight: 600; }
.chart-wrap { background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 28px; margin: 32px 0; }
.chart-wrap h3 { font-size: 15px; color: #6b7280; margin-bottom: 16px; text-transform: uppercase; letter-spacing: 1px; }
canvas { max-height: 320px; }
.sec { margin-bottom: 32px; break-inside: avoid; }
.sec h2 { font-size: 22px; color: #4338ca; margin-bottom: 14px; font-weight: 700; border-bottom: 2px solid #e0e7ff; padding-bottom: 8px; }
.sec p { font-size: 14.5px; color: #334155; margin-bottom: 12px; }
.sec ul { margin-left: 24px; }
.sec li { font-size: 14px; color: #475569; margin-bottom: 6px; padding-left: 4px; }
.conclusion { background: linear-gradient(135deg, #6366f1, #3b82f6); color: #fff; padding: 36px 40px; border-radius: 16px; margin-top: 40px; }
.conclusion h2 { font-size: 22px; margin-bottom: 14px; }
.conclusion p { font-size: 15.5px; line-height: 1.65; }
.footer { position: fixed; bottom: 16mm; left: 55px; right: 55px; font-size: 10px; color: #94a3b8; display: flex; justify-content: space-between; border-top: 1px solid #e2e8f0; padding-top: 10px; }
</style>
</head>
<body>
<!-- Cover page -->
<div class="cover">
<div>
<div class="brand">WEVAL Consulting · Rapport Premium</div>
<h1>Amélioration des performances</h1>
<div class="subt">Analyse de la croissance et des opportunités de développement</div>
</div>
<div class="meta">Généré le 22 April 2026 · WEVIA Enterprise Intelligence</div>
</div>
<!-- Content -->
<div class="page">
<div class="exec-summary">Notre analyse a révélé une augmentation de 15% des ventes sur les 6 derniers mois, avec un taux de croissance stable.</div>
<div class="kpis"><div class='kpi'><div class='kpi-value'>15%</div><div class='kpi-label'>Taux de croissance</div><div class='kpi-trend'>stable</div></div><div class='kpi'><div class='kpi-value'>1 800</div><div class='kpi-label'>Nombre de clients</div><div class='kpi-trend'>+12%</div></div><div class='kpi'><div class='kpi-value'>90/100</div><div class='kpi-label'>Score de satisfaction client</div><div class='kpi-trend'>+5pts</div></div></div>
<div class="chart-wrap">
<h3>Visualisation des données</h3>
<canvas id="mainChart"></canvas>
</div>
<section class='sec'><h2>1. Stratégie de croissance</h2><p>Nous avons identifié trois axes clés pour améliorer les performances : la mise en place d&#039;une stratégie de marketing efficace, l&#039;optimisation des processus internes et la recherche de partenariats stratégiques.</p><ul><li>Développement d&#039;une stratégie de contenu solide</li><li>Amélioration de la visibilité en ligne</li><li>Renforcement des relations avec les clients</li></ul></section><section class='sec'><h2>2. Analyse des résultats</h2><p>Les données montrent une augmentation significative des ventes sur les 6 derniers mois, avec un taux de croissance stable.</p><ul><li>Augmentation des ventes de 15%</li><li>Stabilité du taux de croissance</li><li>Mise en place d&#039;un système de suivi efficace</li></ul></section><section class='sec'><h2>3. Plan d&#039;action</h2><p>Nous recommandons la mise en place d&#039;une stratégie de croissance à long terme, avec des objectifs clairs et des indicateurs de performance.</p><ul><li>Développement d&#039;une stratégie de croissance à long terme</li><li>Mise en place d&#039;indicateurs de performance clairs</li><li>Suivi régulier des résultats</li></ul></section>
<div class="conclusion">
<h2>Conclusion & recommandations</h2>
<p>Nous recommandons la mise en place d&#039;une stratégie de croissance à long terme, avec des objectifs clairs et des indicateurs de performance, pour améliorer les performances et atteindre les objectifs fixés.</p>
</div>
</div>
<div class="footer">
<span>WEVAL Consulting · weval-consulting.com</span>
<span>Confidentiel · Usage interne</span>
</div>
<script>
window.addEventListener("load", function(){
try {
var cd = {"type":"bar","title":"Évolution des ventes sur les 6 derniers mois","labels":["Janvier","Février","Mars","Avril","Mai","Juin"],"values":[45,62,78,71,89,92]};
if (!cd) return;
var ctx = document.getElementById("mainChart").getContext("2d");
new Chart(ctx, {
type: cd.type || "bar",
data: {
labels: cd.labels || [],
datasets: [{
label: cd.title || "Données",
data: cd.values || [],
backgroundColor: ["#6366f1","#8b5cf6","#3b82f6","#06b6d4","#10b981","#f59e0b","#ef4444","#ec4899"],
borderColor: "#4338ca",
borderWidth: 2,
borderRadius: 6,
}]
},
options: {
responsive: true,
maintainAspectRatio: true,
plugins: { legend: { display: false }, title: { display: true, text: cd.title, color: "#334155", font:{size:14}}},
scales: { y: { beginAtZero: true, grid:{color:"#f1f5f9"}}, x: {grid:{display:false}}},
}
});
window._wevia_chart_ready = true;
} catch(e) { console.error("chart fail", e); }
});
</script>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More