Welle 3 · Lucys Freiheiten je Aktionsart, Rückfragen mit „ja 7“, Lucy untersucht rote Hinweise, Wochenbericht

- services/lucy_autonomie.py: Stufe je Aktionsart (nur lesen, erst fragen, selbst handeln), Start „mehr Freiheit“;
  Meldung danach (POST /api/lucy/gehandelt)
- services/rueckfragen.py: nummerierte Rückfragen, nur Knöpfe der Oberfläche (ERLAUBT), „ja“ führt genau die
  gespeicherte Aktion aus, 24 h gültig, hinfällig wenn der Hinweis weg ist, Nachprüfung danach
- notify.sh -k: Antworttasten (Antworttastatur über den Direktweg, ohne Eingriff in Hermes)
- services/ermittlung.py: Wächter meldet rote Hinweise an Lucy; Knopf wird Rückfrage, Lucy sieht über den
  api_server nach und schickt Ursache und Weg als eine Nachricht
- services/wochenbericht.py + mc2-wochenbericht.timer (So 07:30): feste Sätze, Absatz vom Modell, offene
  App-Updates als Rückfragen
- MCP: Werkzeuge fragen die Freiheiten (auf_bitte), neu: freiheiten, rueckfragen, rueckfrage_beantworten,
  sicherheitsupdates_einspielen, snapshot_zurueckspielen, snapshots, geraet_logs, dienst_logs
