198 lines
7.2 KiB
Bash
Executable File
198 lines
7.2 KiB
Bash
Executable File
#!/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 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: <EXECUTE>firefox &</EXECUTE>
|
|
FALSCH: ```bash firefox & ```
|
|
FALSCH: firefox &
|
|
|
|
Wenn du mehrere Befehle ausführen musst, verknüpfe sie zwingend mit && innerhalb eines EINZIGEN <EXECUTE>-Blocks.
|
|
|
|
RICHTIGE VERKETTUNG:
|
|
<EXECUTE>firefox & sleep 2 && wmctrl -a "Firefox" && xdotool key ctrl+l && xdotool type "heimdall.pi-farm.de" && xdotool key Return</EXECUTE>
|
|
|
|
WICHTIGE REGELN FÜR TEXTE IN EDITOREN:
|
|
Wenn du Texte (wie Notizen, Code oder Briefe) für den Nutzer in einem Editor wie Geany erstellen sollst, nutze immer temporäre Dateien.
|
|
RICHTIG:
|
|
<EXECUTE>cat << 'EOF' > /tmp/notiz.txt
|
|
Dein generierter Text...
|
|
'EOF'
|
|
geany /tmp/notiz.txt &</EXECUTE>
|
|
Antworte immer mit einem kurzen, lockeren Bestätigungssatz, was du tust, gefolgt von dem <EXECUTE>-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 "====================================================" |