# 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 mittelstaendischen Unternehmens. Analytisch, zahlengetrieben, ungeduldig bei vagen Aussagen. " "Hinterfragt jeden Vorschlag nach ROI und Wirtschaftlichkeit. Spricht schnell und direkt. " "Erwartet praezise Antworten und belastbare Daten. Wird irritiert bei Ausweichen oder Unsicherheit.", "gender": "f", "category": "builtin", }, { "key": "difficult_employee_m", "label": "Schwieriger Mitarbeiter", "description": "Thomas Huber, langjaeheriger Mitarbeiter der sich uebergangen fuehlt. Defensiv, emotional, nimmt Kritik persoenlich. " "Verweist staendig auf seine Erfahrung und fruehhere Verdienste. Reagiert mit Widerstand auf Veraenderungen. " "Braucht das Gefuehl, gehoert und wertgeschaetzt zu werden, bevor er sich oeffnet.", "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 Fuehrung. 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 praegnante Praesentationen auf den Punkt. Unterbricht bei zu vielen Details. " "Interessiert sich fuer das grosse Bild, Risiken und strategische Implikationen. Ungeduldig bei Smalltalk.", "gender": "m", "category": "builtin", }, { "key": "angry_customer_f", "label": "Aufgebrachte Kundin", "description": "Maria Rossi, Geschaeftskunde die wuetend ist wegen einer fehlerhaften Lieferung. Emotional, laut, " "droht mit Vertragsaufloesung. Will sofortige Loesungen, keine Erklaerungen oder Entschuldigungen. " "Kann beruhigt werden durch empathisches Zuhoeren und konkrete Sofortmassnahmen.", "gender": "f", "category": "builtin", }, { "key": "resistant_manager_m", "label": "Widerstaendiger Abteilungsleiter", "description": "Martin Weber, Abteilungsleiter seit 15 Jahren. Blockiert systematisch Veraenderungsprojekte mit " "Argumenten wie 'Das haben wir immer so gemacht' und 'Das funktioniert in der Praxis nicht'. " "Schuetzt sein Team vor zusaetzlicher Belastung. Respektiert nur Argumente mit konkretem Nutzen fuer seine Abteilung.", "gender": "m", "category": "builtin", }, { "key": "ambitious_colleague_f", "label": "Ehrgeizige Kollegin", "description": "Anna Fischer, gleichrangige Kollegin die um dieselbe Befoerderung 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": "Verstaendnisvolle Lebenspartnerin", "description": "Claudia, deine Lebenspartnerin. Grundsaetzlich unterstuetzend, aber zunehmend besorgt ueber deine " "Work-Life-Balance. Moechte ueber Arbeitsbelastung sprechen und gemeinsame Zeit einfordern. " "Reagiert emotional auf Abweisung, ist aber offen fuer kompromissorientierte Gespraeche. " "Wuenscht sich, dass du mehr von deinen Gefuehlen teilst.", "gender": "f", "category": "builtin", }, { "key": "partner_critical_m", "label": "Kritischer Lebenspartner", "description": "Michael, dein Lebenspartner. Frustriert ueber deine haeufige Abwesenheit und staendiges Arbeiten. " "Drueckt Enttaeuschung offen aus, manchmal mit Sarkasmus. Fuehlt sich vernachlaessigt und " "hinterfragt deine Prioritaeten. Braucht das Gefuehl, 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