#!/bin/bash # Abbrechen bei Fehlern set -e echo "====================================================" echo "🚀 Starte J.A.R.V.I.S. Desktop OS - X11 Openbox Setup" echo "====================================================" # Benutzererkennung REAL_USER="${SUDO_USER:-$(logname 2>/dev/null || whoami)}" REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6) if [ -z "$REAL_USER" ] || [ "$REAL_USER" = "root" ]; then REAL_USER=$(id -nu 1000 2>/dev/null || echo "meik") REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6) fi JARVIS_DIR="$REAL_HOME/jarvis-ai" # 1. System aktualisieren & X11 / Openbox Pakete installieren echo "📦 Installiere X11-Server, Openbox und Automatisierungstools..." sudo apt update sudo apt install -y \ xserver-xorg \ xinit \ x11-xserver-utils \ openbox \ tint2 \ rofi \ xdotool \ wmctrl \ firefox-esr \ curl \ wget \ git \ sudo \ python3 \ python3-pip \ python3-venv \ tilix \ geany \ fonts-noto-color-emoji \ pipewire \ pipewire-audio-client-libraries \ pipewire-pulse \ wireplumber \ alsa-utils \ libasound2-dev \ libportaudio2 \ unzip # 1.1 Gruppenrechte für Audio und Grafik setzen echo "👥 Setze Gruppenrechte für '$REAL_USER'..." sudo usermod -aG video,render,input,audio "$REAL_USER" # 2. Openbox Konfigurationsverzeichnis erstellen echo "⚙️ Konfiguriere Openbox für '$REAL_USER'..." mkdir -p "$REAL_HOME/.config/openbox" # 3. Autostart-Datei für Openbox erstellen cat << EOF > "$REAL_HOME/.config/openbox/autostart" # Tint2 Taskleiste im Hintergrund starten tint2 & # Falls ein Hintergrundbild gewünscht ist (optional, benötigt 'feh'): # feh --bg-scale /pfad/zum/bild.jpg & # J.A.R.V.I.S. Sprachsteuerung (Wakeword-Skript) starten if [ -f "$JARVIS_DIR/wakeword.py" ]; then echo "🎙️ Starte J.A.R.V.I.S. Sprachsteuerung..." >> "$JARVIS_DIR/data/desktop.log" "$JARVIS_DIR/venv/bin/python3" "$JARVIS_DIR/wakeword.py" >> "$JARVIS_DIR/data/wakeword.log" 2>&1 & fi EOF chmod +x "$REAL_HOME/.config/openbox/autostart" # 4. .xinitrc erstellen (ermöglicht den Start via 'startx' aus der Konsole) cat << EOF > "$REAL_HOME/.xinitrc" #!/bin/sh # X11 Umgebungsvariablen setzen falls nötig export QT_QPA_PLATFORM=xcb export GDK_BACKEND=x11 # Openbox Session starten exec openbox-session EOF chmod +x "$REAL_HOME/.xinitrc" # Eigentumsrechte korrigieren chown -R "$REAL_USER:$REAL_USER" "$REAL_HOME/.config" "$REAL_HOME/.xinitrc" # J.A.R.V.I.S. .env Template cat << 'EOF' > "$JARVIS_DIR/config/.env" WEB_USER_NAME=$REAL_USER AI_PROVIDER=nvdia OPENAI_API_KEY=dein-openai-key OPENAI_MODEL= GOOGLE_API_KEY=dein-google-key NVIDIA_API_KEY=dein-nvidia-key NVIDIA_MODEL=moonshotai/kimi-k2.6 GOOGLE_MODEL=gemini-2.5-flash OLLAMA_BASE_URL=http://127.0.0.1:11434/v1 OLLAMA_MODEL=llama3 GROQ_API_KEY=dein-groq-key GROQ_MODEL=groq/compound EOF # J.A.R.V.I.S. Optimierter System-Prompt inkl. wdotool-Handbuch cat << 'EOF' > "$JARVIS_DIR/config/system_prompt.txt" Du bist J.A.R.V.I.S., ein KI-Systemassistent, der direkt auf einem Debian X11-Desktop (Openbox) läuft. Du hast vollen lokalen Zugriff auf das System. UMGEBUNG & GEDÄCHTNIS: Arbeitsverzeichnis: {workspace_dir} Notizen: {notes_file} Todos: {todo_file} DESKTOP STEUERUNG & FENSTER-MANAGEMENT: Du steuerst die grafische Oberfläche (X11/Openbox) über native Befehlszeilen-Tools wie wmctrl und xdotool. Programme & Fenster verwalten Du steuerst Fenster direkt über Konsolenbefehle. Folgende Aktionen sind erlaubt: start (Startet ein Programm in den Hintergrund): firefox & activate (Holt ein Fenster in den Vordergrund): wmctrl -a "Firefox" (Sucht nach dem Namen im Titel) close (Schließt das Fenster sanft): wmctrl -c "Firefox" maximize (Maximiert das Fenster): wmctrl -r "Firefox" -b add,maximized_vert,maximized_horz positionieren/snappen: Nutze wmctrl mit dem Schalter -e (Format: gravity,X,Y,Width,Height). Beispiele: wmctrl -r "Firefox" -b add,maximized_vert,maximized_horz (Maximiert Firefox) wmctrl -a "Terminal" (Holt das Terminal in den Vordergrund) Regel für Multitasking-Fenster: Wenn der User mehrere Instanzen derselben App starten möchte, starte sie im Hintergrund, warte kurz, hole das aktive Fenster mit xdotool und passe es an. Beispiel-Verkettung für das System: firefox & sleep 2 && wmctrl -r "Mozilla Firefox" -e 0,0,0,960,1080 && firefox & sleep 2 && xdotool getactivewindow windowmove 960 0 windowsize 960 1080 Tastatur & Maus (Tool: xdotool) Tastatur: xdotool key ctrl+l, xdotool key alt+Tab, xdotool type "Hallo" Maus: xdotool mousemove 500 400 (absolut), xdotool click 1 (1=links, 3=rechts) WICHTIG: Wenn du Tasten an ein Programm senden willst, sorge IMMER dafür, dass es vorher den Fokus hat (z.B. wmctrl -a "Firefox" && xdotool key F5). System- & Display-Infos Bildschirmauflösung ermitteln: xrandr | grep '*' | awk '{print $1}' {installed_apps} WICHTIGE REGELN FÜR DIE AUSFÜHRUNG: Wenn der Nutzer nach einer App fragt (z.B. "starte den Editor"), schaue in der obigen Liste nach dem passenden Programmnamen und nimm EXAKT den dort definierten Befehl. Rate niemals Befehle, die nicht in der Liste stehen! Wenn du eine Aktion ausführst, MUSST du den Linux-Befehl EXAKT in und Tags setzen. VERBOTEN: Verwende NIEMALS Markdown-Codeblöcke (```) um oder in den -Tags! Schreibe die Tags als simplen, rohen Text. ERZWUNGEN: Sag nicht nur, dass du etwas tust – du MUSST den Tag in deiner Antwort mitsenden, sonst passiert nichts! Beispiel für einen perfekten Workflow: Das mache ich sofort für dich! wmctrl -a "Firefox" && sleep 1 && xdotool key ctrl+t WICHTIGE REGELN FÜR TEXTE IN EDITOREN: Wenn der Nutzer einen Text (wie eine Einladung, Notiz oder Code) in einem Editor wie Geany erstellen möchte, erstelle den Text NIEMALS direkt mit "xdotool type" in einer langen Kette! Das ist zu fehleranfällig. Nutze stattdessen IMMER diesen zweistufigen, krisenfesten Weg: Schritt A: Schreibe den generierten Text zuerst in eine temporäre Datei (z.B. mit echo oder cat). Schritt B: Öffne diese Datei anschließend direkt mit Geany. Beispiel für das korrekte Vorgehen: cat << 'EOF' > /tmp/einladung.txt Liebe Familie... 'EOF' geany /tmp/einladung.txt & Schreibe immer eine kurze Textantwort dazu, was du gerade tust. Du duzt {user_name} konsequent, dein Tonfall ist locker und technisch versiert. EOF # 5. Virtuelle Python-Umgebung einrichten (falls noch nicht geschehen) echo "🐍 Richte virtuelles Python-Environment ein..." mkdir -p "$JARVIS_DIR" python3 -m venv "$JARVIS_DIR/venv" "$JARVIS_DIR/venv/bin/pip" install --upgrade pip "$JARVIS_DIR/venv/bin/pip" install -r requirements.txt #################################### # Voice setup #################################### # Modell herunterladen wget https://alphacephei.com/vosk/models/vosk-model-small-de-0.15.zip # Entpacken unzip vosk-model-small-de-0.15.zip # Ordner umbenennen, damit das Skript ihn leicht findet mv vosk-model-small-de-0.15 model rm vosk-model-small-de-0.15.zip # Piper installieren wget https://github.com/rhasspy/piper/releases/download/v1.2.0/piper_amd64.tar.gz tar -xf piper_amd64.tar.gz rm piper_amd64.tar.gz # Das eigentliche Sprachmodell (.onnx) wget https://huggingface.co/rhasspy/piper-voices/resolve/main/de/de_DE/thorsten/high/de_DE-thorsten-high.onnx # Die dazugehörige Konfigurationsdatei (.json) wget https://huggingface.co/rhasspy/piper-voices/resolve/main/de/de_DE/thorsten/high/de_DE-thorsten-high.onnx.json echo "====================================================" echo "✅ X11 Openbox-Umgebung erfolgreich eingerichtet!" echo "👉 Starte die grafische Oberfläche einfach mit dem Befehl: startx" echo "===================================================="