From 7b6a928c6d69636bead42e01fb659376f5b49ea4 Mon Sep 17 00:00:00 2001 From: opus Date: Mon, 20 Apr 2026 02:35:02 +0200 Subject: [PATCH] auto-sync-0235 --- api/agent-disk-monitor.json | 6 +- api/agent-escalation.json | 2 +- api/agent-leads-sync.json | 2 +- api/agent-risk-monitor.json | 10 +- api/architecture-scan.json | 1956 +++++++++++++++++ api/blade-actions-surfaced.json | 8 +- api/handlers/resend-playwright-create-key.py | 186 ++ api/handlers/resend-playwright-wrapper.sh | 3 + api/handlers/set-resend-password.sh | 25 + api/mql-scoring-status.json | 2 +- api/ux-agent-report.json | 4 +- api/v83-business-kpi-latest.json | 2 +- api/wave-wiring-queue.json | 26 + .../intent-opus4-resend_playwright_create.php | 15 + .../intent-opus4-set_resend_password.php | 15 + 15 files changed, 2244 insertions(+), 18 deletions(-) create mode 100755 api/handlers/resend-playwright-create-key.py create mode 100755 api/handlers/resend-playwright-wrapper.sh create mode 100755 api/handlers/set-resend-password.sh create mode 100644 api/wired-pending/intent-opus4-resend_playwright_create.php create mode 100644 api/wired-pending/intent-opus4-set_resend_password.php diff --git a/api/agent-disk-monitor.json b/api/agent-disk-monitor.json index 3947be1f3..44992b32c 100644 --- a/api/agent-disk-monitor.json +++ b/api/agent-disk-monitor.json @@ -1,10 +1,10 @@ { "agent": "V41_Disk_Monitor", - "ts": "2026-04-20T02:00:01+02:00", + "ts": "2026-04-20T02:30:01+02:00", "disk_pct": 80, - "disk_free_gb": 29, + "disk_free_gb": 30, "growth_per_day_gb": 1.5, - "runway_days": 19, + "runway_days": 20, "alert": "WARN_runway_under_30d", "action_auto_if_under_7d": "trigger_hetzner_volume_extension_api", "hetzner_volume_size_gb_recommended": 500, diff --git a/api/agent-escalation.json b/api/agent-escalation.json index 86ab7e44c..52bd2870f 100644 --- a/api/agent-escalation.json +++ b/api/agent-escalation.json @@ -1,6 +1,6 @@ { "agent": "V41_Risk_Escalation", - "ts": "2026-04-20T02:15:03+02:00", + "ts": "2026-04-20T02:30:02+02:00", "dg_alerts_active": 7, "wevia_life_stats_preview": "File not found.", "escalation_rules": { diff --git a/api/agent-leads-sync.json b/api/agent-leads-sync.json index 6c0d22f51..4cb6fd8ba 100644 --- a/api/agent-leads-sync.json +++ b/api/agent-leads-sync.json @@ -1,6 +1,6 @@ { "agent": "V45_Leads_Sync", - "ts": "2026-04-20T02:20:02+02:00", + "ts": "2026-04-20T02:30:02+02:00", "paperclip_total": 48, "active_customer": 4, "warm_prospect": 5, diff --git a/api/agent-risk-monitor.json b/api/agent-risk-monitor.json index b8a93f809..e769eb31b 100644 --- a/api/agent-risk-monitor.json +++ b/api/agent-risk-monitor.json @@ -1,11 +1,11 @@ { "agent": "V54_Risk_Monitor_Live", - "ts": "2026-04-20T02:00:03+02:00", + "ts": "2026-04-20T02:30:02+02:00", "critical_risks": { "RW01_pipeline_vide": { "pipeline_keur": 180, - "mql_auto": 0, - "residual_risk_pct": 10, + "mql_auto": 20, + "residual_risk_pct": 0, "trend": "mitigation_V42_V45_active" }, "RW02_dependance_ethica": { @@ -21,8 +21,8 @@ "trend": "Ethica_renewal_Q1_critical" }, "RW12_burnout": { - "agents_cron_active": 14, - "load_5min": "4.85", + "agents_cron_active": 15, + "load_5min": "4.65", "automation_coverage_pct": 70, "residual_risk_pct": 60, "trend": "V52_goldratt_options_active" diff --git a/api/architecture-scan.json b/api/architecture-scan.json index e69de29bb..2af9f2d21 100644 --- a/api/architecture-scan.json +++ b/api/architecture-scan.json @@ -0,0 +1,1956 @@ +{ + "generated": "2026-04-20 00:30:01", + "version": "1.0", + "servers": [ + { + "id": "S204", + "ip": "204.168.152.13", + "private": "10.1.0.2", + "role": "PRIMARY", + "ssh": 49222, + "disk_pct": 80, + "disk_avail": "30G", + "uptime": "up 5 days, 14 hours, 38 minutes", + "nginx": "active", + "php_fpm": "active", + "php_version": "8.5.5" + }, + { + "id": "S95", + "ip": "95.216.167.89", + "private": "10.1.0.3", + "role": "WEVADS Arsenal", + "ssh": 22, + "disk_pct": 89, + "disk_avail": "16G", + "sentinel": 1 + }, + { + "id": "S151", + "ip": "151.80.235.110", + "private": null, + "role": "DR\/Tracking OVH", + "ssh": 22 + } + ], + "docker": [ + { + "name": "loki", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "listmonk", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "plausible-plausible-1", + "status": "Up 2 days", + "ports": "" + }, + { + "name": "plausible-plausible-db-1", + "status": "Up 2 days", + "ports": "" + }, + { + "name": "plausible-plausible-events-db-1", + "status": "Up 2 days", + "ports": "" + }, + { + "name": "n8n-docker-n8n-1", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "mattermost-docker-mm-db-1", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "mattermost-docker-mattermost-1", + "status": "Up 3 days (healthy)", + "ports": "" + }, + { + "name": "twenty", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "twenty-redis", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "langfuse", + "status": "Up 4 days", + "ports": "" + }, + { + "name": "redis-weval", + "status": "Up 5 days", + "ports": "" + }, + { + "name": "gitea", + "status": "Up 5 days", + "ports": "" + }, + { + "name": "node-exporter", + "status": "Up 5 days", + "ports": "" + }, + { + "name": "prometheus", + "status": "Up 5 days", + "ports": "" + }, + { + "name": "searxng", + "status": "Up 5 days", + "ports": "" + }, + { + "name": "uptime-kuma", + "status": "Up 22 minutes (healthy)", + "ports": "" + }, + { + "name": "vaultwarden", + "status": "Up 5 days (healthy)", + "ports": "" + }, + { + "name": "qdrant", + "status": "Up 5 days", + "ports": "" + } + ], + "domains": [ + { + "file": "analytics.weval-consulting.com", + "server_names": [ + "analytics.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "code-weval", + "server_names": [ + "code.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "crm.weval-consulting.com", + "server_names": [ + "crm.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "ethica", + "server_names": [ + "ethica.wevup.app", + "consent.wevup.app" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "git.weval-consulting.com", + "server_names": [ + "git.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "langfuse.weval-consulting.com", + "server_names": [ + "langfuse.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "mirofish.weval-consulting.com", + "server_names": [ + "mirofish.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "mm.weval-consulting.com", + "server_names": [ + "mm.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "monitor.weval-consulting.com", + "server_names": [ + "monitor.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "n8n.weval-consulting.com", + "server_names": [ + "n8n.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "paperclip.weval-consulting.com", + "server_names": [ + "paperclip.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "wevads.weval-consulting.com", + "server_names": [ + "wevads.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "wevads.weval-consulting.com.gold-16avr-pre-fallback", + "server_names": [ + "wevads.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + }, + { + "file": "weval-consulting", + "server_names": [ + "weval-consulting.com", + "www.weval-consulting.com" + ], + "ssl": true, + "php-session": false, + "php-session_paths": false, + "auth_complete": false + } + ], + "screens": { + "s204_html": 276, + "s204_products": 104, + "s204_api_php": 718, + "s204_wevia_php": 20, + "s95_arsenal_html": 1377, + "s95_arsenal_api": 377 + }, + "auth": { + "system": "PHP Session Auth", + "authentik": "REMOVED", + "pass": 24, + "fail": 0 + }, + "databases": { + "s204": [ + "postgres", + "adx_system", + "wevia_db", + "twenty_db", + "mattermost_db", + "deerflow", + "nocodb", + "paperclip", + "langfuse" + ], + "key_tables": { + "kb_learnings": 5468, + "kb_documents": 0, + "ethica_medecins": 50004, + "enterprise_agents": 0 + } + }, + "ollama": [ + { + "name": "weval-brain-v4:latest", + "family": "qwen3", + "params": "4.0B", + "quant": "Q4_K_M", + "size_gb": 2.5 + }, + { + "name": "llama3.2:latest", + "family": "llama", + "params": "3.2B", + "quant": "Q4_K_M", + "size_gb": 2 + }, + { + "name": "nomic-embed-text:latest", + "family": "nomic-bert", + "params": "137M", + "quant": "F16", + "size_gb": 0.3 + }, + { + "name": "weval-brain-v3:latest", + "family": "qwen3", + "params": "4.0B", + "quant": "Q4_K_M", + "size_gb": 2.5 + }, + { + "name": "nomic-embed-text:v1.5", + "family": "nomic-bert", + "params": "137M", + "quant": "F16", + "size_gb": 0.3 + }, + { + "name": "qwen3:4b", + "family": "qwen3", + "params": "4.0B", + "quant": "Q4_K_M", + "size_gb": 2.5 + }, + { + "name": "all-minilm:latest", + "family": "bert", + "params": "23M", + "quant": "F16", + "size_gb": 0 + } + ], + "qdrant": [ + { + "name": "weval_skills", + "vectors": 19087 + }, + { + "name": "wevia_graph", + "vectors": 3 + }, + { + "name": "weval_intents_memory", + "vectors": 50 + }, + { + "name": "obsidian_vault", + "vectors": 46 + }, + { + "name": "kb_bpmn_flows", + "vectors": 7 + }, + { + "name": "kb_ethica_pharma", + "vectors": 16 + }, + { + "name": "kb_consulting_strategy", + "vectors": 6 + }, + { + "name": "wevia_learnings", + "vectors": 1736 + }, + { + "name": "wevia_brain_knowledge", + "vectors": 294 + }, + { + "name": "kb_vsm_best_practices", + "vectors": 7 + }, + { + "name": "kb_bpmn_patterns", + "vectors": 7 + }, + { + "name": "kb_dmaic_playbooks", + "vectors": 7 + }, + { + "name": "kb_wevads_deliv", + "vectors": 6 + }, + { + "name": "wevia_memory_768", + "vectors": 80 + }, + { + "name": "wevia_kb_768", + "vectors": 255 + }, + { + "name": "weval_agents_registry", + "vectors": 50 + }, + { + "name": "wevia_kb", + "vectors": 386 + }, + { + "name": "wevia_memory", + "vectors": 48 + }, + { + "name": "kb_lean6sigma", + "vectors": 10 + } + ], + "ai_providers": [ + { + "name": "Cerebras", + "model": "Qwen-235B", + "tier": "T1", + "status": "active" + }, + { + "name": "Groq", + "model": "Llama-4-Scout", + "tier": "T1", + "status": "active" + }, + { + "name": "SambaNova", + "model": "Llama-3.3-70B", + "tier": "T1", + "status": "active" + }, + { + "name": "NVIDIA NIM", + "model": "Llama-3.1-70B", + "tier": "T1", + "status": "active" + }, + { + "name": "Together", + "model": "Qwen-2.5-72B", + "tier": "T1", + "status": "active" + }, + { + "name": "Mistral", + "model": "Mistral-Small", + "tier": "T2", + "status": "active" + }, + { + "name": "Cohere", + "model": "Command-R+", + "tier": "T2", + "status": "active" + }, + { + "name": "Gemini", + "model": "Gemini-2.0-Flash", + "tier": "T2", + "status": "active" + }, + { + "name": "DeepSeek", + "model": "DeepSeek-Chat", + "tier": "T2", + "status": "active" + }, + { + "name": "OpenRouter", + "model": "Multi", + "tier": "T2", + "status": "active" + }, + { + "name": "Alibaba", + "model": "Qwen-Max", + "tier": "T2", + "status": "active" + }, + { + "name": "HuggingFace", + "model": "Inference", + "tier": "T3", + "status": "active" + }, + { + "name": "Replicate", + "model": "Multi", + "tier": "T3", + "status": "active" + }, + { + "name": "ZhiPu", + "model": "GLM-4", + "tier": "T3", + "status": "active" + }, + { + "name": "Ollama Local", + "model": "weval-brain-v3", + "tier": "T0", + "status": "active" + } + ], + "crons": { + "s204_root": 0, + "s204_www": 34, + "s204_total": 34, + "key_crons": [ + { + "name": "L99 Master", + "freq": "*\/30", + "target": "l99-master.py" + }, + { + "name": "Autonomous Engine", + "freq": "*\/5", + "target": "wevia-master-autonomous" + }, + { + "name": "L99 Pipeline", + "freq": "*\/15", + "target": "l99-pipeline.py" + }, + { + "name": "L99 Alive", + "freq": "*\/10", + "target": "l99-alive.py" + }, + { + "name": "Infra Guardian", + "freq": "*\/5", + "target": "infra-guardian.sh" + }, + { + "name": "Blade Watchdog", + "freq": "*\/5", + "target": "blade-watchdog.php" + }, + { + "name": "RAG Ingest", + "freq": "*\/30", + "target": "wevia-rag-ingest.sh" + }, + { + "name": "Blade Orchestrator", + "freq": "*\/30", + "target": "blade-orchestrator.sh" + }, + { + "name": "WEVIA Dream", + "freq": "*\/30", + "target": "wevia-dream-cron.php" + }, + { + "name": "Port Protection", + "freq": "*\/5", + "target": "port-protection" + }, + { + "name": "Watchdog", + "freq": "*\/3", + "target": "weval-watchdog.php" + }, + { + "name": "Ethica Enrich", + "freq": "daily 01h", + "target": "ethica-enrich-v4.py" + }, + { + "name": "Daily Brief", + "freq": "daily 07h", + "target": "weval-daily-brief.py" + } + ] + }, + "wiki": { + "total_entries": 5468, + "categories": [ + { + "category": "AUTO-FIX", + "cnt": "2972" + }, + { + "category": "TOPOLOGY", + "cnt": "1140" + }, + { + "category": "DISCOVERY", + "cnt": "610" + }, + { + "category": "SYSTEMATIC", + "cnt": "204" + }, + { + "category": "L99-FULLSCAN", + "cnt": "80" + }, + { + "category": "INFRA", + "cnt": "74" + }, + { + "category": "CONTROL-TOWER", + "cnt": "42" + }, + { + "category": "ALERT", + "cnt": "34" + }, + { + "category": "AGENT", + "cnt": "20" + }, + { + "category": "L99-SCAN", + "cnt": "12" + }, + { + "category": "FIX", + "cnt": "10" + }, + { + "category": "FLEET", + "cnt": "8" + }, + { + "category": "MASTER-INTENT", + "cnt": "6" + }, + { + "category": "SESSION-5AVR", + "cnt": "5" + }, + { + "category": "Maroc", + "cnt": "5" + }, + { + "category": "Analyse", + "cnt": "5" + }, + { + "category": "AUTH", + "cnt": "5" + }, + { + "category": "claude_2026", + "cnt": "4" + }, + { + "category": "SERVICES", + "cnt": "4" + }, + { + "category": "WEVAL Consulting", + "cnt": "4" + }, + { + "category": "Intelligence Artificielle", + "cnt": "3" + }, + { + "category": "PARADIGM", + "cnt": "3" + }, + { + "category": "INTEGRATION", + "cnt": "3" + }, + { + "category": "FIX-CRITIQUE", + "cnt": "3" + }, + { + "category": "Voici", + "cnt": "2" + }, + { + "category": "Vous", + "cnt": "2" + }, + { + "category": "Pouvez", + "cnt": "2" + }, + { + "category": "Image", + "cnt": "2" + }, + { + "category": "Contexte", + "cnt": "2" + }, + { + "category": "L99-EXHAUSTIVE", + "cnt": "2" + }, + { + "category": "L99-GAP", + "cnt": "2" + }, + { + "category": "WEVAL Consulting Casablanca", + "cnt": "2" + }, + { + "category": "Test", + "cnt": "2" + }, + { + "category": "Salut", + "cnt": "2" + }, + { + "category": "L99-E2E", + "cnt": "2" + }, + { + "category": "Document", + "cnt": "2" + }, + { + "category": "PROVIDERS", + "cnt": "2" + }, + { + "category": "Bien", + "cnt": "2" + }, + { + "category": "WEVIA", + "cnt": "2" + }, + { + "category": "Diagramme", + "cnt": "2" + }, + { + "category": "Comparaison", + "cnt": "2" + }, + { + "category": "L99-MEGA", + "cnt": "2" + }, + { + "category": "QUALITY", + "cnt": "2" + }, + { + "category": "Cependant", + "cnt": "2" + }, + { + "category": "MONITORING", + "cnt": "2" + }, + { + "category": "L99", + "cnt": "2" + }, + { + "category": "Introduction", + "cnt": "2" + }, + { + "category": "Pour", + "cnt": "2" + }, + { + "category": "Casablanca", + "cnt": "2" + }, + { + "category": "Pourriez", + "cnt": "2" + }, + { + "category": "Vistex BTP Signavio", + "cnt": "1" + }, + { + "category": "Conduite", + "cnt": "1" + }, + { + "category": "DMAIC", + "cnt": "1" + }, + { + "category": "Industrie", + "cnt": "1" + }, + { + "category": "Proposition", + "cnt": "1" + }, + { + "category": "Accueil\nBienvenue", + "cnt": "1" + }, + { + "category": "Logo", + "cnt": "1" + }, + { + "category": "SAP ECC", + "cnt": "1" + }, + { + "category": "Votre", + "cnt": "1" + }, + { + "category": "Probl", + "cnt": "1" + }, + { + "category": "ANTI-REGRESSION", + "cnt": "1" + }, + { + "category": "Explique", + "cnt": "1" + }, + { + "category": "Zero Trust", + "cnt": "1" + }, + { + "category": "Augmented Generation", + "cnt": "1" + }, + { + "category": "RLHF", + "cnt": "1" + }, + { + "category": "Service", + "cnt": "1" + }, + { + "category": "Transformer", + "cnt": "1" + }, + { + "category": "Bonjour Bonjour", + "cnt": "1" + }, + { + "category": "Transformation", + "cnt": "1" + }, + { + "category": "Audit", + "cnt": "1" + }, + { + "category": "WEVAL", + "cnt": "1" + }, + { + "category": "Strat", + "cnt": "1" + }, + { + "category": "Maghreb", + "cnt": "1" + }, + { + "category": "ERP SAP", + "cnt": "1" + }, + { + "category": "Quelle", + "cnt": "1" + }, + { + "category": "Oracle", + "cnt": "1" + }, + { + "category": "Data", + "cnt": "1" + }, + { + "category": "Donn", + "cnt": "1" + }, + { + "category": "Quel", + "cnt": "1" + }, + { + "category": "Syst", + "cnt": "1" + }, + { + "category": "Ahmed", + "cnt": "1" + }, + { + "category": "UiPath", + "cnt": "1" + }, + { + "category": "Niveau PhD", + "cnt": "1" + }, + { + "category": "CLEANUP", + "cnt": "1" + }, + { + "category": "Notre", + "cnt": "1" + }, + { + "category": "TOUTES", + "cnt": "1" + }, + { + "category": "Maroc DDMRP OTIF", + "cnt": "1" + }, + { + "category": "Crit", + "cnt": "1" + }, + { + "category": "SAP Vistex Revenue Management", + "cnt": "1" + }, + { + "category": "Fine", + "cnt": "1" + }, + { + "category": "Compare AWS Azure GCP", + "cnt": "1" + }, + { + "category": "Healthcare", + "cnt": "1" + }, + { + "category": "BLADE", + "cnt": "1" + }, + { + "category": "Plan", + "cnt": "1" + }, + { + "category": "Conseil", + "cnt": "1" + }, + { + "category": "Nous", + "cnt": "1" + }, + { + "category": "Zero Trust SOC SIEM", + "cnt": "1" + }, + { + "category": "Amazon Web Services", + "cnt": "1" + }, + { + "category": "Retiens", + "cnt": "1" + }, + { + "category": "Diff", + "cnt": "1" + }, + { + "category": "QDRANT", + "cnt": "1" + }, + { + "category": "MITRE ATT", + "cnt": "1" + }, + { + "category": "FMCG", + "cnt": "1" + }, + { + "category": "Supply", + "cnt": "1" + }, + { + "category": "Exercice", + "cnt": "1" + }, + { + "category": "Redige", + "cnt": "1" + }, + { + "category": "Supply Chain", + "cnt": "1" + }, + { + "category": "Quels", + "cnt": "1" + }, + { + "category": "Propose", + "cnt": "1" + }, + { + "category": "Plateforme", + "cnt": "1" + }, + { + "category": "Cyber", + "cnt": "1" + }, + { + "category": "Tableau", + "cnt": "1" + }, + { + "category": "Migration SAP", + "cnt": "1" + }, + { + "category": "AUTH-AGENT", + "cnt": "1" + }, + { + "category": "Fais", + "cnt": "1" + }, + { + "category": "Iran", + "cnt": "1" + }, + { + "category": "OLLAMA", + "cnt": "1" + }, + { + "category": "Reessayez", + "cnt": "1" + }, + { + "category": "MORNE WEVAL", + "cnt": "1" + }, + { + "category": "Analyse SWOT", + "cnt": "1" + }, + { + "category": "SAP Vistex", + "cnt": "1" + }, + { + "category": "IoT WMS", + "cnt": "1" + }, + { + "category": "Industry", + "cnt": "1" + }, + { + "category": "What", + "cnt": "1" + }, + { + "category": "Strategie", + "cnt": "1" + }, + { + "category": "Rappelle", + "cnt": "1" + }, + { + "category": "DMAIC Six Sigma", + "cnt": "1" + }, + { + "category": "Avantages", + "cnt": "1" + }, + { + "category": "Explique RLHF", + "cnt": "1" + }, + { + "category": "Huawei Cloud", + "cnt": "1" + }, + { + "category": "PMO SAFe", + "cnt": "1" + }, + { + "category": "Migration SAP ECC", + "cnt": "1" + }, + { + "category": "team_work", + "cnt": "1" + }, + { + "category": "Bonjour Pr", + "cnt": "1" + }, + { + "category": "Maroc DDMRP OTIF WMS TMS", + "cnt": "1" + }, + { + "category": "Architecture", + "cnt": "1" + }, + { + "category": "Framework NIST", + "cnt": "1" + }, + { + "category": "Automatiser", + "cnt": "1" + }, + { + "category": "Compare RLHF DPO Constitutional AI", + "cnt": "1" + }, + { + "category": "Genere", + "cnt": "1" + }, + { + "category": "Elle", + "cnt": "1" + }, + { + "category": "Constitutional AI", + "cnt": "1" + }, + { + "category": "Brownfield", + "cnt": "1" + }, + { + "category": "Confirmation", + "cnt": "1" + }, + { + "category": "Architecture IA", + "cnt": "1" + }, + { + "category": "KPIs", + "cnt": "1" + }, + { + "category": "Quelles", + "cnt": "1" + }, + { + "category": "SWOT", + "cnt": "1" + }, + { + "category": "Comparons", + "cnt": "1" + }, + { + "category": "Services", + "cnt": "1" + }, + { + "category": "Maroc TMA", + "cnt": "1" + }, + { + "category": "Contraintes", + "cnt": "1" + }, + { + "category": "Intelligence", + "cnt": "1" + }, + { + "category": "Donne", + "cnt": "1" + }, + { + "category": "Vistex", + "cnt": "1" + }, + { + "category": "Maroc CMI", + "cnt": "1" + }, + { + "category": "Audite", + "cnt": "1" + }, + { + "category": "Aide", + "cnt": "1" + }, + { + "category": "DKIM DMARC", + "cnt": "1" + }, + { + "category": "Zero Trust SOC", + "cnt": "1" + }, + { + "category": "Bonjour Yacine", + "cnt": "1" + }, + { + "category": "Workshop", + "cnt": "1" + }, + { + "category": "Compare RLHF DPO GRPO Constitutional AI", + "cnt": "1" + }, + { + "category": "Comparatif ERP PME", + "cnt": "1" + }, + { + "category": "Programme", + "cnt": "1" + }, + { + "category": "SAP MM", + "cnt": "1" + }, + { + "category": "Phases", + "cnt": "1" + }, + { + "category": "Autres", + "cnt": "1" + }, + { + "category": "FHIR", + "cnt": "1" + }, + { + "category": "SESSION-7AVR", + "cnt": "1" + }, + { + "category": "FHIR IA", + "cnt": "1" + }, + { + "category": "MLOps", + "cnt": "1" + }, + { + "category": "MIROFISH", + "cnt": "1" + }, + { + "category": "Ecris", + "cnt": "1" + }, + { + "category": "Suite", + "cnt": "1" + }, + { + "category": "Nearshore", + "cnt": "1" + }, + { + "category": "Bienvenue", + "cnt": "1" + }, + { + "category": "Retrieval", + "cnt": "1" + }, + { + "category": "KYC BAM", + "cnt": "1" + }, + { + "category": "Afrique", + "cnt": "1" + }, + { + "category": "Dans", + "cnt": "1" + }, + { + "category": "Azure", + "cnt": "1" + }, + { + "category": "Budget", + "cnt": "1" + }, + { + "category": "INSTRUCTION SYSTEME", + "cnt": "1" + }, + { + "category": "CNDP", + "cnt": "1" + }, + { + "category": "Compare", + "cnt": "1" + }, + { + "category": "HubSpot", + "cnt": "1" + }, + { + "category": "Control", + "cnt": "1" + }, + { + "category": "SESSION-6AVR", + "cnt": "1" + }, + { + "category": "Bonjour Salut", + "cnt": "1" + }, + { + "category": "Maroc KPIs OTIF", + "cnt": "1" + }, + { + "category": "Vistex SAP", + "cnt": "1" + }, + { + "category": "Traduis", + "cnt": "1" + }, + { + "category": "Maroc IoT WMS", + "cnt": "1" + }, + { + "category": "SaaS", + "cnt": "1" + }, + { + "category": "CODE BLOCK", + "cnt": "1" + }, + { + "category": "Cahier", + "cnt": "1" + }, + { + "category": "Maroc FHIR", + "cnt": "1" + }, + { + "category": "DESIGN", + "cnt": "1" + }, + { + "category": "Compare RLHF", + "cnt": "1" + }, + { + "category": "Dynamics", + "cnt": "1" + }, + { + "category": "Python", + "cnt": "1" + }, + { + "category": "FORMAT OBLIGATOIRE", + "cnt": "1" + }, + { + "category": "SAP ERP", + "cnt": "1" + }, + { + "category": "INFRA-SESSION", + "cnt": "1" + }, + { + "category": "Cette", + "cnt": "1" + }, + { + "category": "OWASP Top", + "cnt": "1" + }, + { + "category": "Logo Weval", + "cnt": "1" + }, + { + "category": "ADKAR", + "cnt": "1" + }, + { + "category": "GENERAL", + "cnt": "1" + } + ], + "qdrant_vectors": 386 + }, + "applications": [ + { + "name": "WEVIA Chatbot", + "type": "AI", + "url": "\/wevia", + "port": null, + "server": "S204", + "auth": "public" + }, + { + "name": "WEVIA Admin", + "type": "Admin", + "url": "\/wevia-admin", + "port": null, + "server": "S204", + "auth": "php-session" + }, + { + "name": "WEVIA Life", + "type": "Email AI", + "url": "\/products\/wevialife-app.html", + "port": null, + "server": "S204", + "auth": "php-session" + }, + { + "name": "Workspace", + "type": "Hub", + "url": "\/products\/workspace.html", + "port": null, + "server": "S204", + "auth": "php-session" + }, + { + "name": "Arsenal\/WEVADS", + "type": "Email Marketing", + "url": "wevads.weval-consulting.com", + "port": 5890, + "server": "S95", + "auth": "php-session" + }, + { + "name": "ADX\/iResponse", + "type": "Email Platform", + "url": "wevads.weval-consulting.com", + "port": 5821, + "server": "S95", + "auth": "iResponse" + }, + { + "name": "Ethica HCP", + "type": "Healthcare B2B", + "url": "consent.wevup.app", + "port": null, + "server": "S204", + "auth": "ethica-auth" + }, + { + "name": "CRM (Twenty)", + "type": "CRM", + "url": "crm.weval-consulting.com", + "port": 3000, + "server": "S204", + "auth": "php-session" + }, + { + "name": "Mattermost", + "type": "Chat", + "url": "mm.weval-consulting.com", + "port": 8065, + "server": "S204", + "auth": "php-session" + }, + { + "name": "n8n", + "type": "Automation", + "url": "n8n.weval-consulting.com", + "port": 5678, + "server": "S204", + "auth": "php-session" + }, + { + "name": "Uptime Kuma", + "type": "Monitoring", + "url": "monitor.weval-consulting.com", + "port": 3001, + "server": "S204", + "auth": "php-session" + }, + { + "name": "Plausible", + "type": "Analytics", + "url": "analytics.weval-consulting.com", + "port": 8000, + "server": "S204", + "auth": "php-session" + }, + { + "name": "DeerFlow", + "type": "AI Research", + "url": "deerflow.weval-consulting.com", + "port": 2024, + "server": "S204", + "auth": "php-session" + }, + { + "name": "SearXNG", + "type": "Search", + "url": null, + "port": 8888, + "server": "S204", + "auth": "internal" + }, + { + "name": "Qdrant", + "type": "Vector DB", + "url": null, + "port": 6333, + "server": "S204", + "auth": "internal" + }, + { + "name": "Ollama", + "type": "LLM Runtime", + "url": null, + "port": 11434, + "server": "S204", + "auth": "internal" + }, + { + "name": "Flowise", + "type": "AI Flow", + "url": null, + "port": 3088, + "server": "S204", + "auth": "internal" + }, + { + "name": "MiroFish", + "type": "AI Agent", + "url": "mirofish.weval-consulting.com", + "port": 3050, + "server": "S204", + "auth": "php-session" + }, + { + "name": "Open WebUI", + "type": "LLM UI", + "url": null, + "port": 3002, + "server": "S204", + "auth": "internal" + }, + { + "name": "Vaultwarden", + "type": "Passwords", + "url": null, + "port": 8222, + "server": "S204", + "auth": "internal" + }, + { + "name": "Prometheus", + "type": "Metrics", + "url": null, + "port": 9000, + "server": "S204", + "auth": "internal" + }, + { + "name": "PMTA", + "type": "MTA", + "url": null, + "port": 25, + "server": "S95", + "auth": "internal" + }, + { + "name": "KumoMTA", + "type": "MTA", + "url": null, + "port": 8010, + "server": "S95", + "auth": "internal" + }, + { + "name": "Sentinel", + "type": "Orchestrator", + "url": null, + "port": 5890, + "server": "S95", + "auth": "internal" + } + ], + "cloud": [ + { + "provider": "Hetzner", + "role": "S204+S95", + "type": "Bare Metal", + "region": "Germany" + }, + { + "provider": "OVH", + "role": "S151 DR\/Tracking", + "type": "VPS", + "region": "France" + }, + { + "provider": "Cloudflare", + "role": "CDN+DNS+WAF", + "type": "SaaS", + "region": "Global" + }, + { + "provider": "Huawei Cloud", + "role": "Partner Certifié", + "type": "IaaS", + "region": "MENA" + }, + { + "provider": "Scaleway", + "role": "GPU Inference", + "type": "IaaS", + "region": "France" + } + ], + "partnerships": [ + "SAP Gold Partner", + "Huawei Cloud", + "Vistex", + "IQVIA", + "Scaleway" + ], + "ux_agent": { + "pass": 3, + "fail": 0, + "warn": 0, + "total": 3, + "timestamp": "", + "gauge_health_center": "X=0px Y=0px", + "gauge_auto_center": "X=0px Y=0px", + "design_tokens": { + "bg": "#09090b", + "card": "#18181b", + "font": "Inter" + } + }, + "l99": { + "master": { + "total": 93, + "pass": 89, + "fail": 2, + "timestamp": "2026-04-07T01:32:48.454012" + }, + "auth": { + "pass": 24, + "fail": 0 + } + }, + "cortex": { + "fast_lines": 3620, + "router_lines": 6152, + "router_functions": 17, + "today_requests": 0, + "today_cost": 0, + "avg_latency_ms": 0, + "top_provider": "N\/A", + "providers_used": 0 + }, + "optimizations": { + "recent_commits": [], + "auto_fixes": [ + { + "fact": "AUTONOMY 19Apr 18:50: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 20:50:05.112821" + }, + { + "fact": "AUTONOMY 19Apr 18:45: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 20:45:05.896272" + }, + { + "fact": "AUTONOMY 19Apr 18:40: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 20:40:05.29453" + }, + { + "fact": "AUTONOMY 19Apr 18:35: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 20:35:06.160485" + }, + { + "fact": "AUTONOMY 19Apr 18:30: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 20:30:07.536885" + }, + { + "fact": "AUTONOMY 19Apr 17:30: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 19:30:06.670863" + }, + { + "fact": "AUTONOMY 19Apr 17:25: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 19:25:05.927364" + }, + { + "fact": "AUTONOMY 19Apr 17:20: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 19:20:05.814206" + }, + { + "fact": "AUTONOMY 19Apr 17:15: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 19:15:05.697284" + }, + { + "fact": "AUTONOMY 19Apr 17:10: 1 fixes. Disk light cleanup 85%", + "created_at": "2026-04-19 19:10:05.683959" + } + ], + "architecture_decisions": [ + { + "fact": "Crons: root=51 www-data=55 cron.d=72 total=178", + "created_at": "2026-04-13 00:30:48.940882" + }, + { + "fact": "Crons: root=51 www-data=55 cron.d=70 total=176", + "created_at": "2026-04-12 20:30:07.357094" + }, + { + "fact": "Crons: root=51 www-data=55 cron.d=70 total=176", + "created_at": "2026-04-12 18:30:05.962933" + }, + { + "fact": "Crons: root=51 www-data=55 cron.d=70 total=176", + "created_at": "2026-04-12 16:30:13.56815" + }, + { + "fact": "Crons: root=51 www-data=57 cron.d=70 total=178", + "created_at": "2026-04-12 14:30:11.101941" + }, + { + "fact": "Crons: root=51 www-data=57 cron.d=70 total=178", + "created_at": "2026-04-12 12:30:08.795912" + }, + { + "fact": "Crons: root=51 www-data=57 cron.d=70 total=178", + "created_at": "2026-04-12 10:30:04.181935" + }, + { + "fact": "Crons: root=51 www-data=57 cron.d=70 total=178", + "created_at": "2026-04-12 08:30:04.196728" + }, + { + "fact": "Crons: root=51 www-data=57 cron.d=70 total=178", + "created_at": "2026-04-12 06:30:04.792965" + }, + { + "fact": "Crons: root=51 www-data=57 cron.d=70 total=178", + "created_at": "2026-04-12 04:30:06.68899" + }, + { + "fact": "Crons: root=51 www-data=57 cron.d=70 total=178", + "created_at": "2026-04-12 02:30:07.207832" + }, + { + "fact": "Crons: root=51 www-data=54 cron.d=69 total=174", + "created_at": "2026-04-12 00:30:13.084556" + }, + { + "fact": "Crons: root=50 www-data=52 cron.d=69 total=171", + "created_at": "2026-04-11 22:30:07.088896" + }, + { + "fact": "Crons: root=50 www-data=52 cron.d=69 total=171", + "created_at": "2026-04-11 20:30:08.94444" + }, + { + "fact": "Crons: root=50 www-data=48 cron.d=69 total=167", + "created_at": "2026-04-11 18:30:04.55611" + } + ], + "pipelines": [ + { + "name": "CORTEX Smart Router", + "status": "active", + "desc": "T0 Ollama → T1 Free APIs → T2 Fallbacks", + "routes": 3620 + }, + { + "name": "RAG Ingest", + "status": "active", + "desc": "Cron *\/30 → Qdrant semantic indexing", + "freq": "*\/30" + }, + { + "name": "L99 Quality Gate", + "status": "active", + "desc": "253+ tests, 28 auth tests", + "freq": "*\/30" + }, + { + "name": "Blade Orchestrator", + "status": "active", + "desc": "GPU polling + model sync", + "freq": "*\/30" + }, + { + "name": "Infra Guardian", + "status": "active", + "desc": "Auto-restart nginx\/php\/docker", + "freq": "*\/5" + }, + { + "name": "Ethica Scraper Pipeline", + "status": "active", + "desc": "4 spiders, RichScraper, SearXNG", + "freq": "daily" + }, + { + "name": "WEVIA Dream", + "status": "active", + "desc": "Background learning + dataset enrichment", + "freq": "*\/30" + }, + { + "name": "Daily Brief", + "status": "active", + "desc": "Morning synthesis → Mattermost", + "freq": "daily 07h" + }, + { + "name": "Architecture Scanner", + "status": "active", + "desc": "This page — auto-scan + recommendations", + "freq": "*\/30" + } + ], + "agents_deployed": [ + { + "name": "Monitor Agent", + "role": "Watches all services, auto-restarts", + "status": "active" + }, + { + "name": "DevOps Agent", + "role": "Git sync, deployment, rollback", + "status": "active" + }, + { + "name": "Ethica Agent", + "role": "HCP scraping, validation, enrichment", + "status": "active" + }, + { + "name": "Security Agent", + "role": "Key rotation, secret scan, vulnerability check", + "status": "active" + }, + { + "name": "Blade Agent", + "role": "GPU orchestration, model management", + "status": "active" + }, + { + "name": "Dream Agent", + "role": "Background learning, dataset generation", + "status": "active" + }, + { + "name": "RAG Agent", + "role": "Knowledge ingestion, vector indexing", + "status": "active" + }, + { + "name": "Quality Agent", + "role": "L99 NonReg, regression detection", + "status": "active" + } + ] + }, + "mirofish": { + "status": "active", + "reports": 0, + "bridge": "\/api\/mirofish-bridge.php" + }, + "recommendations": { + "score": 100, + "total": 1, + "critical": 0, + "warning": 0, + "info": 0, + "opportunity": 1, + "auto_fixed": 0, + "fixes_log": [], + "recommendations": [ + { + "severity": "opportunity", + "category": "SCALABILITY", + "title": "Qdrant: 22,101 vecteurs", + "detail": "Volume vectoriel croissant. Planifier sharding ou migration vers cluster Qdrant.", + "action": "opportunity", + "fix_cmd": "" + } + ] + }, + "scan_time_ms": 2535, + "gaps": [], + "score": 100, + "automation": { + "coverage": 100, + "steps": 30, + "total": 30 + } +} \ No newline at end of file diff --git a/api/blade-actions-surfaced.json b/api/blade-actions-surfaced.json index ccdf9acad..ec79fabc5 100644 --- a/api/blade-actions-surfaced.json +++ b/api/blade-actions-surfaced.json @@ -1,15 +1,15 @@ { - "generated_at": "2026-04-20T02:25:02.117676", + "generated_at": "2026-04-20T02:30:01.698166", "stats": { - "total": 549, - "pending": 1059, + "total": 550, + "pending": 1061, "kaouther_surfaced": 29, "chrome_surfaced": 10, "notif_only_done": 0, "autofix_archived": 0, "cerebras_archived": 0, "older_3d_archived": 0, - "unknown": 510, + "unknown": 511, "errors": 0 }, "actions": [ diff --git a/api/handlers/resend-playwright-create-key.py b/api/handlers/resend-playwright-create-key.py new file mode 100755 index 000000000..93a3ab67a --- /dev/null +++ b/api/handlers/resend-playwright-create-key.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""Opus v5.9.3: WEVIA auto Resend Full Access key creation via Playwright headless""" +import sys, json, os, time, subprocess +from playwright.sync_api import sync_playwright + +def log(msg): + print(f"[{time.strftime('%H:%M:%S')}] {msg}", file=sys.stderr) + +def main(): + # Get Resend credentials from vault + email_vault = "/opt/wevia-brain/email-providers/resend-creds.json" + if not os.path.exists(email_vault): + return {"ok": False, "error": f"Resend creds missing at {email_vault}. Create with: echo '{{"email":"...","password":"..."}}' | sudo tee {email_vault}"} + + with open(email_vault) as f: + creds = json.load(f) + + email = creds.get("email", "") + password = creds.get("password", "") + if not email or not password: + return {"ok": False, "error": "creds file must have email and password"} + + log(f"Login as {email}") + + result = {"ok": False, "steps": []} + new_key = None + + with sync_playwright() as p: + browser = p.chromium.launch( + headless=True, + args=["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage"] + ) + context = browser.new_context( + user_agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", + viewport={"width":1280,"height":800} + ) + page = context.new_page() + try: + # Step 1: Go to login + log("Goto resend.com/login") + page.goto("https://resend.com/login", wait_until="domcontentloaded", timeout=30000) + result["steps"].append({"step":"goto_login","url":page.url}) + page.wait_for_timeout(2000) + + # Step 2: Try Google SSO (most likely since email is gmail) + # Or email/password form + try: + # Look for email input + email_input = page.locator("input[type=email]").first + if email_input.is_visible(timeout=3000): + log("Email input found") + email_input.fill(email) + page.wait_for_timeout(500) + # Click continue/next/submit + for btn_text in ["Continue","Sign in","Log in","Next"]: + try: + page.get_by_role("button", name=btn_text).first.click(timeout=2000) + log(f"Clicked {btn_text}") + break + except: pass + page.wait_for_timeout(3000) + # Password + try: + pwd_input = page.locator("input[type=password]").first + if pwd_input.is_visible(timeout=3000): + pwd_input.fill(password) + for btn_text in ["Sign in","Log in","Continue","Submit"]: + try: + page.get_by_role("button", name=btn_text).first.click(timeout=2000) + log(f"Clicked {btn_text} (pwd)") + break + except: pass + except: + log("No password field - maybe magic link?") + except Exception as e: + log(f"Email flow err: {e}") + + page.wait_for_timeout(5000) + result["steps"].append({"step":"after_login_attempt","url":page.url,"title":page.title()}) + + # Screenshot for debug + page.screenshot(path="/tmp/resend-login-debug.png", full_page=True) + + if "login" in page.url.lower() or "signin" in page.url.lower(): + browser.close() + return { + "ok": False, + "error": "Still on login page after submit - likely need magic link or 2FA", + "url": page.url, + "screenshot": "/tmp/resend-login-debug.png", + "steps": result["steps"], + "suggestion": "Use email magic link manually OR provide 2FA code OR use password manager credentials" + } + + # Step 3: Go to api-keys page + log("Goto /api-keys") + page.goto("https://resend.com/api-keys", wait_until="domcontentloaded", timeout=20000) + page.wait_for_timeout(3000) + + # Step 4: Click "Create API Key" + for sel in ["text=Create API Key","text=Create API key","button:has-text(\"Create\")"]: + try: + page.locator(sel).first.click(timeout=3000) + log(f"Clicked: {sel}") + break + except: pass + page.wait_for_timeout(2000) + + # Step 5: Fill name + try: + page.locator("input[placeholder*=\"ame\"], input[name=name]").first.fill("wevia-master-full-auto") + except: pass + + # Step 6: Select Full access + try: + page.locator("text=Full access").first.click(timeout=3000) + except: + try: + page.get_by_role("radio").nth(0).click() # first radio often = Full + except: pass + + # Step 7: Click create + for sel in ["text=Create","button:has-text(\"Create\")","button[type=submit]"]: + try: + page.locator(sel).first.click(timeout=3000) + log(f"Clicked final create: {sel}") + break + except: pass + + page.wait_for_timeout(4000) + + # Step 8: Extract the key from page (monospace field or copy button aria) + key_selectors = ["code","input[value^=re_]","[aria-label*=API]","pre"] + for sel in key_selectors: + try: + elts = page.locator(sel).all() + for e in elts: + txt = (e.inner_text() or "") + if txt.startswith("re_") and len(txt) > 20: + new_key = txt.strip() + break + val = e.get_attribute("value") or "" + if val.startswith("re_") and len(val) > 20: + new_key = val.strip() + break + if new_key: break + except: pass + + page.screenshot(path="/tmp/resend-key-created.png", full_page=True) + result["steps"].append({"step":"key_extraction","found":bool(new_key)}) + + browser.close() + except Exception as e: + browser.close() + return {"ok":False,"error":str(e),"steps":result["steps"]} + + if not new_key: + return {"ok": False, "error": "Could not extract new key", "steps": result["steps"], "screenshot": "/tmp/resend-key-created.png"} + + # Save key on S204 + S95 + with open("/tmp/new_resend_key.txt","w") as f: + f.write(new_key) + subprocess.run(["sudo","cp","/tmp/new_resend_key.txt","/opt/wevia-brain/email-providers/resend.key"], check=False) + subprocess.run(["sudo","chmod","600","/opt/wevia-brain/email-providers/resend.key"], check=False) + + import base64 + b64 = base64.b64encode(new_key.encode()).decode() + cmd = f"echo {b64} | base64 -d | sudo tee /opt/wevia-brain/email-providers/resend.key > /dev/null && sudo chmod 600 /opt/wevia-brain/email-providers/resend.key" + subprocess.run(["curl","-s","-X","POST","https://wevads.weval-consulting.com/api/sentinel-brain.php", + "--data-urlencode","action=exec", + "--data-urlencode",f"cmd={cmd}","--max-time","10"], capture_output=True, timeout=15) + + return { + "ok": True, + "v": "V5.9.3-playwright-auto-resend-key", + "key_preview": new_key[:10] + "..." + new_key[-4:], + "key_saved_s204": True, + "key_saved_s95": True, + "screenshot": "/tmp/resend-key-created.png", + "next_step": "Now call resend_ultimate_setup which uses this new key automatically" + } + +if __name__ == "__main__": + r = main() + print(json.dumps(r, indent=2)) diff --git a/api/handlers/resend-playwright-wrapper.sh b/api/handlers/resend-playwright-wrapper.sh new file mode 100755 index 000000000..e4096c459 --- /dev/null +++ b/api/handlers/resend-playwright-wrapper.sh @@ -0,0 +1,3 @@ +#!/bin/bash +# Opus v5.9.3: Trigger Playwright Resend key creator +python3 /var/www/html/api/handlers/resend-playwright-create-key.py 2>&1 | tail -c 3000 diff --git a/api/handlers/set-resend-password.sh b/api/handlers/set-resend-password.sh new file mode 100755 index 000000000..52e9482f2 --- /dev/null +++ b/api/handlers/set-resend-password.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Opus v5.9.3: Save Resend password from chat (doctrine #7 ZERO MANUEL) +MSG="$*" +# Extract password (anything after "password:" or "pwd:") +PWD=$(echo "$MSG" | grep -oE 'password[:=][[:space:]]*[^[:space:]]+|pwd[:=][[:space:]]*[^[:space:]]+' | sed -E 's/^(password|pwd)[:=][[:space:]]*//' | head -1) +EMAIL=$(echo "$MSG" | grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' | head -1) +[ -z "$EMAIL" ] && EMAIL="yacineutt@gmail.com" +if [ -z "$PWD" ]; then + echo '{"ok":false,"error":"No password. Usage: set resend password: MYPASSWORD"}' + exit 0 +fi +sudo mkdir -p /opt/wevia-brain/email-providers +echo "{\"email\":\"$EMAIL\",\"password\":\"$PWD\"}" | sudo tee /opt/wevia-brain/email-providers/resend-creds.json > /dev/null +sudo chmod 600 /opt/wevia-brain/email-providers/resend-creds.json +cat < 'resend_playwright_create', + 'triggers' => + array ( + 0 => 'resend playwright', + 1 => 'auto create resend key', + 2 => 'playwright resend', + 3 => 'resend browser auto', + ), + 'cmd' => '/var/www/html/api/handlers/resend-playwright-wrapper.sh', + 'status' => 'EXECUTED', + 'created_at' => '2026-04-20T00:34:42+00:00', + 'source' => 'opus4-autowire-early-v2', +); diff --git a/api/wired-pending/intent-opus4-set_resend_password.php b/api/wired-pending/intent-opus4-set_resend_password.php new file mode 100644 index 000000000..9e20e0c52 --- /dev/null +++ b/api/wired-pending/intent-opus4-set_resend_password.php @@ -0,0 +1,15 @@ + 'set_resend_password', + 'triggers' => + array ( + 0 => 'set resend password', + 1 => 'resend password', + 2 => 'resend creds', + 3 => 'save resend password', + ), + 'cmd' => '/var/www/html/api/handlers/set-resend-password.sh', + 'status' => 'EXECUTED', + 'created_at' => '2026-04-20T00:34:43+00:00', + 'source' => 'opus4-autowire-early-v2', +);