import { Check, X, Zap } from "lucide-react" import { cn } from "@/lib/utils" import { fmtSize } from "@/lib/format" import { roleMeta } from "@/lib/roleMeta" import { RoleLabel } from "@/components/models/ModelBadges" import type { ModelInfo, RoleRecResp } from "@/lib/api" // Rollen-Zuweisungs-Modal des Cockpits (Review P2-14, Teil 2: aus dem 990-Z-Monolithen // extrahiert). Zeigt die Modell-Bibliothek sortiert nach Empfehlung (RoleRec-Score) und // hält das Schutzgeländer: lebenswichtige Rollen (Hirn/Gedächtnis) können nicht leer bleiben. const isProtected = (role?: string | null) => !!roleMeta(role).protected export function RoleAssignModal({ role, roleRec, models, onAssign, onClose }: { role: string roleRec: RoleRecResp | null models: ModelInfo[] onAssign: (modelName: string) => void onClose: () => void }) { const rec = roleRec && roleRec.role === role ? roleRec : null const recByName: Record = {} rec?.models.forEach((r) => { recByName[r.name] = r }) // Empfohlene Reihenfolge (nach Score) wenn vorhanden, sonst Bibliotheks-Reihenfolge. const ordered = rec ? rec.models.map((r) => models.find((m) => m.name === r.name)).filter(Boolean) as ModelInfo[] : models return (

festlegen

Wähle ein Modell für {roleMeta(role).label} {roleMeta(role).desc}

{rec?.recommended && ( )}
{/* Schutzgeländer: eine lebenswichtige Rolle (Hirn/Gedächtnis) lässt sich nicht leeren. */} {isProtected(role) ? (
🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell.
) : ( )} {ordered.map((m) => { const r = recByName[m.name] const isCur = m.role === role const isRec = !!r?.recommended const unfit = !!r && !r.suitable return ( ) })}
) }