Thèmes par agent (bleu ka2 / orange ka4 / mauve ka6) + favicons SVG signature + jeton opérateur
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
7 changed files +48 −11
modified
orchestrator/main.py
+6 −1
@@ -641,7 +641,7 @@ def state() -> dict[str, Any]: | ||
| 641 | 641 | history = [dict(r) for r in c.execute( |
| 642 | 642 | "SELECT ts, mine FROM snapshots WHERE ts > ? ORDER BY ts", (now() - 7 * 86400,)).fetchall()] |
| 643 | 643 | return { |
| 644 | − "agent": AGENT, "identity": {k: ME[k] for k in ("domain", "accent", "accent2", "tagline", "model")}, | |
| 644 | + "agent": AGENT, "identity": {k: ME.get(k) for k in ("domain", "accent", "accent2", "accent_soft", "tagline", "model")}, | |
| 645 | 645 | "services": {s: {**SERVICES[s], "node_alias": NODES[SERVICES[s]["node"]]["alias"]} for s in ME["services"]}, |
| 646 | 646 | "siblings": {a: {"domain": v["domain"], "accent": v["accent"], "services": v["services"]} |
| 647 | 647 | for a, v in TOPO["agents"].items() if a != AGENT}, |
@@ -759,6 +759,11 @@ def health() -> dict[str, Any]: | ||
| 759 | 759 | return {"ok": True, "agent": AGENT, "polled": LATEST["polled"], "paused": LATEST["paused"]} |
| 760 | 760 | |
| 761 | 761 | |
| 762 | +@app.get("/favicon.svg") | |
| 763 | +def favicon() -> FileResponse: | |
| 764 | + return FileResponse(BASE / "web" / f"favicon-{AGENT}.svg", media_type="image/svg+xml") | |
| 765 | + | |
| 766 | + | |
| 762 | 767 | @app.get("/") |
| 763 | 768 | def index() -> FileResponse: |
| 764 | 769 | return FileResponse(BASE / "web" / "index.html") |
modified
orchestrator/web/app.js
+7 −1
@@ -17,7 +17,13 @@ async function load() { | ||
| 17 | 17 | const r = await fetch("/api/state"); |
| 18 | 18 | STATE = await r.json(); |
| 19 | 19 | const id = STATE.identity, num = STATE.agent.replace("ka", ""); |
| 20 | − document.documentElement.style.setProperty("--agent", id.accent); | |
| 20 | + // Thème par agent (bleu ka2 / orange ka4 / mauve ka6): l'accent de l'agent | |
| 21 | + // remplace le lime du design system sur tout son site. | |
| 22 | + const rs = document.documentElement.style; | |
| 23 | + rs.setProperty("--agent", id.accent); | |
| 24 | + rs.setProperty("--lime", id.accent); | |
| 25 | + if (id.accent_soft) rs.setProperty("--lime-soft", id.accent_soft); | |
| 26 | + if (id.accent2) rs.setProperty("--accent-deep", id.accent2); | |
| 21 | 27 | document.title = `${STATE.agent.toUpperCase()} Guardian — Groupe KA`; |
| 22 | 28 | $("#wm-name").textContent = "ka·" + num; |
| 23 | 29 | $("#foot-name").textContent = "ka·" + num; |
added
orchestrator/web/favicon-ka2.svg
+7 −0
@@ -0,0 +1,7 @@ | ||
| 1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"> | |
| 2 | + <!-- KA Guardian ka2 — encre + pastille lime ·Ka + battement (surveillance) --> | |
| 3 | + <rect width="64" height="64" rx="14" fill="#141814"/> | |
| 4 | + <circle cx="51" cy="13" r="4.5" fill="#d9f26b"/> | |
| 5 | + <text x="30" y="36" font-family="'JetBrains Mono','Menlo',ui-monospace,monospace" font-size="26" font-weight="700" fill="#f5f3ee" text-anchor="middle" letter-spacing="-1">K2</text> | |
| 6 | + <polyline points="10,48 21,48 26,41 32,54 37,44 41,48 54,48" fill="none" stroke="#5b9df5" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/> | |
| 7 | +</svg> | |
added
orchestrator/web/favicon-ka4.svg
+7 −0
@@ -0,0 +1,7 @@ | ||
| 1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"> | |
| 2 | + <!-- KA Guardian ka4 — encre + pastille lime ·Ka + battement (surveillance) --> | |
| 3 | + <rect width="64" height="64" rx="14" fill="#141814"/> | |
| 4 | + <circle cx="51" cy="13" r="4.5" fill="#d9f26b"/> | |
| 5 | + <text x="30" y="36" font-family="'JetBrains Mono','Menlo',ui-monospace,monospace" font-size="26" font-weight="700" fill="#f5f3ee" text-anchor="middle" letter-spacing="-1">K4</text> | |
| 6 | + <polyline points="10,48 21,48 26,41 32,54 37,44 41,48 54,48" fill="none" stroke="#ff9f2e" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/> | |
| 7 | +</svg> | |
added
orchestrator/web/favicon-ka6.svg
+7 −0
@@ -0,0 +1,7 @@ | ||
| 1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"> | |
| 2 | + <!-- KA Guardian ka6 — encre + pastille lime ·Ka + battement (surveillance) --> | |
| 3 | + <rect width="64" height="64" rx="14" fill="#141814"/> | |
| 4 | + <circle cx="51" cy="13" r="4.5" fill="#d9f26b"/> | |
| 5 | + <text x="30" y="36" font-family="'JetBrains Mono','Menlo',ui-monospace,monospace" font-size="26" font-weight="700" fill="#f5f3ee" text-anchor="middle" letter-spacing="-1">K6</text> | |
| 6 | + <polyline points="10,48 21,48 26,41 32,54 37,44 41,48 54,48" fill="none" stroke="#a78bfa" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/> | |
| 7 | +</svg> | |
modified
orchestrator/web/index.html
+2 −0
@@ -5,6 +5,8 @@ | ||
| 5 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> |
| 6 | 6 | <title>Guardian — Groupe KA</title> |
| 7 | 7 | <meta name="description" content="Agent gardien autonome du Groupe KA : il détecte les connecteurs en panne, les répare avec Claude, surveille la guérison et revient en arrière si ça empire. Tout est public, en direct."> |
| 8 | +<link rel="icon" type="image/svg+xml" href="/favicon.svg"> | |
| 9 | +<link rel="apple-touch-icon" href="/favicon.svg"> | |
| 8 | 10 | <link rel="preconnect" href="https://fonts.googleapis.com"> |
| 9 | 11 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 10 | 12 | <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet"> |
modified
topology.json
+12 −9
@@ -6,34 +6,36 @@ | ||
| 6 | 6 | "ka2": { |
| 7 | 7 | "port": 8799, |
| 8 | 8 | "domain": "www.ka2.bot", |
| 9 | − "accent": "#22d3ee", | |
| 10 | − "accent2": "#0891b2", | |
| 9 | + "accent": "#a9d1f7", | |
| 10 | + "accent2": "#1e4fa3", | |
| 11 | 11 | "tagline": "Gardien immobilier & local", |
| 12 | 12 | "model": "claude-fable-5", |
| 13 | 13 | "services": [ |
| 14 | 14 | "louka", |
| 15 | 15 | "immoka", |
| 16 | 16 | "restoka" |
| 17 | − ] | |
| 17 | + ], | |
| 18 | + "accent_soft": "#e3effc" | |
| 18 | 19 | }, |
| 19 | 20 | "ka4": { |
| 20 | 21 | "port": 8899, |
| 21 | 22 | "domain": "www.ka4.bot", |
| 22 | − "accent": "#fbbf24", | |
| 23 | − "accent2": "#d97706", | |
| 23 | + "accent": "#ffc36b", | |
| 24 | + "accent2": "#a35c00", | |
| 24 | 25 | "tagline": "Gardien mobilité & quotidien", |
| 25 | 26 | "model": "claude-fable-5", |
| 26 | 27 | "services": [ |
| 27 | 28 | "autoka", |
| 28 | 29 | "foodka", |
| 29 | 30 | "sortika" |
| 30 | − ] | |
| 31 | + ], | |
| 32 | + "accent_soft": "#ffefd9" | |
| 31 | 33 | }, |
| 32 | 34 | "ka6": { |
| 33 | 35 | "port": 8999, |
| 34 | 36 | "domain": "www.ka6.bot", |
| 35 | − "accent": "#a78bfa", | |
| 36 | − "accent2": "#7c3aed", | |
| 37 | + "accent": "#cdb4f9", | |
| 38 | + "accent2": "#5b21b6", | |
| 37 | 39 | "tagline": "Gardien flagship — gros volumes", |
| 38 | 40 | "model": "claude-fable-5", |
| 39 | 41 | "services": [ |
@@ -41,7 +43,8 @@ | ||
| 41 | 43 | "jobka", |
| 42 | 44 | "creaka" |
| 43 | 45 | ], |
| 44 | − "default_for_unknown_services": true | |
| 46 | + "default_for_unknown_services": true, | |
| 47 | + "accent_soft": "#f0e8fc" | |
| 45 | 48 | } |
| 46 | 49 | }, |
| 47 | 50 | "nodes": { |
| 48 | 51 | |