- Ausführer-Aktion journal (nur lesend), POST /api/homelab/ziele/{id}/sicherheitsupdates
- Läufe des Homelabs mit flock (Oberfläche und Steward schreiben beide)
- Skill homelab-orchestrator, SOUL-Abschnitt als Kopie in deploy/nur-box

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-25 19:12:50 +02:00
co-authored by Claude Opus 5.5
parent dd23f3fb4c
commit 12cefb427a
37 changed files with 2649 additions and 169 deletions
+45 -16
View File
@@ -8,6 +8,7 @@
# Nutzung: notify.sh "Nachricht" (oder via stdin: echo msg | notify.sh)
# notify.sh -s "[Update]" "Text" (Betreffzeile voranstellen)
# notify.sh -d -s "[Update]" "…" (dringend: geht auch nachts sofort raus)
# notify.sh -k "ja 7|nein 7" -s "[Rückfrage]" "…" (Antworttasten, seit 25.09.2026)
#
# Nachtruhe (User-Entscheid 24.09.2026): Zwischen 00:00 und 06:59 wird alles, was nicht dringend
# ist, in der Nacht-Warteschlange gesammelt und um 07:00 von morgenmeldung.sh als EINE Meldung
@@ -19,7 +20,7 @@
# MC_NOTIFY_STRICT=1: Exit 1, wenn Telegram scheitert (für morgenmeldung.sh, damit nichts verloren geht).
# Test-Schalter: MC_NOTIFY_STUNDE (Stunde vortäuschen), MC_NIGHT_QUEUE, MC_NOTIFY_HERMES (hermes-Befehl),
# MC_TELEGRAM_ENV (Datei mit TELEGRAM_BOT_TOKEN/TELEGRAM_HOME_CHANNEL), MC_TELEGRAM_API (Bot-API-Adresse),
# MC_NOTIFY_OHNE_WALL=1 (kein wall im letzten Ausweg).
# MC_NOTIFY_OHNE_WALL=1 (kein wall im letzten Ausweg), MC_NOTIFY_PYTHON (Python für die Antworttasten).
set -uo pipefail
LOG="${MC_NOTIFY_LOG:-$HOME/mc2-notify.log}"
@@ -29,12 +30,14 @@ TG_ENV="${MC_TELEGRAM_ENV:-$HOME/.hermes/.env}"
TG_API="${MC_TELEGRAM_API:-https://api.telegram.org}"
SUBJECT=""
DRINGEND=0
KNOEPFE=""
while getopts ":s:d" opt; do
while getopts ":s:dk:" opt; do
case "$opt" in
s) SUBJECT="$OPTARG" ;;
d) DRINGEND=1 ;;
*) echo "usage: notify.sh [-d] [-s subject] <nachricht>" >&2; exit 2 ;;
k) KNOEPFE="$OPTARG" ;;
*) echo "usage: notify.sh [-d] [-k 'ja 7|nein 7'] [-s subject] <nachricht>" >&2; exit 2 ;;
esac
done
shift $((OPTIND - 1))
@@ -96,6 +99,10 @@ lucy_kopf() {
*deploy*) echo "Commander, Bericht vom Deploy." ;;
*erinnerung*) echo "Commander, eine Erinnerung." ;;
*radar*) echo "Commander, Bericht vom Modell-Radar." ;;
*rückfrage*) echo "Commander, eine Rückfrage." ;;
*"lucy selbst"*) echo "Commander, das habe ich selbst erledigt." ;;
*"lucy ermittelt"*) echo "Commander, ich habe nachgesehen." ;;
*wochenbericht*) echo "Commander, dein Wochenbericht." ;;
"") echo "Commander, kurz gesagt:" ;;
*) echo "Commander, $(printf '%s' "$SUBJECT" | tr -d '[]')." ;;
esac
@@ -112,6 +119,9 @@ lucy_marke() {
*box-problem*) echo "Box, Störung" ;;
*"box wieder ok"*) echo "Box, Entwarnung" ;;
*box-update*) echo "Box, Wartung" ;;
*rückfrage*) echo "Rückfrage" ;;
*"lucy selbst"*) echo "Selbst erledigt" ;;
*"lucy ermittelt"*) echo "Nachgesehen" ;;
*) printf '%s' "$SUBJECT" | tr -d '[]' ;;
esac
}
@@ -129,17 +139,6 @@ if [ "$DRINGEND" != "1" ] && [ "$((10#$HOUR))" -lt 7 ]; then
exit 0
fi
# Primärweg: Telegram via hermes send (Login-Shell-PATH, falls aus Timer/cron aufgerufen). Die Kopfzeile ist Lucys.
if [ -n "$KOPF" ]; then
SEND_OUT="$(bash -lc '"$1" send --to telegram --subject "$2" -- "$3"' _ "$HERMES_BIN" "$KOPF" "$MSG" 2>&1)"
else
SEND_OUT="$(bash -lc '"$1" send --to telegram -- "$2"' _ "$HERMES_BIN" "$MSG" 2>&1)"
fi
if [ $? -eq 0 ]; then
echo "$TS OK telegram: $MSG" >> "$LOG"
exit 0
fi
# Zweitweg: direkt an die Bot-API. Das Token geht über --config auf stdin an curl, damit es nicht
# in der Prozessliste steht.
env_wert() {
@@ -173,7 +172,8 @@ $MSG"
printf 'url = "%s/bot%s/sendMessage"\n' "$TG_API" "$token" \
| curl -sf -m 15 -o /dev/null --config - \
--data-urlencode "chat_id=$chat" --data-urlencode "text=$text" \
${thread:+--data-urlencode "message_thread_id=$thread"}
${thread:+--data-urlencode "message_thread_id=$thread"} \
${MARKUP:+--data-urlencode "reply_markup=$MARKUP"}
rc=$?
case "$rc" in
0) return 0 ;;
@@ -184,7 +184,36 @@ $MSG"
esac
return 1
}
if telegram_direkt; then
# Antworttasten (-k "ja 7|nein 7", Rückfragen seit 25.09.2026): eine Tastatur unter dem Eingabefeld. Ein Tipp schickt
# nur diesen Text — Lucy liest ihn wie jede Nachricht, an Hermes ändert das nichts. Zwei je Reihe, nach dem ersten Tipp
# klappt sie weg. hermes send kann keine Tastatur mitschicken, deshalb geht eine Nachricht mit Tasten zuerst direkt.
MARKUP=""
if [ -n "$KNOEPFE" ]; then
MARKUP="$("${MC_NOTIFY_PYTHON:-python3}" - "$KNOEPFE" 2>/dev/null <<'PY'
import json, sys
k = [x.strip() for x in sys.argv[1].split("|") if x.strip()][:8]
print(json.dumps({"keyboard": [[{"text": t} for t in k[i:i + 2]] for i in range(0, len(k), 2)],
"one_time_keyboard": True, "resize_keyboard": True}, ensure_ascii=False))
PY
)"
fi
if [ -n "$MARKUP" ] && telegram_direkt; then
echo "$TS OK telegram direkt: $MSG" >> "$LOG"
exit 0
fi
# Primärweg: Telegram via hermes send (Login-Shell-PATH, falls aus Timer/cron aufgerufen). Die Kopfzeile ist Lucys.
if [ -n "$KOPF" ]; then
SEND_OUT="$(bash -lc '"$1" send --to telegram --subject "$2" -- "$3"' _ "$HERMES_BIN" "$KOPF" "$MSG" 2>&1)"
else
SEND_OUT="$(bash -lc '"$1" send --to telegram -- "$2"' _ "$HERMES_BIN" "$MSG" 2>&1)"
fi
if [ $? -eq 0 ]; then
echo "$TS OK telegram: $MSG" >> "$LOG"
exit 0
fi
if [ -z "$MARKUP" ] && telegram_direkt; then
# „OK telegram direkt“: services/update_verlauf.py erkennt beide Wege.
echo "$TS OK telegram direkt: $MSG" >> "$LOG"
exit 0