App-Container kann Host-IP nicht erreichen; deployer-Hostname funktioniert
da beide im selben Docker-Netzwerk (nexxo) laufen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pro-User können in den Einstellungen (Tab „API") benannte Tokens erstellen
und widerrufen. Feature api_access im FeatureSeeder als Pro-Feature ergänzt.
Neuer GET /events/{id} Endpunkt im EventController.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
${DEPLOY_WEBHOOK_SECRET} war leer (keine Root-.env), deployer-Container
hat secret nicht erhalten → HTTP 403. Nun direkt aus src/.env gelesen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Zeigt letzten Git-Commit (Hash, Message, Datum), letzten Deploy-Zeitstempel
und ermöglicht manuelles Auslösen des Deploy-Webhooks per Button.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
deployer-Container (almir/webhook) lauscht auf Port 9001.
Bei Push → git pull, npm build, migrate, cache clear, workers restart.
Secret via DEPLOY_WEBHOOK_SECRET in .env konfigurieren.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
:style als Objekt statt String damit height/background erhalten bleiben,
x-show &&-Operator durch ternary ersetzt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Web: Hover über Zeitslots zeigt leichten Indigo-Highlight an
App: + Button im Kalender-Header öffnet neuen Termin Modal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Persönlichkeit komplett überarbeitet:
- Warmherzig und freundlich statt souverän-distanziert
- Humor der sich natürlich ergibt (Ironie, mitlachen, sich selbst nicht zu ernst nehmen)
- Stimmung des Users aktiv aufnehmen und spiegeln
- Locker und direkt statt förmlich
- Konkrete Beispiele wie Aria klingt vs. wie sie NICHT klingt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AgentAIService — Prompt:
- Identität komplett neu: Aria ist eine Präsenz, nicht ein Assistent-Bot
- Konversation massiv ausgebaut: Jarvis-Stil mit echter Persönlichkeit,
Empathie, Meinung, trockenem Humor, echter Reaktion — kein performter Charme
- Zeitzone-Vereinfachung: Aria gibt Wiener Ortszeit aus (YYYY-MM-DD HH:mm),
das Backend übernimmt UTC-Konvertierung — keine Carbon-UTC-Berechnungen mehr
- Reminder-Beispiele vereinfacht und korrekt (Wien-Zeit statt UTC)
- Relative Zeiten als Wien-Zeit-Beispiele statt UTC
AgentActionService — Backend:
- Task reminder_at + due_at jetzt mit User-Timezone geparst (war vorher UTC-Annahme)
- Konsistent mit Event-Handling (datetime wurde schon mit $tz geparst)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Neue Templates im einheitlichen Stil:
- auth/welcome → nach erster E-Mail-Verifizierung, Feature-Übersicht + CTA
- subscription/confirmed → Abo-Bestätigung mit Plan/Betrag/Verlängerungsdatum
- subscription/cancelled → Kündigung mit Zugang-bis-Datum + Reaktivierungs-CTA
Layout: Textwordmark durch logo-text.png ersetzt (height:32px)
Preview: alle 3 Templates in /admin/mail-preview ergänzt (11 Templates gesamt)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Die aziros.com-Postfächer (hello/noreply) können sich nicht direkt am SMTP
authentifizieren. Lösung: smtp-Mailer (info@nimu.li) für Auth verwenden,
FROM-Header per ->from() auf die korrekte aziros.com-Adresse setzen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Registrierungs-E-Mails wurden bisher über info@nimu.li gesendet, weil alle
benannten Mailer auf MAIL_USERNAME/MAIL_PASSWORD zurückfielen. Jetzt nutzt
jeder Mailer seine eigenen MAIL_*_USERNAME und MAIL_*_PASSWORD aus .env.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Statt nur Ausrufezeichen-Icon nun ein rotes Badge mit Label
"überfällig / overdue" + Datum — bestehender Übersetzungsschlüssel
dashboard.overdue (de/en) wird verwendet.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Statt "In 15 Stunde(n)" steht nun "Heute um 16:00 Uhr" — eindeutiger
Bezug zum Event. Bei < 60 min bleibt der Countdown plus die Uhrzeit.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PushService: Http::asJson() statt withHeaders; EXPO_TOKEN als Bearer-Auth
- services.php: expo.token aus ENV eingetragen
- ScheduleEventReminders: UTC-Reminder-Zeit erst in Lokalzeit umrechnen,
dann mit lokalem Event-Datum kombinieren → verhindert +24h-Versatz bei
Mitternacht-Übergängen (z.B. 22:20 UTC = 00:20 Wien)
- Event-Abfrage auf starts_at > now - 1 Tag erweitert, damit auch bereits
gestartete Events noch Reminder erhalten
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- parseJson: plain text (kein { oder [) → type=chat statt type=unknown
Behebt WARNING für normale Chat-Antworten wie "Alles klar! [END]"
- AgentAIService Prompt: Regel 12 — Konflikt-Handling mit force:true erklärt
AI fragt nach Überschneidung und sendet force:true wenn User bestätigt
- AgentActionService: Duplikat-Check bei force=true überspringen
damit erzwungene Events auch bei gleichem Titel+Datum gespeichert werden
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vorher: preg_match mit Capture-Group schlug fehl wenn ``` am Ende fehlt.
Nachher: zwei preg_replace entfernen öffnendes ```json und schließendes ```
unabhängig voneinander — robuster gegen unvollständige Codeblöcke.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- AgentChatController: _multi hatte kein type-Key → wurde als 'chat' gewertet
→ nur 5 Credits statt Action-Credits. Fix: isset(_multi) erkennt Multi-Actions
- AgentAIService: EVENT vs TASK Entscheidungsregel + reminder_at für Events
Event mit Erinnerung → immer event+reminder_at, niemals als Task anlegen
- EventPlannerService: reminder_at beim Event-Erstellen speichern (UTC)
- Event Model + Migration: reminder_at + reminder_sent Felder ergänzt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Ganztägige Konflikt-Prüfung: EventPlannerService hatte bereits
->where('is_all_day', false) in hasConflict() + hasMultiDayConflict()
AgentActionService delegiert dorthin — kein zusätzlicher Fix nötig
- Chat-Credits: immer 5 Credits pauschal (vorher: nur 1. Nachricht einer
Session, Follow-ups = 0 + kein Log)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Credits nur bei status='success': Konflikt/Fehler/Failed → 0 Credits
- Multi-Action: Credits proportional zu erfolgreichen Aktionen
- AgentActionService: Duplikat-Check vor Event/Task/Notiz-Anlage
- Multi-Action-Status: 'success'/'partial'/'failed' statt immer 'success'
- Gilt für Web (Livewire/Agent/Index) und API (AgentChatController)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>