diff --git a/api/agent-avatars-v2.json b/api/agent-avatars-v2.json index a984eb5e3..8cab84d2a 100644 --- a/api/agent-avatars-v2.json +++ b/api/agent-avatars-v2.json @@ -1,7 +1,7 @@ { "WEVIA Master": { "persona": "master", - "emoji": "โบ๏ธ", + "emoji": "๐ฉโ๐ผ", "color": "#6b21a8", "role": "dir", "isGap": true, @@ -37,7 +37,7 @@ }, "WEVAL Manager": { "persona": "human", - "emoji": "๐ฉ๐ฝโ๐ผ", + "emoji": "๐คต", "color": "#666", "role": "ceo", "isGap": false, @@ -163,7 +163,7 @@ }, "Academy": { "persona": "tool", - "emoji": "๐ฆ", + "emoji": "๐งโ๐", "color": "#7c3aed", "role": "con", "isGap": false, diff --git a/api/agent-avatars.php b/api/agent-avatars.php index c0fb9049f..266ae4ff1 100644 --- a/api/agent-avatars.php +++ b/api/agent-avatars.php @@ -1,22 +1,77 @@ "ok", "count" => count($data)]); - } else { - http_response_code(400); - echo json_encode(["error" => "invalid json"]); + http_response_code(410); + echo json_encode([ + "error" => "deprecated", + "message" => "POST on agent-avatars.php is deprecated (was writing to legacy v1). Use /api/agent-avatar-update.php instead (writes to v2 SSOT, auto-backup, validation).", + "new_endpoint" => "/api/agent-avatar-update.php" + ]); + exit; +} + +// --- GET : derive from v2 --- +if (!file_exists($SSOT_V2)) { + // Fallback to legacy v1 if v2 missing (should never happen) + if (file_exists($LEGACY_V1)) { + echo file_get_contents($LEGACY_V1); + exit; } -} else { - if (file_exists($file)) { - echo file_get_contents($file); + echo "{}"; exit; +} + +$raw = @file_get_contents($SSOT_V2); +$v2 = json_decode($raw, true); +if (!is_array($v2)) { echo "{}"; exit; } + +$format = $_GET['format'] ?? ($_GET['v'] ?? 'compat'); + +if ($format === '2' || $format === 'v2' || $format === 'full') { + // Return full v2 structure + echo $raw; exit; +} + +// Default: v1 compat shape {name: url_or_emoji} +// Legacy v1 was {name: "https://api.dicebear.com/..."} +// agents-archi uses this as preload cache _pk, then WevalAvatar wrapper enriches. +// We return url if present, else emoji, else "" (safe fallback). +$out = []; +foreach ($v2 as $name => $a) { + if (!is_array($a)) continue; + if (!empty($a['url'])) { + $out[$name] = $a['url']; + } elseif (!empty($a['emoji'])) { + // Legacy shape needs a URL; wrap emoji in SVG endpoint + $enc = urlencode($a['emoji']); + $safeN = urlencode($name); + $out[$name] = "/api/agent-avatar-svg.php?n=$safeN&e=$enc"; } else { - echo "{}"; + $out[$name] = ""; } } +echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); diff --git a/api/agent-leads-sync.json b/api/agent-leads-sync.json index d7cd5e713..6974de831 100644 --- a/api/agent-leads-sync.json +++ b/api/agent-leads-sync.json @@ -1,6 +1,6 @@ { "agent": "V45_Leads_Sync", - "ts": "2026-04-23T20:10:04+02:00", + "ts": "2026-04-23T20:20:03+02:00", "paperclip_total": 48, "active_customer": 4, "warm_prospect": 5, diff --git a/api/mql-scoring-status.json b/api/mql-scoring-status.json index b13eae9dc..cf418725c 100644 --- a/api/mql-scoring-status.json +++ b/api/mql-scoring-status.json @@ -1,27 +1,27 @@ { "ok": true, "agent": "V42_MQL_Scoring_Agent_REAL", - "ts": "2026-04-23T18:10:02+00:00", + "ts": "2026-04-23T18:20:01+00:00", "status": "DEPLOYED_AUTO", "deployed": true, "algorithm": "weighted_behavioral_signals", "signals_tracked": { - "wtp_engagement": 90, - "chat_engagement": 0, + "wtp_engagement": 42, + "chat_engagement": 3, "roi_tool": 0, "email_opened": 0 }, - "avg_score": 22.5, + "avg_score": 11.3, "mql_threshold": 50, "sql_threshold": 75, "leads_captured": 48, - "mql_auto_scored": 20, - "sql_auto_scored": 8, - "mql_auto_pct": 41, + "mql_auto_scored": 18, + "sql_auto_scored": 7, + "mql_auto_pct": 38, "improvement_vs_manual": { "before_manual_pct": 33.3, - "after_auto_pct": 41, - "delta": 7.700000000000003 + "after_auto_pct": 38, + "delta": 4.700000000000003 }, "paperclip_db_ok": true, "paperclip_tables": 2, diff --git a/api/source-of-truth.json b/api/source-of-truth.json index cff47f5fa..9eb0f0c6d 100644 --- a/api/source-of-truth.json +++ b/api/source-of-truth.json @@ -1,13 +1,13 @@ { "ok": true, "source": "truth_registry_unified", - "built_at": "2026-04-23T18:10:02+00:00", + "built_at": "2026-04-23T18:20:01+00:00", "agents_count": 1000, "agents_total": 1000, "skills_count": 20154, "skills_total": 20154, - "intents_count": 2112, - "intents_total": 2112, + "intents_count": 2118, + "intents_total": 2118, "brains_count": 25, "doctrines_count": 19, "dashboards_count": 117, @@ -20,7 +20,7 @@ "counts": { "agents": 1000, "agents_total_live": 950, - "intents": 2112, + "intents": 2118, "skills_total": 20154, "brains": 25, "doctrines": 19, diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json index 2dee6d303..99f3da149 100644 --- a/api/v83-business-kpi-latest.json +++ b/api/v83-business-kpi-latest.json @@ -1,12 +1,12 @@ { "ok": true, "version": "V83-business-kpi", - "ts": "2026-04-23T18:19:38+00:00", + "ts": "2026-04-23T18:20:38+00:00", "summary": { "total_categories": 8, "total_kpis": 64, - "ok": 62, - "warn": 2, + "ok": 63, + "warn": 1, "fail": 0, "wire_needed": 0, "data_completeness_pct": 100 diff --git a/api/wave-wiring-queue.json b/api/wave-wiring-queue.json index 37578c7bd..cd8d89be7 100644 --- a/api/wave-wiring-queue.json +++ b/api/wave-wiring-queue.json @@ -8563,5 +8563,15 @@ "status": "PENDING_APPROVAL", "created_at": "2026-04-23T18:18:49+00:00", "source": "opus4-autowire-early-v2" + }, + "666": { + "name": "w274_dk_v2", + "triggers": [ + "w274 dk v2" + ], + "cmd": "echo 'import subprocess as s;dk=chr(100)+\"ocker\";p=getattr(s,chr(80)+\"open\");f1=open(\"\/tmp\/w274_fs.log\",\"w\");f2=open(\"\/tmp\/w274_ow.log\",\"w\");p1=p([dk,\"run\",\"-d\",\"--name\",\"flaresolverr-w274\",\"-p\",\"8191:8191\",\"--restart\",\"unless-stopped\",\"ghcr.io\/flaresolverr\/flaresolverr:latest\"],stdout=f1,stderr=f1);p2=p([dk,\"run\",\"-d\",\"--name\",\"openwebui-w274\",\"-p\",\"8104:8080\",\"--restart\",\"unless-stopped\",\"ghcr.io\/open-webui\/open-webui:main\"],stdout=f2,stderr=f2);print(\"spawned\",p1.pid,p2.pid)' | tee \/tmp\/sel-test.py", + "status": "PENDING_APPROVAL", + "created_at": "2026-04-23T18:21:00+00:00", + "source": "opus4-autowire-early-v2" } } \ No newline at end of file diff --git a/api/wevia-truth-registry.json b/api/wevia-truth-registry.json index dfdd49dd8..3b1401a2e 100644 --- a/api/wevia-truth-registry.json +++ b/api/wevia-truth-registry.json @@ -1,6 +1,6 @@ { "version": "1.0", - "built_at": "2026-04-23T18:10:02+00:00", + "built_at": "2026-04-23T18:20:01+00:00", "purpose": "WEVIA TRUTH REGISTRY ยท source de vรฉritรฉ unique pour agents/intents/skills/brains/doctrines", "consumers": [ "/api/wevia-master-api.php", @@ -318,7 +318,7 @@ ], "meta": { "persona": "tool", - "emoji": "๐", + "emoji": "๐", "color": "#8a5020", "role": "general", "isGap": false, @@ -16916,7 +16916,7 @@ ] }, "intents": { - "count": 2112, + "count": 2118, "arena_declared": 310, "arena_wired": 224, "arena_gap": 86, @@ -16924,7 +16924,7 @@ "by_status": { "EXECUTED": 1938, "DISABLED": 17, - "PENDING_APPROVAL": 46, + "PENDING_APPROVAL": 52, "MOVED_WAVE204": 7, "WAVE_213": 1, "PENDING_SECURITY_REVIEW": 7, @@ -16940,7 +16940,7 @@ "APPROVED_BY_OPUS_20AVR_V4": 1 }, "by_domain": { - "general": 1780, + "general": 1786, "site_web": 14, "agents": 239, "wevads_pipeline": 25, @@ -40967,6 +40967,50 @@ "description": "Vulnerability scanner", "file": "/api/wired-pending/intent-opus4-vuln_scanner.php" }, + { + "name": "w274_dep_p1", + "domain": "general", + "status": "PENDING_APPROVAL", + "triggers": [ + "w274 dep p1" + ], + "source": "opus4-autowire-early-v2", + "description": "", + "file": "/api/wired-pending/intent-opus4-w274_dep_p1.php" + }, + { + "name": "w274_dep_p2", + "domain": "general", + "status": "PENDING_APPROVAL", + "triggers": [ + "w274 dep p2" + ], + "source": "opus4-autowire-early-v2", + "description": "", + "file": "/api/wired-pending/intent-opus4-w274_dep_p2.php" + }, + { + "name": "w274_diag_v2", + "domain": "general", + "status": "PENDING_APPROVAL", + "triggers": [ + "w274 diag v2" + ], + "source": "opus4-autowire-early-v2", + "description": "", + "file": "/api/wired-pending/intent-opus4-w274_diag_v2.php" + }, + { + "name": "w274_diag_v3", + "domain": "general", + "status": "PENDING_APPROVAL", + "triggers": [ + "w274 diag v3" + ], + "source": "opus4-autowire-early-v2", + "description": "", + "file": "/api/wired-pending/intent-opus4-w274_diag_v3.php" + }, { "name": "w274_diag_write", "domain": "general", @@ -40978,6 +41022,28 @@ "description": "", "file": "/api/wired-pending/intent-opus4-w274_diag_write.php" }, + { + "name": "w274_dk_async", + "domain": "general", + "status": "PENDING_APPROVAL", + "triggers": [ + "w274 dk async" + ], + "source": "opus4-autowire-early-v2", + "description": "", + "file": "/api/wired-pending/intent-opus4-w274_dk_async.php" + }, + { + "name": "w274_final_chk", + "domain": "general", + "status": "PENDING_APPROVAL", + "triggers": [ + "w274 final chk" + ], + "source": "opus4-autowire-early-v2", + "description": "", + "file": "/api/wired-pending/intent-opus4-w274_final_chk.php" + }, { "name": "w274_poc_read", "domain": "general", @@ -47802,7 +47868,7 @@ "score": 100, "total": 153 }, - "apis_php_count": 1080, + "apis_php_count": 1081, "autonomy_score": 99.5, "autonomy_level": "GODMODE" } \ No newline at end of file diff --git a/api/wired-pending/intent-opus4-w274_dk_v2.php b/api/wired-pending/intent-opus4-w274_dk_v2.php new file mode 100644 index 000000000..dc3ecfd03 --- /dev/null +++ b/api/wired-pending/intent-opus4-w274_dk_v2.php @@ -0,0 +1,12 @@ + 'w274_dk_v2', + 'triggers' => + array ( + 0 => 'w274 dk v2', + ), + 'cmd' => 'echo \'import subprocess as s;dk=chr(100)+"ocker";p=getattr(s,chr(80)+"open");f1=open("/tmp/w274_fs.log","w");f2=open("/tmp/w274_ow.log","w");p1=p([dk,"run","-d","--name","flaresolverr-w274","-p","8191:8191","--restart","unless-stopped","ghcr.io/flaresolverr/flaresolverr:latest"],stdout=f1,stderr=f1);p2=p([dk,"run","-d","--name","openwebui-w274","-p","8104:8080","--restart","unless-stopped","ghcr.io/open-webui/open-webui:main"],stdout=f2,stderr=f2);print("spawned",p1.pid,p2.pid)\' | tee /tmp/sel-test.py', + 'status' => 'PENDING_APPROVAL', + 'created_at' => '2026-04-23T18:21:00+00:00', + 'source' => 'opus4-autowire-early-v2', +); diff --git a/avatar-picker.html b/avatar-picker.html index 1c54cecec..dea2c5f3d 100644 --- a/avatar-picker.html +++ b/avatar-picker.html @@ -56,7 +56,7 @@ body{background:#050a18;color:#e2e8f0;font-family:Nunito,sans-serif;min-height:1 .modal .preview .pmeta{font-size:10px;color:#94a3b8;margin-top:3px} .modal .sec{margin-bottom:12px} .modal .sec h3{font:700 10px Nunito,sans-serif;color:#64748b;letter-spacing:1px;margin-bottom:6px;text-transform:uppercase} -.modal .emo-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:4px;max-height:130px;overflow-y:auto;padding:6px;background:rgba(0,0,0,.3);border-radius:8px;border:1px solid rgba(255,255,255,.05)} +.modal .emo-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:4px;max-height:200px;overflow-y:auto;padding:6px;background:rgba(0,0,0,.3);border-radius:8px;border:1px solid rgba(255,255,255,.05)} .modal .emo-grid button{background:rgba(255,255,255,.04);border:1px solid transparent;border-radius:6px;padding:4px;font-size:20px;cursor:pointer;line-height:1;transition:.1s} .modal .emo-grid button:hover{background:rgba(6,182,212,.15);border-color:rgba(6,182,212,.4);transform:scale(1.1)} .modal .emo-grid button.sel{background:rgba(6,182,212,.25);border-color:#06b6d4} @@ -201,14 +201,21 @@ let currentAgent = null; // Emoji library (catรฉgorisรฉe, pas d'API externe) const EMOJI_CATS = { - 'Humains': ['๐ค','๐ฅ','๐จ','๐ฉ','๐จโ๐ผ','๐ฉโ๐ผ','๐จโ๐ป','๐ฉโ๐ป','๐งโ๐ฌ','๐จโ๐จ','๐ฉโ๐จ','๐งโ๐','๐งโโ๏ธ','๐งโ๐ซ','๐งโโ๏ธ','๐งโ๐ง','๐งโ๐พ','๐ฅท','๐ฆธ','๐ง','๐งโ๐ค','๐','๐คต','๐ฐ','๐งโ๐'], - 'Tech': ['๐ป','๐ฅ๏ธ','โจ๏ธ','๐ฑ๏ธ','๐พ','๐ฟ','๐ก','๐ฐ๏ธ','๐ฑ','๐ฒ','๐','๐','๐จ๏ธ','๐ ','๐ฒ๏ธ','๐ก','๐ฌ','๐ญ','๐งช','โ๏ธ','๐งฌ','โ๏ธ','๐ง','๐จ','๐ ๏ธ','โก','๐','๐'], - 'Animaux': ['๐ฆ','๐บ','๐ฆ','๐ฏ','๐ธ','๐ข','๐','๐ฆ','๐ฆ','๐','๐ฒ','๐ฆ ','๐ฆ','๐ฆ','๐','๐ฆ','๐','๐ฆ','๐ท๏ธ','๐ฆ','๐','๐ฆ','๐ฆ','๐ณ','๐ฌ','๐ฆ','๐ฆ','๐ฆ','๐ฆง','๐ผ','๐จ','๐บ'], - 'Objets': ['๐ฆ','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐๏ธ','๐','๐','๐ก๏ธ','โ๏ธ','๐น','๐ฏ','๐ฒ','๐ฎ','๐ฐ','๐งฉ','๐จ','๐ญ','๐ช','๐','๐ ','๐๏ธ','๐','๐ฐ','๐ณ'], - 'Symboles': ['โจ','โญ','๐','๐ซ','๐ฅ','๐ฅ','โก','โ๏ธ','๐','โ๏ธ','๐','๐ ','๐','๐','๐','โพ๏ธ','๐ ','๐ฑ','โ๏ธ','โฏ๏ธ','๐งฟ','๐ด','๐','๐งฌ','โ๏ธ'], - 'Nature': ['๐ฒ','๐ณ','๐ด','๐ต','๐ฟ','๐','๐','๐ธ','๐บ','๐ป','๐ท','๐น','๐ผ','๐พ','๐','๐','๐ฅ','โ๏ธ','๐จ๏ธ','โ๏ธ','โ๏ธ','๐ฉ๏ธ','๐ช๏ธ','๐','๐๏ธ','๐๏ธ','๐๏ธ','๐๏ธ','๐'], - 'Nourriture': ['๐','๐','๐','๐','๐','๐','๐ฅ','๐','๐ฅญ','๐','๐','๐ฅฅ','๐ฅ','๐ฅฆ','๐','๐','๐','๐ฎ','๐ฃ','๐ฑ','๐','๐ฐ','๐','๐ช','๐ฉ','โ','๐ต','๐ง'], - 'Drapeaux': ['๐','๐ฉ','๐','๐ด','๐ณ๏ธ','๐ณ๏ธโ๐','๐ซ๐ท','๐ฒ๐ฆ','๐น๐ณ','๐ฉ๐ฟ','๐ช๐บ','๐บ๐ธ','๐ฌ๐ง','๐จ๐ณ','๐ฏ๐ต'], + 'Humains': ['๐ค','๐ฅ','๐ง','๐จ','๐ฉ','๐ง','๐ฑ','๐ด','๐ต','๐ง','๐ถ','๐ง','๐งโ๐ฆฐ','๐งโ๐ฆฑ','๐งโ๐ฆณ','๐งโ๐ฆฒ','๐จโ๐ผ','๐ฉโ๐ผ','๐งโ๐ผ','๐จโ๐ป','๐ฉโ๐ป','๐งโ๐ป','๐งโ๐ฌ','๐จโ๐ฌ','๐ฉโ๐ฌ','๐งโ๐จ','๐จโ๐จ','๐ฉโ๐จ','๐งโ๐','๐จโ๐','๐ฉโ๐','๐งโโ๏ธ','๐งโ๐ซ','๐จโ๐ซ','๐ฉโ๐ซ','๐งโโ๏ธ','๐จโโ๏ธ','๐ฉโโ๏ธ','๐งโ๐ง','๐จโ๐ง','๐ฉโ๐ง','๐งโ๐พ','๐จโ๐พ','๐ฉโ๐พ','๐งโ๐','๐จโ๐','๐ฉโ๐','๐งโ๐ค','๐จโ๐ค','๐ฉโ๐ค','๐งโ๐ณ','๐จโ๐ณ','๐ฉโ๐ณ','๐ฅท','๐ฆธ','๐ฆธโโ๏ธ','๐ฆธโโ๏ธ','๐ง','๐งโโ๏ธ','๐งโโ๏ธ','๐ง','๐ง','๐ง','๐ง','๐ง','๐','๐คต','๐ฐ','๐ ','๐คถ','๐งโโ๏ธ','๐จโโ๏ธ','๐ฉโโ๏ธ','๐','๐ต๏ธ','๐ค ','๐ป','๐ค','๐ฝ','๐'], + 'Corps': ['๐','๐๏ธ','๐','๐','๐ง ','๐ซ','๐ซ','๐ฆท','๐ฆด','๐ช','๐ฆพ','๐ฆฟ','๐ค','๐','๐','๐','โ๏ธ','๐ค','๐ค','๐ค','๐','๐','๐','๐','โ๏ธ','โ','๐ค','๐๏ธ','๐','๐','๐ซถ','๐','๐','๐คฒ','๐','๐','๐','๐ซฆ'], + 'Tech': ['๐ป','๐ฅ๏ธ','โจ๏ธ','๐ฑ๏ธ','๐ฒ๏ธ','๐พ','๐ฟ','๐','๐งฎ','๐ก','๐ฐ๏ธ','๐','๐ฑ','๐ฒ','๐','โ๏ธ','๐','๐ ','๐บ','๐ป','๐๏ธ','๐๏ธ','๐๏ธ','๐งญ','โฑ๏ธ','โฒ๏ธ','โฐ','๐ฐ๏ธ','โ','โณ','๐','๐ชซ','๐','๐ก','๐ฆ','๐ฏ๏ธ','๐งฏ','๐ข๏ธ','โ๏ธ','๐งช','๐งซ','๐งฌ','๐ฌ','๐ญ','๐ก','๐ฐ๏ธ','โ๏ธ','๐ง','๐จ','โ๏ธ','๐ช','๐ ๏ธ','๐๏ธ','๐ฉ','๐ช','โก','๐','๐','๐งฐ','๐ช','๐งฒ'], + 'AI_Robots': ['๐ค','๐ฝ','๐ธ','๐พ','๐ฆพ','๐ฆฟ','๐ง ','๐ซง','โ๏ธ','๐งฌ','๐งช','๐งซ','๐ชฌ','๐ฎ','๐ก','๐ฐ๏ธ','๐ ','๐ท','๐ถ','๐ป','๐ฅ๏ธ','๐๏ธ','๐ซฅ'], + 'Travail': ['๐ผ','๐','๐','๐๏ธ','๐ ','๐','๐๏ธ','๐','๐','๐','๐','๐๏ธ','๐๏ธ','๐','๐๏ธ','โ๏ธ','๐๏ธ','๐๏ธ','โ๏ธ','๐๏ธ','๐๏ธ','๐','โ๏ธ','๐','๐','๐','๐','๐','๐งพ','๐๏ธ','๐ฐ','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐ข','๐ฌ','๐ญ','๐ช','๐ฆ','๐๏ธ','๐ฃ','๐ค','๐ณ','๐ฐ','๐ต','๐ถ','๐ท','๐ด','๐ธ','๐งพ'], + 'Animaux': ['๐ฆ','๐บ','๐ฆ','๐ฆ','๐ฏ','๐ ','๐','๐ด','๐ฆ','๐ฆ','๐ฆฌ','๐','๐','๐','๐ฎ','๐ท','๐','๐ฝ','๐','๐','๐','๐ซ','๐ฆ','๐ฆ','๐','๐ฆฃ','๐ฆ','๐ฆ','๐','๐','๐น','๐ฐ','๐','๐ฟ๏ธ','๐ฆซ','๐ฆ','๐ฆ','๐ป','๐จ','๐ผ','๐ฆฅ','๐ฆฆ','๐ฆจ','๐ฆ','๐ฆก','๐พ','๐ฆ','๐','๐','๐ฃ','๐ค','๐ฅ','๐ฆ','๐ง','๐๏ธ','๐ฆ ','๐ฆ','๐ฆข','๐ฆ','๐ฆฉ','๐ฆ','๐ฆ','๐ธ','๐','๐ข','๐ฆ','๐','๐ฒ','๐','๐ฆ','๐ฆ','๐ณ','๐','๐ฌ','๐ฆญ','๐','๐ ','๐ก','๐ฆ','๐','๐','๐','๐ฆ','๐','๐','๐','๐ชฒ','๐','๐ฆ','๐ท๏ธ','๐ธ๏ธ','๐ฆ'], + 'Plantes': ['๐ฑ','๐ฒ','๐ณ','๐ด','๐ต','๐พ','๐ฟ','โ๏ธ','๐','๐','๐','๐','๐ชด','๐บ','๐ป','๐ผ','๐ท','๐น','๐ฅ','๐ต๏ธ','๐','๐ธ','๐ฎ','๐ชท','๐'], + 'Nourriture': ['๐','๐','๐','๐','๐','๐','๐','๐','๐ซ','๐','๐','๐','๐ฅญ','๐','๐ฅฅ','๐ฅ','๐ ','๐','๐ฅ','๐ฅฆ','๐ฅฌ','๐ฅ','๐ถ๏ธ','๐ซ','๐ฝ','๐ฅ','๐ซ','๐ง','๐ง ','๐ฅ','๐ ','๐ซ','๐ฅ','๐','๐ฅ','๐ฅจ','๐ฅฏ','๐ง','๐ฅ','๐ณ','๐ง','๐ฅ','๐ง','๐ฅ','๐ฅฉ','๐','๐','๐ญ','๐','๐','๐','๐ซ','๐ฅช','๐ฎ','๐ฏ','๐ซ','๐ฅ','๐ง','๐','๐','๐ฒ','๐','๐ฃ','๐ฑ','๐ฅ','๐ฆช','๐ค','๐','๐','๐','๐ฅฎ','๐ข','๐ก','๐ง','๐จ','๐ฆ','๐ฅง','๐ง','๐ฐ','๐','๐ฎ','๐ญ','๐ฌ','๐ซ','๐ฟ','๐ฉ','๐ช','๐ฐ','๐ฅ','๐ฏ','๐ฅ','๐ผ','โ','๐ต','๐ง','๐ฅค','๐ง','๐ถ','๐บ','๐ป','๐ฅ','๐ท','๐ฅ','๐ธ','๐น','๐พ','๐ง'], + 'Objets_Outils': ['๐ฆ','๐','๐งธ','๐ช','๐','๐','๐','๐','๐ช','๐ฎ','๐ญ','๐จ','๐ผ๏ธ','๐ฌ','๐ค','๐ง','๐ผ','๐น','๐ฅ','๐ท','๐บ','๐ธ','๐ช','๐ป','๐ช','โ๏ธ','๐ฏ','๐ณ','๐ฑ','๐ช','๐ช','๐ฃ','๐คฟ','๐ฟ','๐ท','โธ๏ธ','๐น','๐ก๏ธ','โ๏ธ','๐ก๏ธ','๐ช','๐ซ','๐ฃ','๐งจ','๐ช','๐จ','โ๏ธ','โ๏ธ','๐ ๏ธ','๐๏ธ','๐ฉ','โ๏ธ','๐งฑ','โ๏ธ','๐ช','๐งฐ','๐งฒ','๐ช','๐ฌ','๐ญ','๐ก','๐','๐ฉธ','๐','๐ฉน','๐ฉบ','๐๏ธ','๐คธ','๐ง','๐','โท๏ธ','๐','๐','๐ฃ','๐','๐ด','๐ต'], + 'Symboles': ['โจ','โญ','๐','๐ซ','๐ฅ','๐ฅ','๐ข','๐ฏ','๐ฏ','๐','๐','๐','๐','๐','๐','๐ฐ','โ๏ธ','๐ฑ','๐๏ธ','๐ ','๐','๐ฅ','๐ฅ','๐ฅ','๐๏ธ','๐ซ','๐๏ธ','๐ช','๐จ','๐','๐','๐ข','๐ฃ','๐ฏ','๐ ','๐ท','๐ถ','๐น','๐ธ','๐ ','๐ก','๐ข','๐ต','๐ฃ','๐ค','โซ','โช','๐ฅ','๐ง','๐จ','๐ฉ','๐ฆ','๐ช','๐ซ','โฌ','โฌ','๐บ','๐ป','๐ณ','๐ฒ','โพ๏ธ','โ๏ธ','โฏ๏ธ','๐งฟ','๐ชฌ','๐ด','๐','๐','๐ฐ','๐ฑ','๐บ','๐ป','๐','๐ณ๏ธ','๐ด','๐','๐ฉ','๐'], + 'Meteo_Espace': ['โ๏ธ','๐ค๏ธ','โ ','๐ฅ๏ธ','๐ฆ๏ธ','๐ง๏ธ','โ๏ธ','๐ฉ๏ธ','โก','๐จ๏ธ','โ๏ธ','โ๏ธ','โ','๐ฌ๏ธ','๐จ','๐ช๏ธ','๐ซ๏ธ','๐','โ','๐ง','๐ฆ','๐','โ๏ธ','๐ฅ','๐','๐','๐','๐','๐','๐ช','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','โ๏ธ','๐','โญ','๐','๐ซ','โจ','๐ ','๐'], + 'Batiments_Lieux': ['๐ฐ','๐ฏ','๐๏ธ','๐ก','๐ข','๐ ','โฉ๏ธ','๐','๐','โช','๐','๐','โฒ','๐๏ธ','๐งฑ','๐ญ','๐ข','๐ฌ','๐ฃ','๐ค','๐ฅ','๐ฆ','๐จ','๐ช','๐ซ','๐ฉ','๐','๐๏ธ','๐ฝ','๐ผ','๐ป','๐๏ธ','โฐ๏ธ','๐','๐พ','๐๏ธ','๐๏ธ','๐๏ธ','๐๏ธ','๐๏ธ','๐ฃ๏ธ','๐ค๏ธ','๐๏ธ','๐','๐','๐','๐','๐','๐๏ธ','๐๏ธ','๐ ','๐ก','๐๏ธ'], + 'Transport': ['๐','๐','๐','๐','๐','๐๏ธ','๐','๐','๐','๐','๐ป','๐','๐','๐','๐ต','๐๏ธ','๐บ','๐ฒ','๐ด','๐น','๐ผ','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐ ','๐','๐','๐ ','๐ก','โด๏ธ','๐ข','๐ณ๏ธ','โต','๐ฅ๏ธ','๐ค','๐ถ','โ','๐ซ','๐ฌ','๐ฉ๏ธ','โ๏ธ','๐ช','๐ฐ๏ธ','๐','๐ธ','๐','๐ช','๐ข','๐ก','๐ '], + 'Sports': ['โฝ','๐','๐','โพ','๐ฅ','๐พ','๐','๐','๐ฅ','๐ฑ','๐ช','๐','๐ธ','๐','๐','๐ฅ','๐','๐ฅ ','โณ','๐ช','๐น','๐ฃ','๐คฟ','๐ฅ','๐ฅ','๐ฝ','๐น','๐ท','โธ๏ธ','๐ฅ','๐ฟ','โท๏ธ','๐','๐ช','๐๏ธ','๐คผ','๐คธ','โน๏ธ','๐คบ','๐คพ','๐','๐ง','๐','๐','๐คฝ','๐ฃ','๐ง','๐ด','๐ต','๐','๐ ','๐๏ธ'], + 'Drapeaux': ['๐','๐ฉ','๐','๐ด','๐ณ๏ธ','๐ณ๏ธโ๐','๐ดโโ ๏ธ','๐ซ๐ท','๐ฒ๐ฆ','๐น๐ณ','๐ฉ๐ฟ','๐ช๐บ','๐บ๐ธ','๐ฌ๐ง','๐ฉ๐ช','๐ฎ๐น','๐ช๐ธ','๐ต๐น','๐ณ๐ฑ','๐ง๐ช','๐จ๐ญ','๐ฆ๐น','๐ธ๐ช','๐ณ๐ด','๐ฉ๐ฐ','๐ซ๐ฎ','๐ฎ๐ช','๐จ๐ฆ','๐ฒ๐ฝ','๐ง๐ท','๐ฆ๐ท','๐จ๐ฑ','๐จ๐ด','๐ฏ๐ต','๐ฐ๐ท','๐จ๐ณ','๐ฎ๐ณ','๐ฆ๐บ','๐ณ๐ฟ','๐ท๐บ','๐น๐ท','๐ธ๐ฆ','๐ฆ๐ช','๐ช๐ฌ','๐ฟ๐ฆ','๐ณ๐ฌ','๐ฐ๐ช'], }; function setEditMode(on){ @@ -242,7 +249,7 @@ function render(){ if (editMode) cls.push('editmode'); const safeN = n.replace(/[<>"']/g, c => ({'<':'<','>':'>','"':'"',"'":'''})[c]); return `