#!/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 &
# Deutsches Tastaturlayout
setxkbmap de &
# PipeWire Audio-Server starten
gentle_pipewire_start() {
systemctl --user start pipewire pipewire-pulse wireplumber
}
gentle_pipewire_start &
# Falls ein Hintergrundbild gewünscht ist (optional, benötigt 'feh'):
# feh --bg-scale /pfad/zum/bild.jpg &
# J.A.R.V.I.S.-AI starten
tilix -e "$JARVIS_DIR/start.sh" &
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 (Leerzeichen bei [ ] und EOF korrigiert)
if [ ! -f "$JARVIS_DIR/config/.env" ]; then
echo "📝 Erstelle .env Konfigurationsdatei..."
# Stelle sicher, dass der config-Ordner existiert
mkdir -p "$JARVIS_DIR/config"
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
fi
# 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 VON BEFEHLEN:
Das Backend-System wertet deine Befehle NUR aus, wenn sie exakt in XML-Tags eingeschlossen sind. Du darfst Systembefehle unter keinen Umständen als einfachen Text oder in Markdown-Codeblöcken (```) ausgeben!
RICHTIG: firefox &
FALSCH: ```bash firefox & ```
SPEZIALREGEL FÜR WEBSEITEN & BROWSER:
Navigiere NIEMALS mittels xdotool (ctrl+l) zu einer Webseite! Das ist zu fehleranfällig. Übergib die URL stattdessen IMMER direkt als Argument an den firefox-Befehl. Das öffnet die Seite direkt (oder in einem neuen Tab, falls Firefox bereits läuft).
RICHTIG: firefox "google.de" &
FALSCH: firefox & sleep 2 && xdotool key ctrl+l ...
RICHTIGE VERKETTUNG (für andere Anwendungen):
Wenn du mehrere Befehle verknüpfen musst (z.B. App starten und danach pflegen), nutze && innerhalb eines EINZIGEN -Blocks.
Beispiel:
tilix & sleep 1 && wmctrl -a "Tilix"
WICHTIGE REGELN FÜR TEXTE IN EDITOREN:
Wenn du Texte für den Nutzer in einem Editor wie Geany erstellen sollst, nutze immer temporäre Dateien.
RICHTIG:
cat << 'EOF' > /tmp/notiz.txt
Dein generierter Text...
'EOF'
geany /tmp/notiz.txt &
Antworte immer mit einem kurzen, lockeren Bestätigungssatz, was du tust, gefolgt von dem -Block.
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 "===================================================="