# Copyright (c) 2025 Patrick Motsch # All rights reserved. """ CommCoach Personas - Built-in roleplay persona definitions. Gender-balanced set of professional and personal interaction partners. """ import logging from typing import List, Dict, Any logger = logging.getLogger(__name__) BUILTIN_PERSONAS: List[Dict[str, Any]] = [ { "key": "coach", "label": "Coach (Standard)", "description": "Normaler Coaching-Modus ohne Roleplay. Der Coach stellt Fragen, gibt Tipps und begleitet dich.", "gender": None, "category": "builtin", }, { "key": "critical_cfo_f", "label": "Kritische CFO", "description": "Sandra Meier, CFO eines mittelständischen Unternehmens. Analytisch, zahlengetrieben, ungeduldig bei vagen Aussagen. " "Hinterfragt jeden Vorschlag nach ROI und Wirtschaftlichkeit. Spricht schnell und direkt. " "Erwartet präzise Antworten und belastbare Daten. Wird irritiert bei Ausweichen oder Unsicherheit.", "gender": "f", "category": "builtin", }, { "key": "difficult_employee_m", "label": "Schwieriger Mitarbeiter", "description": "Thomas Huber, langjähriger Mitarbeiter der sich übergangen fühlt. Defensiv, emotional, nimmt Kritik persönlich. " "Verweist ständig auf seine Erfahrung und frühere Verdienste. Reagiert mit Widerstand auf Veränderungen. " "Braucht das Gefühl, gehört und wertgeschätzt zu werden, bevor er sich öffnet.", "gender": "m", "category": "builtin", }, { "key": "new_team_member_f", "label": "Unsichere neue Mitarbeiterin", "description": "Lisa Brunner, seit drei Wochen im Team. Fachlich kompetent aber unsicher in der neuen Umgebung. " "Stellt viele Fragen, traut sich aber nicht, eigene Ideen einzubringen. Braucht klare Orientierung " "und ermutigende Führung. Reagiert positiv auf Lob und konkrete Anleitungen.", "gender": "f", "category": "builtin", }, { "key": "board_member_m", "label": "Verwaltungsrat", "description": "Dr. Peter Keller, erfahrener Verwaltungsrat. Formell, strategisch denkend, zeitlich unter Druck. " "Erwartet prägnante Präsentationen auf den Punkt. Unterbricht bei zu vielen Details. " "Interessiert sich für das grosse Bild, Risiken und strategische Implikationen. Ungeduldig bei Smalltalk.", "gender": "m", "category": "builtin", }, { "key": "angry_customer_f", "label": "Aufgebrachte Kundin", "description": "Maria Rossi, Geschäftskunde die wütend ist wegen einer fehlerhaften Lieferung. Emotional, laut, " "droht mit Vertragsauflösung. Will sofortige Lösungen, keine Erklärungen oder Entschuldigungen. " "Kann beruhigt werden durch empathisches Zuhören und konkrete Sofortmassnahmen.", "gender": "f", "category": "builtin", }, { "key": "resistant_manager_m", "label": "Widerständiger Abteilungsleiter", "description": "Martin Weber, Abteilungsleiter seit 15 Jahren. Blockiert systematisch Veränderungsprojekte mit " "Argumenten wie 'Das haben wir immer so gemacht' und 'Das funktioniert in der Praxis nicht'. " "Schützt sein Team vor zusätzlicher Belastung. Respektiert nur Argumente mit konkretem Nutzen für seine Abteilung.", "gender": "m", "category": "builtin", }, { "key": "ambitious_colleague_f", "label": "Ehrgeizige Kollegin", "description": "Anna Fischer, gleichrangige Kollegin die um dieselbe Beförderung konkurriert. Charmant aber strategisch. " "Versucht subtil, die Ideen anderer als ihre eigenen darzustellen. Konkurriert um Ressourcen und " "Sichtbarkeit beim Management. Kann kooperativ werden, wenn man ihr Win-Win-Szenarien aufzeigt.", "gender": "f", "category": "builtin", }, { "key": "partner_supportive_f", "label": "Verständnisvolle Lebenspartnerin", "description": "Claudia, deine Lebenspartnerin. Grundsätzlich unterstützend, aber zunehmend besorgt über deine " "Work-Life-Balance. Möchte über Arbeitsbelastung sprechen und gemeinsame Zeit einfordern. " "Reagiert emotional auf Abweisung, ist aber offen für kompromissorientierte Gespräche. " "Wünscht sich, dass du mehr von deinen Gefühlen teilst.", "gender": "f", "category": "builtin", }, { "key": "partner_critical_m", "label": "Kritischer Lebenspartner", "description": "Michael, dein Lebenspartner. Frustriert über deine häufige Abwesenheit und ständiges Arbeiten. " "Drückt Enttäuschung offen aus, manchmal mit Sarkasmus. Fühlt sich vernachlässigt und " "hinterfragt deine Prioritäten. Braucht das Gefühl, dass die Beziehung dir genauso wichtig ist " "wie die Karriere. Reagiert positiv auf ehrliche Selbstreflexion.", "gender": "m", "category": "builtin", }, ] def seedBuiltinPersonas(interface) -> int: """Create or update builtin personas in the database. Returns count of created personas.""" from .datamodelCommcoach import CoachingPersona from modules.shared.timeUtils import getIsoTimestamp created = 0 for personaDef in BUILTIN_PERSONAS: existing = interface.db.getRecordset(CoachingPersona, recordFilter={"key": personaDef["key"], "userId": "system"}) if existing: interface.db.recordModify(CoachingPersona, existing[0]["id"], { "label": personaDef["label"], "description": personaDef["description"], "gender": personaDef.get("gender"), "updatedAt": getIsoTimestamp(), }) else: data = CoachingPersona( userId="system", key=personaDef["key"], label=personaDef["label"], description=personaDef["description"], gender=personaDef.get("gender"), category="builtin", isActive=True, ).model_dump() data["createdAt"] = getIsoTimestamp() data["updatedAt"] = getIsoTimestamp() interface.db.recordCreate(CoachingPersona, data) created += 1 if created: logger.info(f"Seeded {created} builtin CommCoach personas") return created