diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 2ed7738..3119fe1 100644 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -89,6 +89,9 @@ cp "$SRC/deploy/mc2-selfsmoke.timer" "$HOME/.config/systemd/user/mc2-selfsmoke.t # Bagatell-Annahme (Ideen-Queue, 10.07.2026): reine Doku-Vorschläge nachts ohne Klick einspielen. cp "$SRC/deploy/mc2-bagatell.service" "$HOME/.config/systemd/user/mc2-bagatell.service" cp "$SRC/deploy/mc2-bagatell.timer" "$HOME/.config/systemd/user/mc2-bagatell.timer" +# Morgen-Digest (Nächtliche Telegram-Zusammenfassung, 26.07.2026): fasst alle Meldungen zwischen 0 und 7 Uhr zusammen. +cp "$SRC/deploy/mc2-morgen-digest.service" "$HOME/.config/systemd/user/mc2-morgen-digest.service" +cp "$SRC/deploy/mc2-morgen-digest.timer" "$HOME/.config/systemd/user/mc2-morgen-digest.timer" # Evolution-Radar-Feed (Autonomie E4): Hermes-cron speist ihn als Prompt ein. # Cron-Job selbst wird EINMALIG registriert (hermes cron create, siehe docs/RUNBOOK.md). mkdir -p "$HOME/.hermes/scripts" @@ -248,6 +251,7 @@ systemctl --user enable --now mc2-backup.timer >/dev/null 2>&1 || true # Router/Engine/Hermes dürfen So 04:30 automatisch (Fangnetz Backup→Postcheck→Rollback+Pin). systemctl --user enable --now mc2-selfsmoke.timer >/dev/null 2>&1 || true systemctl --user enable --now mc2-bagatell.timer >/dev/null 2>&1 || true +systemctl --user enable --now mc2-morgen-digest.timer >/dev/null 2>&1 || true loginctl enable-linger "$USER" >/dev/null 2>&1 || true # Mem0-Sidecar VOR dem Backend (re)starten, damit /api/memory sofort bedient wird. [ -x "$HOME/.mem0/venv/bin/python" ] && systemctl --user restart mem0-service 2>/dev/null || true diff --git a/deploy/mc2-morgen-digest.service b/deploy/mc2-morgen-digest.service new file mode 100644 index 0000000..2e182d3 --- /dev/null +++ b/deploy/mc2-morgen-digest.service @@ -0,0 +1,7 @@ +[Unit] +Description=MC2 Morgen-Digest (Nächtliche Telegram-Zusammenfassung) + +[Service] +Type=oneshot +ExecStart=/bin/bash %h/mission-control-v2/deploy/morgen-digest.sh +TimeoutStartSec=300 diff --git a/deploy/mc2-morgen-digest.timer b/deploy/mc2-morgen-digest.timer new file mode 100644 index 0000000..60c22b5 --- /dev/null +++ b/deploy/mc2-morgen-digest.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Timer für MC2 Morgen-Digest (07:00 Uhr) + +[Timer] +OnCalendar=*-*-* 07:00:00 +Persistent=true +RandomizedDelaySec=5m + +[Install] +WantedBy=timers.target diff --git a/deploy/morgen-digest.sh b/deploy/morgen-digest.sh new file mode 100644 index 0000000..92629c6 --- /dev/null +++ b/deploy/morgen-digest.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +# Morgen-Digest: Sammelt die zurückgehaltenen nächtlichen Meldungen (00:00 - 06:59) +# und lässt Lucy (LLM) eine Telegram-Zusammenfassung daraus bauen. +set -uo pipefail + +NIGHT_QUEUE="$HOME/.hermes/night-queue.txt" +if [ ! -f "$NIGHT_QUEUE" ]; then + # Keine nächtlichen Meldungen + exit 0 +fi + +# Wenn die Datei existiert, aber leer ist, löschen und beenden. +if [ ! -s "$NIGHT_QUEUE" ]; then + rm -f "$NIGHT_QUEUE" + exit 0 +fi + +EVIDENCE="$(cat "$NIGHT_QUEUE")" + +PROMPT="Du bist Lucy, die KI-Assistenz der Mission-Control-Box. +Hier sind die Systemmeldungen der vergangenen Nacht. +Fasse sie für den Commander zu einem kurzen, kompakten Morgen-Digest zusammen. +Es soll sich flüssig lesen, Wichtiges (Erfolge/Probleme) hervorheben und redundante Infos bündeln. +Schreibe eine schöne, direkte Telegram-Nachricht. + +Nächtliche Meldungen: +$EVIDENCE" + +# LLM aufrufen (llama-swap / gpt-oss-120b) +ENDPOINT="${CHEF_ENDPOINT:-http://127.0.0.1:8080/v1/chat/completions}" +MODEL="${CHEF_MODEL:-gpt-oss-120b}" + +REQ="$(jq -n --arg m "$MODEL" --arg sys "Du bist Lucy." --arg usr "$PROMPT" --argjson mt 1200 \ + '{model:$m, messages:[{role:"system",content:$sys},{role:"user",content:$usr}], + max_tokens:$mt, temperature:0.4}')" + +DIGEST="$(curl -s -m 180 "$ENDPOINT" -H 'Content-Type: application/json' --data-binary "$REQ" \ + | python3 -c ' +import json, sys +try: + d = json.load(sys.stdin) + msg = d["choices"][0]["message"] + print((msg.get("content") or msg.get("reasoning_content") or "").strip()) +except Exception: + pass' +)" + +if [ -n "$DIGEST" ]; then + # Sende den Digest via hermes send (Telegram) + bash -lc 'hermes send --to telegram --subject "[🌅 Morgen-Digest]" -- "$1"' _ "$DIGEST" + if [ $? -eq 0 ]; then + # Erfolgreich gesendet, Queue leeren + rm -f "$NIGHT_QUEUE" + else + echo "Fehler beim Senden des Morgen-Digests an Telegram. Queue bleibt erhalten." >&2 + fi +else + echo "Leerer Digest vom LLM. Queue bleibt erhalten." >&2 +fi diff --git a/deploy/notify.sh b/deploy/notify.sh index c2d4e39..5a2561c 100644 --- a/deploy/notify.sh +++ b/deploy/notify.sh @@ -41,6 +41,23 @@ PY )" >/dev/null 2>&1 || true fi +# Nachtweiche: Zwischen 00:00 und 06:59 Uhr (inklusive) fangen wir Telegram-Nachrichten ab +# und sammeln sie für den Morgen-Digest, ES SEI DENN es ist ein Alarm. +HOUR="$(date +%H)" +if [ "$HOUR" -ge 0 ] && [ "$HOUR" -lt 7 ]; then + case "${SUBJECT,,}" in + *alarm*|*notfall*) + ;; # Alarme gehen immer sofort durch + *) + # Sammeln für Morgen-Digest + NIGHT_QUEUE="$HOME/.hermes/night-queue.txt" + echo "- ${SUBJECT:+$SUBJECT: }$MSG" >> "$NIGHT_QUEUE" + echo "$TS QUEUED für Morgen-Digest: $MSG" >> "$LOG" + exit 0 + ;; + esac +fi + # Primärweg: Telegram via hermes send (Login-Shell-PATH, falls aus Timer/cron aufgerufen). if [ -n "$SUBJECT" ]; then SEND_OUT="$(bash -lc 'hermes send --to telegram --subject "$1" -- "$2"' _ "$SUBJECT" "$MSG" 2>&1)"