import { Brain, BrainCog, Code, Eye, BookMarked, Telescope, Scale, ListOrdered, type LucideIcon, } from "lucide-react" // ── EINE Quelle der Wahrheit für ALLE Serving-Rollen ──────────────────────── // Klartext statt Kürzel: jede Rolle bekommt einen Zweck-Namen, ein Icon und // eine Ein-Satz-Erklärung, damit die UI ohne Fachjargon verständlich ist. // Das technische Kürzel (`role`) bleibt für den späteren Experten-Modus erhalten. // // Die Rollen hier spiegeln den ECHTEN Stand der Box (/api/models → role): // hermes · heavy · coder · coder-lite · vision · embed · scout // (Kein Phantom-`fast`: das ist nur ein Lane-Alias, keine Modell-Rolle. Lucys // Alltags-Hirn ist die Rolle `hermes` = Qwen3.6.) export interface RoleMeta { role: string // technisches Kürzel (Experten-Modus) label: string // Klartext-Zweckname short: string // Kurzform für enge Badges icon: LucideIcon desc: string // Tooltip / Erklärung in einfacher Sprache tone: string // Farbklassen fürs Badge protected?: boolean // Hirn & Gedächtnis: lebenswichtig → nicht löschbar/entladbar (Etappe 3) } // Reihenfolge = Anzeige-Reihenfolge in den Slot-Übersichten (Wichtigstes zuerst). export const ROLE_META: RoleMeta[] = [ { role: "hermes", label: "Lucys Hirn", short: "Hirn", icon: Brain, desc: "Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.", tone: "bg-indigo-500/15 text-indigo-400 border-indigo-500/25", protected: true, }, { role: "embed", label: "Lucys Gedächtnis", short: "Gedächtnis", icon: BookMarked, desc: "Merkt sich Wichtiges und findet es später wieder.", tone: "bg-emerald-500/15 text-emerald-400 border-emerald-500/25", protected: true, }, { role: "reranker", label: "Gedächtnis-Sortierer", short: "Sortierer", icon: ListOrdered, desc: "Ordnet gefundene Erinnerungen nach echter Relevanz — die Feinsortierung hinter dem Gedächtnis.", tone: "bg-lime-500/15 text-lime-400 border-lime-500/25", }, { role: "vision", label: "Lucys Augen", short: "Augen", icon: Eye, desc: "Sieht Bilder und Screenshots und beschreibt, was drauf ist.", tone: "bg-pink-500/15 text-pink-400 border-pink-500/25", }, { role: "heavy", label: "Großes Hirn", short: "Groß", icon: BrainCog, desc: "Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.", tone: "bg-amber-500/15 text-amber-400 border-amber-500/25", }, { role: "coder-lite", label: "Programmierer (schnell)", short: "Code schnell", icon: Code, desc: "Schnelles Programmieren im Alltag.", tone: "bg-violet-500/15 text-violet-400 border-violet-500/25", }, { role: "coder", label: "Programmierer (gründlich)", short: "Code gründlich", icon: Code, desc: "Schreibt und prüft Code besonders sorgfältig — für schwere Coding-Aufgaben.", tone: "bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25", }, { role: "scout", label: "Späher", short: "Späher", icon: Telescope, desc: "Schneller erster Blick und grobe Einschätzung.", tone: "bg-teal-500/15 text-teal-400 border-teal-500/25", }, { role: "kritiker", label: "Kritiker", short: "Kritiker", icon: Scale, desc: "Die unbestechliche Zweitmeinung — prüft Behauptungen und Patches (anderer Hersteller als das Hirn).", tone: "bg-cyan-500/15 text-cyan-400 border-cyan-500/25", }, ] // Kanonische Rollen-Reihenfolge (ersetzt die alte, veraltete ROLES-Liste). export const ROLES: string[] = ROLE_META.map((m) => m.role) const BY_ROLE: Record = Object.fromEntries( ROLE_META.map((m) => [m.role, m]), ) // Fallback für unbekannte/neue Rollen — nie „undefined", damit die UID nicht bricht. const UNKNOWN = (role?: string | null): RoleMeta => ({ role: role || "?", label: role || "unbekannt", short: role || "?", icon: Brain, desc: "Rolle ohne hinterlegten Klartext-Namen.", tone: "bg-slate-500/15 text-slate-300 border-slate-500/25", }) // Aliase, die auf eine echte Rolle zeigen (z.B. Lane-Alias `fast` = Hirn). const ALIAS: Record = { fast: "hermes", coder_lite: "coder-lite", } export function roleMeta(role?: string | null): RoleMeta { if (!role) return UNKNOWN(role) return BY_ROLE[role] || BY_ROLE[ALIAS[role]] || UNKNOWN(role) } // Klartext-Name einer Rolle (mit optionaler Kurzform). export const roleLabel = (role?: string | null, short = false) => short ? roleMeta(role).short : roleMeta(role).label // Farbton — bleibt kompatibel zur bisherigen roleTone()-Signatur. export const roleTone = (role?: string | null) => roleMeta(role).tone