diff --git a/README.md b/README.md index 6b210db..212708d 100644 --- a/README.md +++ b/README.md @@ -5,33 +5,57 @@ Stellt einen nativen Chatclient für das Hermes Agent Gateway bereit — mit Echtzeit-Nachrichten via WebSocket/DDP und REST-API für ausgehende Antworten. -## Features +--- -- **Echtzeit-Streaming**: WebSocket/DDP für sofortige eingehende Nachrichten -- **Präsenz-Status**: Grüner Online-Indikator im Rocket.Chat -- **Markdown-Support**: Fett, kursiv, Inline-Code, Code-Blöcke, Links -- **Interaktive Buttons**: Ja/Nein, Bestätigen/Abbrechen, Mehrfachauswahl -- **Raum-Unterstützung**: Kanäle, private Gruppen, Direktnachrichten -- **Allowlist**: Steuerung, wer den Bot nutzen darf +## Schnellstart (für Neulinge) -## Installation +### 1. Voraussetzungen ```bash -# In dein Hermes Agent Verzeichnis wechseln -cd ~/.hermes/hermes-agent - -# Plugin-Verzeichnis anlegen -mkdir -p plugins/platforms/rocketchat - -# Diese drei Dateien hineinkopieren: -cp plugin.yaml plugins/platforms/rocketchat/ -cp __init__.py plugins/platforms/rocketchat/ -cp adapter.py plugins/platforms/rocketchat/ +sudo apt update && sudo apt install -y curl git python3 bash ``` -## Konfiguration +### 2. Plugin herunterladen -### Über Umgebungsvariablen +```bash +cd /tmp +git clone https://gitea.thomander.de/andreas/Hermes_rocket.chat_Plugin.git +cd Hermes_rocket.chat_Plugin +``` + +### 3. Installation starten + +```bash +./install.sh +``` + +Das Script führt dich Schritt für Schritt durch: +- 🔵 Prüfe Voraussetzungen (curl, git, python3) +- 🔵 Erstelle Plugin-Verzeichnis +- 🔵 Kopiere alle Dateien +- 🔵 Frage deine Rocket.Chat-Daten ab +- 🔵 Teste die Verbindung +- 🔵 Schreibe Konfiguration in `~/.hermes/.env` + +Am Ende ist das Plugin einsatzbereit — einfach `hermes gateway start`. + +--- + +## Manuelle Installation (Experten) + +Wer das Setup lieber von Hand macht: + +```bash +# Plugin-Verzeichnis anlegen +mkdir -p ~/.hermes/hermes-agent/plugins/platforms/rocketchat + +# Dateien hineinkopieren +cp plugin.yaml ~/.hermes/hermes-agent/plugins/platforms/rocketchat/ +cp __init__.py ~/.hermes/hermes-agent/plugins/platforms/rocketchat/ +cp adapter.py ~/.hermes/hermes-agent/plugins/platforms/rocketchat/ +``` + +### Konfiguration über Umgebungsvariablen ```bash export ROCKETCHAT_BASE_URL="https://rocketchat.example.com" @@ -42,7 +66,7 @@ export ROCKETCHAT_ALLOWED_USERS="andreas,max" # optional export ROCKETCHAT_ALLOW_ALL_USERS="false" # default ``` -### Über `config.yaml` +### Konfiguration über `config.yaml` ```yaml plugins: @@ -52,14 +76,49 @@ plugins: base_url: "https://rocketchat.example.com" user: "bernd" password: "dein-passwort" - room_id: "J3jvMyrKTMzKvKHSh" # optional - allowed_users: ["andreas", "max"] # optional - allow_all_users: false # default + room_id: "J3jvMyrKTMzKvKHSh" + allowed_users: ["andreas", "max"] + allow_all_users: false ``` -## Abhängigkeiten +--- -Keine externen Pakete erforderlich — nutzt ausschließlich Python-Standardbibliothek (`urllib`, `socket`, `ssl`, `threading`). +## Features + +| Feature | Beschreibung | +|---------|-------------| +| 🚀 Echtzeit-Streaming | DDP/WebSocket für sofortige eingehende Nachrichten | +| 🟢 Präsenz | Grüner Online-Status im Rocket.Chat | +| ✍️ Markdown | Fett, kursiv, `Code`, Blöcke, Links | +| 🔘 Interaktive Buttons | Ja/Nein, Bestätigen/Abbrechen, Mehrfachauswahl | +| 📢 Räume | Kanäle, private Gruppen, Direktnachrichten | +| 🔒 Allowlist | Steuerung, wer den Bot nutzen darf | +| 📦 Zero-Dependency | Nur Python-Standardbibliothek | + +--- + +## Was ist im Paket? + +``` +Hermes_rocket.chat_Plugin/ +├── install.sh ← Interaktives Setup für neue Benutzer +├── README.md ← Diese Datei +├── COMMUNITY_POST.md ← Fertige Vorlage für Foren/Reddit +├── plugin.yaml ← Plugin-Metadaten +├── __init__.py ← Plugin-Einstieg, Button-Templates +├── adapter.py ← DDP/WebSocket + REST Adapter +└── LICENSE ← Unlicense (Public Domain) +``` + +--- + +## Hilfe & Support + +- **Hermes Agent Docs**: https://hermes-agent.nousresearch.com/ +- **Rocket.Chat**: https://www.rocket.chat/ +- **Dieses Repo**: https://gitea.thomander.de/andreas/Hermes_rocket.chat_Plugin + +--- ## Lizenz diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..53b60fe --- /dev/null +++ b/install.sh @@ -0,0 +1,186 @@ +/usr/bin/env bash +# install.sh +# Rocket.Chat Plugin für Hermes Agent — Interaktives Setup +# Voraussetzungen: bash, curl, git, python3 + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PLUGIN_NAME="rocketchat" +HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}" +PLUGIN_DEST="$HERMES_HOME/hermes-agent/plugins/platforms/$PLUGIN_NAME" + +ECHO_OK() { echo -e " ✅ $1"; } +ECHO_ERR() { echo -e " ❌ $1"; } +ECHO_INFO() { echo -e " ℹ️ $1"; } +ECHO_STEP() { echo -e "\n🔵 $1"; } +ECHO_WARN() { echo -e " ⚠️ $1"; } + +# ── Schritt 1: Prerequisites ── +ECHO_STEP "1/7 Prüfe Voraussetzungen" + +MISSING="" +for cmd in curl git python3; do + if command -v "$cmd" &>/dev/null; then + ECHO_OK "$cmd installiert" + else + ECHO_ERR "$cmd fehlt" + MISSING="$MISSING $cmd" + fi +done + +if [[ -n "$MISSING" ]]; then + ECHO_WARN "Folgende Pakete müssen nachinstalliert werden:" + echo " sudo apt update && sudo apt install -y$MISSING" + read -rp " Pakete jetzt installieren? [j/N] " ans + if [[ "$ans" =~ ^[Jj]$ ]]; then + sudo apt update && sudo apt install -y $MISSING + else + echo "Abbruch. Bitte installiere:$MISSING" + exit 1 + fi +fi + +# ── Schritt 2: Zielverzeichnis anlegen ── +ECHO_STEP "2/7 Erstelle Plugin-Verzeichnis" + +if [[ -d "$PLUGIN_DEST" ]]; then + ECHO_WARN "Verzeichnis existiert bereits: $PLUGIN_DEST" + read -rp " Überschreiben? [j/N] " ans + if [[ "$ans" =~ ^[Jj]$ ]]; then + rm -rf "$PLUGIN_DEST" + else + echo "Abbruch." + exit 1 + fi +fi + +mkdir -p "$PLUGIN_DEST" +ECHO_OK "Verzeichnis angelegt: $PLUGIN_DEST" + +# ── Schritt 3: Dateien kopieren ── +ECHO_STEP "3/7 Kopiere Plugin-Dateien" + +for f in plugin.yaml __init__.py adapter.py; do + if [[ -f "$SCRIPT_DIR/$f" ]]; then + cp "$SCRIPT_DIR/$f" "$PLUGIN_DEST/" + ECHO_OK "$f kopiert" + else + ECHO_ERR "$f nicht im aktuellen Verzeichnis gefunden" + exit 1 + fi +done + +# ── Schritt 4: Konfiguration erfragen ── +ECHO_STEP "4/7 Konfiguration" + +read -rp " Rocket.Chat Basis-URL (z.B. https://chat.example.com): " RC_URL +[[ -z "$RC_URL" ]] && { ECHO_ERR "URL darf nicht leer sein"; exit 1; } + +read -rp " Rocket.Chat Benutzername: " RC_USER +[[ -z "$RC_USER" ]] && { ECHO_ERR "Benutzername darf nicht leer sein"; exit 1; } + +read -rsp " Rocket.Chat Passwort: " RC_PASS +echo +[[ -z "$RC_PASS" ]] && { ECHO_ERR "Passwort darf nicht leer sein"; exit 1; } + +read -rp " Standard-Raumname (z.B. #ki-assistent) [optional]: " RC_ROOM + +# ── Schritt 5: Verbindungstest ── +ECHO_STEP "5/7 Teste Verbindung zu Rocket.Chat" + +LOGIN_RESP=$(curl -s -H "Content-Type: application/json" \ + -d "{\"user\":\"$RC_USER\",\"password\":\"$RC_PASS\"}" \ + "${RC_URL%/}/api/v1/login" 2>/dev/null) || true + +if [[ -z "$LOGIN_RESP" ]] || ! echo "$LOGIN_RESP" | grep -q '"status":"success"'; then + ECHO_ERR "Login fehlgeschlagen" + echo " URL : $RC_URL" + echo " User: $RC_USER" + read -rp " Parameter bearbeiten? [j/N] " ans + if [[ "$ans" =~ ^[Jj]$ ]]; then + exec "$0" # Neustart + fi + exit 1 +fi + +AUTH_TOKEN=$(echo "$LOGIN_RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['authToken'])") +USER_ID=$(echo "$LOGIN_RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['userId'])") + +ECHO_OK "Login erfolgreich (UserID: $USER_ID)" + +# Raum auflösen, wenn angegeben +ROOM_ID="" +if [[ -n "$RC_ROOM" ]]; then + ROOM_QUERY="${RC_ROOM/#\#}" + ROOM_RESP=$(curl -s -H "X-Auth-Token: $AUTH_TOKEN" -H "X-User-Id: $USER_ID" \ + "${RC_URL%/}/api/v1/rooms.info?roomName=$ROOM_QUERY" 2>/dev/null) || true + + if echo "$ROOM_RESP" | grep -q '"success":true'; then + ROOM_ID=$(echo "$ROOM_RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['room']['_id'])") + ECHO_OK "Raum gefunden: #$ROOM_QUERY (RoomID: $ROOM_ID)" + else + ECHO_WARN "Raum '#$ROOM_QUERY' nicht gefunden — überspringe" + fi +fi + +# ── Schritt 6: Env-Variablen setzen ── +ECHO_STEP "6/7 Schreibe Konfiguration" + +ENV_FILE="$HERMES_HOME/.env" +mkdir -p "$HERMES_HOME" +touch "$ENV_FILE" + +# Alte Einträge entfernen +sed -i '/^ROCKETCHAT_/d' "$ENV_FILE" 2>/dev/null || true + +{ + echo "" + echo "# Rocket.Chat Plugin — generiert von install.sh am $(date +%Y-%m-%d)" + echo "export ROCKETCHAT_BASE_URL=\"$RC_URL\"" + echo "export ROCKETCHAT_USER=\"$RC_USER\"" + echo "export ROCKETCHAT_PASSWORD=\"$RC_PASS\"" + [[ -n "$ROOM_ID" ]] && echo "export ROCKETCHAT_ROOM_ID=\"$ROOM_ID\"" + echo "export ROCKETCHAT_ALLOW_ALL_USERS=\"false\"" +} >> "$ENV_FILE" + +ECHO_OK "~/.hermes/.env aktualisiert" + +# Optional: config.yaml Eintrag anzeigen +ECHO_INFO "Falls du config.yaml bevorzugst, füge Folgendes hinzu:" +cat </dev/null; then + # Versuche Gateway sauber neu zu starten + hermes gateway stop 2>/dev/null || true + sleep 1 + ECHO_OK "Hermes Gateway gestoppt" + echo "" + echo " Starte neu mit:" + echo " hermes gateway start" + echo "" +else + ECHO_WARN "'hermes' Befehl nicht im PATH gefunden" + echo " Bitte starte Hermes Gateway manuell:" + echo " hermes gateway start" +fi + +ECHO_STEP "✨ Fertig!" +ECHO_OK "Plugin installiert unter: $PLUGIN_DEST" +ECHO_INFO "Env-Variablen geladen in: $ENV_FILE" +ECHO_INFO "Rocket.Chat Plugin ist bereit."