Erinnerungen & Routinen (A3): Wecker in MC2 + Hermes-Tools
- services/reminders.py: persistenter Store (/srv/models/mc2-reminders.json), Wecker-Loop feuert in Briefkasten (Lucy spricht) + Telegram; repeat daily/weekdays/weekly; naive Zeiten = Commander-TZ (Europe/Berlin, Box ist UTC); verpasste Einmal-Erinnerungen feuern verspätet nach (ehrlich markiert) - routers/reminders.py: GET/POST/DELETE /api/reminders - mcp_mc.py: reminder_create/list/delete (Guards, ISO aus Sofort-Kontext) - announce.notify_telegram als gemeinsamer Helper (sentry nutzt ihn jetzt) - requirements: tzdata (zoneinfo-Fallback, Windows-Dev) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -273,6 +273,46 @@ def apply_update(kind: str) -> str:
|
||||
return json.dumps(_post(routes[kind]), ensure_ascii=False, indent=2)
|
||||
|
||||
|
||||
# ── Erinnerungen & Routinen (A3): die Box sagt dem Commander zur Zeit aktiv Bescheid ─────────
|
||||
@mcp.tool()
|
||||
def reminder_create(text: str, when: str, repeat: str = "") -> str:
|
||||
"""Legt eine Erinnerung an: zur angegebenen Zeit sagt die Box dem Commander den Text AKTIV
|
||||
an (Lucy spricht + Telegram). NUR nutzen, wenn der Commander ausdrücklich erinnert werden
|
||||
will ('erinner mich', 'sag mir um', 'jeden Morgen').
|
||||
when = ISO-8601 mit Datum UND Uhrzeit in der Lokalzeit des Commanders, z.B. 2026-07-04T09:00.
|
||||
Relative Angaben ('in 20 Minuten', 'morgen früh') selbst aus der aktuellen Zeit im Kontext
|
||||
umrechnen. repeat: '' einmalig | daily (täglich) | weekdays (Mo–Fr) | weekly (wöchentlich).
|
||||
text = die Ansage selbst, kurz und direkt (ohne 'Erinnerung:' davor — das ergänzt die Box)."""
|
||||
try:
|
||||
item = _post("/api/reminders", {"text": text, "when": when, "repeat": repeat})["item"]
|
||||
except httpx.HTTPStatusError as e:
|
||||
return f"Fehlgeschlagen: {e.response.json().get('detail', e.response.text[:200])}"
|
||||
rep = {"daily": " (täglich)", "weekdays": " (werktags)", "weekly": " (wöchentlich)"}.get(item["repeat"], "")
|
||||
return f"Erinnerung #{item['id']} angelegt: {item['when_local']}{rep} — „{item['text']}“"
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
def reminder_list() -> str:
|
||||
"""Zeigt alle anstehenden Erinnerungen/Routinen (Nummer, Zeit, Text). Vor dem Löschen
|
||||
hiermit die Nummer ermitteln."""
|
||||
items = _get("/api/reminders")["items"]
|
||||
if not items:
|
||||
return "Keine Erinnerungen angelegt."
|
||||
rep = {"daily": " · täglich", "weekdays": " · werktags", "weekly": " · wöchentlich"}
|
||||
return "\n".join(f"#{i['id']} · {i['when_local']}{rep.get(i['repeat'], '')} — {i['text']}" for i in items)
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
def reminder_delete(reminder_id: int) -> str:
|
||||
"""Löscht eine Erinnerung/Routine endgültig (Nummer aus reminder_list). NUR auf
|
||||
ausdrücklichen Wunsch des Commanders."""
|
||||
try:
|
||||
gone = _delete(f"/api/reminders/{reminder_id}")["deleted"]
|
||||
except httpx.HTTPStatusError as e:
|
||||
return f"Fehlgeschlagen: {e.response.json().get('detail', e.response.text[:200])}"
|
||||
return f"Erinnerung #{gone['id']} gelöscht ({gone['when_local']} — „{gone['text']}“)."
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
def service_logs(service: str, lines: int = 100) -> str:
|
||||
"""Liest die letzten Log-Zeilen eines Dienstes (Diagnose). service z.B. hermes-gateway,
|
||||
|
||||
Reference in New Issue
Block a user