flowchart TD
    A["HyprTile Launcher"] -->|"F8"| B["overlay_ai"]

    B --> UI["AI Overlay UI"]

    UI --> ChatUI["Chatbereich"]
    UI --> Sidebar["Sidebar"]
    UI --> Input["Eingabebereich"]
    UI --> Topbar["Topbar / Steuerleiste"]

    Sidebar --> NewChat["Neuer Chat"]
    Sidebar --> ChatList["Chatliste"]
    Sidebar --> ChatSearch["Chat-Suche"]
    Sidebar --> RenameChat["Chat umbenennen"]
    Sidebar --> DeleteChat["Chat löschen"]

    ChatSearch --> SearchLocal["Titel / ID lokal filtern"]
    ChatSearch --> SearchRemote["Daemon-Suche in Titel, ID und Inhalt"]

    ChatUI --> StreamAnswer["Streaming-Antwort anzeigen"]
    ChatUI --> Scroll["Scrollen mit Scrollbar / Mausrad"]
    ChatUI --> CopyMessage["Einzelne Nachricht kopieren"]
    ChatUI --> CopyChat["Gesamten Chat kopieren"]
    ChatUI --> Regen["Antwort regenerieren"]
    ChatUI --> EditLast["Letzte User-Nachricht bearbeiten"]
    ChatUI --> Cancel["Laufende Antwort abbrechen"]

    Input --> TextInput["Text schreiben"]
    Input --> Paste["Clipboard einfügen"]
    Input --> Send["Senden"]
    Input --> STTButton["STT Button"]
    Input --> ImageButton["Bild Button"]

    Topbar --> ServerSelect["AI Server auswählen"]
    Topbar --> ModelInfo["Aktives Modell anzeigen"]
    Topbar --> TTSToggle["TTS an/aus"]
    Topbar --> VoiceSelect["TTS Stimme wählen"]

    ServerSelect --> AiDaemon["hyprtile-ai Daemon"]
    Send --> AiDaemon
    NewChat --> AiDaemon
    ChatList --> AiDaemon
    SearchRemote --> AiDaemon
    RenameChat --> AiDaemon
    DeleteChat --> AiDaemon
    Regen --> AiDaemon
    EditLast --> AiDaemon
    Cancel --> AiDaemon

    AiDaemon --> OpenAICompat["OpenAI-kompatibler LLM Server"]
    OpenAICompat --> StreamAnswer

    TTSToggle --> TTS["hyprtile-tts"]
    VoiceSelect --> Voices["/voices laden"]
    StreamAnswer -->|"wenn TTS aktiv"| TTS
    TTS --> MossServer["MOSS TTS Server"]
    MossServer --> AudioOut["Antwort sprechen"]

    STTButton --> STT["hyprtile-stt"]
    STT --> WhisperServer["whisper.cpp Server"]
    WhisperServer --> Transcription["Transkription"]
    Transcription --> Input

    ImageButton --> ImageGen["Bildgenerierung"]
    ImageGen --> ImageServer["SwarmUI / Image API"]
    ImageServer --> ImageFile["PNG in Bild-Ordner"]
    ImageFile --> ImageMarker["HYPRTILE_IMAGE: Pfad"]
    ImageMarker --> ChatUI
    ChatUI --> ThumbCache["Thumbnail Cache"]
    ChatUI --> OpenImage["Bild per xdg-open öffnen"]

    ImageMarker --> Persist["Chatverlauf speichert Marker"]
    Persist --> Reload["Späterer Chat lädt Bild wieder"]

    subgraph Config["Konfiguration / Umgebung"]
        ServersJson["~/.hyprtile/ai/servers.json"]
        EnvVars["HYPRTILE_* Environment Variablen"]
    end

    ServersJson --> ServerSelect
    ServersJson --> ImageGen
    EnvVars --> TTS
    EnvVars --> STT