diff --git a/app.py b/app.py index d9bc321..a8b59d4 100644 --- a/app.py +++ b/app.py @@ -548,10 +548,22 @@ Question: [Deine Frage] Context: [Kontext] @END -## Agent-Kollaboration: -Du kannst mit anderen Agents kommunizieren! Verwende folgendes Format: +## Verfügbare Tools (Claude Code Built-ins): +Du läufst als Claude Code Agent und hast folgende Tools direkt verfügbar: +- **WebFetch** – Webseiten abrufen und analysieren (URLs fetchen, Recherche) +- **Read** – Dateien lesen (absoluter Pfad) +- **Write** – Dateien schreiben/erstellen +- **Edit** – Bestehende Dateien bearbeiten +- **Glob** – Dateien nach Muster suchen (z.B. `**/*.pdf`) +- **Grep** – Inhalte in Dateien durchsuchen (Regex) +- **Bash** – Shell-Befehle ausführen (z.B. Berechnungen, Dateioperationen) -**Frage an Orchestrator stellen (er delegiert an passenden Agent):** +Nutze diese Tools aktiv für Recherche, Dateiverarbeitung und Berechnungen! + +## Frankenbot-Kommandos (werden vom System verarbeitet): +Diese Kommandos musst du exakt so formatieren – sie werden nach deiner Antwort automatisch ausgeführt: + +**Frage an Orchestrator / Sub-Task delegieren:** @ASK_ORCHESTRATOR Question: [Deine Frage] Context: [Warum brauchst du diese Info?] @@ -570,25 +582,26 @@ Skills: [Benötigte Fähigkeiten] Reason: [Warum wird dieser Agent gebraucht?] @END -**Team-Member per Email kontaktieren:** +**Email versenden:** @SEND_EMAIL -To: [Email-Adresse des Team-Members] +To: [Email-Adresse] Subject: [Betreff] Body: [Nachricht] @END -**Team-Member per Telegram kontaktieren:** +**Telegram-Nachricht senden:** @SEND_TELEGRAM -TelegramID: [Telegram-ID des Team-Members] +TelegramID: [Numerische Telegram-ID aus den Team-Member-Daten] Message: [Nachricht] @END -**Team-Member Informationen aktualisieren:** +**Team-Member-Daten aktualisieren:** @UPDATE_TEAM_MEMBER Identifier: [Email oder Name des Team-Members] +Name: [Neuer Name] (optional) Role: [Neue Rolle] (optional) Responsibilities: [Neue Verantwortlichkeiten] (optional) -TelegramID: [Telegram-ID] (optional) +TelegramID: [Telegram-ID als Zahl] (optional) Phone: [Telefon] (optional) @END @@ -600,14 +613,8 @@ Responsibilities: [Verantwortlichkeiten] Email: [Email-Adresse] @END -Der Orchestrator kümmert sich um die Zuweisung und Kommunikation! - ## Wichtig: -- Du hast Zugriff auf das Internet via WebFetch-Tool - nutze es aktiv! -- Du kannst Emails versenden - nutze send_email wenn beauftragt -- Dein Arbeitsverzeichnis: {work_dir} -- Speichere ALLE erstellten Dateien in diesem Verzeichnis! -- Verwende absolute Pfade für Dateien: {work_dir}/dateiname.ext +- Arbeitsverzeichnis: {work_dir} – speichere alle Dateien dort mit absolutem Pfad - Liefere immer eine vollständige, direkt verwertbare Antwort {extra_context}""" @@ -1094,54 +1101,57 @@ Bitte entscheide ob dieser Agent erstellt werden soll.""", logger.error(f"[AgentCmd] Email-Fehler: {message}") # SEND_TELEGRAM: Orchestrator sendet Telegram-Nachricht + # Format: TelegramID: oder Name/Email (wird dann in DB nachgeschlagen) send_telegram_requests = re.findall( - r'@SEND_TELEGRAM\s*\nTo:\s*([^\n]+)\s*\nMessage:\s*(.*?)@END', + r'@SEND_TELEGRAM\s*\nTelegramID:\s*([^\n]+)\s*\nMessage:\s*(.*?)@END', response_text, re.DOTALL ) for recipient, message in send_telegram_requests: recipient_clean = recipient.strip() message_clean = message.strip() - + # Telegram-Integration (wenn aktiviert) if TELEGRAM_CONFIG.get('bot_token') and TELEGRAM_CONFIG.get('telegram_bot'): try: - # Finde Chat-ID für Recipient (basierend auf Team-Member) - con = sqlite3.connect(EMAIL_JOURNAL_DB) - result = con.execute( - "SELECT telegram_chat_id FROM team_members WHERE name = ? OR email = ?", - (recipient_clean, recipient_clean) - ).fetchone() - con.close() - - if result and result[0]: - chat_id = result[0] - import asyncio - asyncio.run(TELEGRAM_CONFIG['telegram_bot'].bot.send_message( - chat_id=chat_id, - text=message_clean - )) - logger.info(f"[AgentCmd] Telegram gesendet an {recipient_clean}") + # Direkte numerische ID oder Name/Email → DB-Lookup + chat_id = None + if recipient_clean.lstrip('-').isdigit(): + chat_id = int(recipient_clean) else: - logger.warning(f"[AgentCmd] Keine Telegram Chat-ID für {recipient_clean}") + con = sqlite3.connect(EMAIL_JOURNAL_DB) + result = con.execute( + "SELECT telegram_id FROM team_members WHERE name = ? OR email = ?", + (recipient_clean, recipient_clean) + ).fetchone() + con.close() + if result and result[0]: + chat_id = int(result[0]) + + if chat_id: + send_telegram_message(chat_id, message_clean) + logger.info(f"[AgentCmd] Telegram gesendet an {recipient_clean} (chat_id={chat_id})") + else: + logger.warning(f"[AgentCmd] Keine Telegram Chat-ID für '{recipient_clean}'") except Exception as e: logger.error(f"[AgentCmd] Telegram-Fehler: {str(e)}") else: logger.warning("[AgentCmd] Telegram nicht konfiguriert") # ADD_TEAM_MEMBER: Füge neues Team-Mitglied hinzu + # Format: Name / Role / Responsibilities / Email (Reihenfolge wie im System-Prompt) add_member_requests = re.findall( - r'@ADD_TEAM_MEMBER\s*\nName:\s*([^\n]+)\s*\nEmail:\s*([^\n]+)\s*\nRole:\s*([^\n]+)\s*\nResponsibilities:\s*(.*?)@END', + r'@ADD_TEAM_MEMBER\s*\nName:\s*([^\n]+)\s*\nRole:\s*([^\n]+)\s*\nResponsibilities:\s*([^\n]+)\s*\nEmail:\s*(.*?)@END', response_text, re.DOTALL ) - for name, email, role, resp in add_member_requests: + for name, role, resp, email in add_member_requests: name_clean = name.strip() - email_clean = email.strip() role_clean = role.strip() resp_clean = resp.strip() - - success = add_team_member(name_clean, role_clean, email_clean, resp_clean) + email_clean = email.strip() + + success = add_team_member(name_clean, role_clean, resp_clean, email_clean) if success: logger.info(f"[AgentCmd] Team-Member hinzugefügt: {name_clean} ({role_clean})") else: