Commit Graph

80 Commits (main)

Author SHA1 Message Date
boban 3cb0c729b2 fix(admin): Webhook-URL auf Docker-internen Hostnamen umstellen
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>
2026-04-21 02:56:17 +02:00
boban 22a7328a62 fix(deployer): sed statt envsubst für Secret-Substitution
envsubst ist im almir/webhook-Image nicht vorhanden, sed ist immer verfügbar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 02:34:36 +02:00
boban 2dd3903a4e feat(api): API-Token-Verwaltung & GET /events/{id}
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>
2026-04-21 02:13:15 +02:00
boban 6b92544611 fix(deployer): env_file statt leerem env-Passthrough für Webhook-Secret
${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>
2026-04-21 01:38:52 +02:00
boban db0c092a06 feat(admin): Webhook-Sektion auf Versionen-Seite
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>
2026-04-21 01:34:40 +02:00
boban db82718ea0 fix: Webhook auf Port 9000 + /deploy URL-Prefix
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 01:27:51 +02:00
boban 3c0676acd9 feat: Gitea Webhook Auto-Deploy Service für Staging
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>
2026-04-21 01:23:30 +02:00
boban 2cf56a3caf fix: Kalender Hover-Highlight Style-Binding korrigiert
: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>
2026-04-21 00:56:20 +02:00
boban 3aa9eb1633 feat: Kalender Hover-Highlight (Web) + manuelle Event-Erstellung (App)
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>
2026-04-21 00:53:38 +02:00
boban fa52148021 refactor: Aria-Charakter — herzlich, humorvoll, locker statt steif/kühl
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>
2026-04-20 23:42:09 +02:00
boban 25519dcdb6 refactor: Aria Charakter als echter Jarvis, Timezone-Handling im Backend
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>
2026-04-20 21:35:32 +02:00
boban 5e89c83b46 refactor: Aria-Prompt vollständig überarbeitet — Jarvis-Charakter, stabiles JSON, Lösch-Aktionen
Hauptänderungen:
- Widerspruch entfernt: "Gespräch → KEIN JSON" vs. chat-JSON war direkter Konflikt
- Persönlichkeit: "gute Freundin" → klarer Jarvis-Stil (ruhig, präzise, souverän, trocken)
- TONANPASSUNG neu: Stimmung des Users wird gespiegelt
- INTELLIGENZVERHALTEN neu: nur fragen wenn wirklich nötig
- Abschlussfrage optional statt nach jeder Antwort erzwungen
- Lösch-Aktionen ergänzt: event_delete, task_delete, note_delete
- note_update: title-Feld ergänzt
- Zeitberechnung: mehr konkrete UTC-Beispiele
- Gesamtstruktur klarer gegliedert (12 logische Blöcke)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 21:17:02 +02:00
boban 00961be675 feat: 3 neue E-Mail Templates + Logo im Layout
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>
2026-04-20 20:32:14 +02:00
boban cd2e466f09 feat: E-Mail Templates neu gestaltet + Mail-Preview unter /admin/mail-preview
Einheitliches Design für alle Templates:
- Neues Layout: weißes Card, 3px Indigo-Gradient-Akzentbalken, aziros-Wordmark
- Icon-Badge pro Template (52px, border-radius:14px, thematische Farbe)
- Konsistente Typografie, Info-Boxen, Button-Stil
- reset-password, smtp-test, aria-composed auf @extends migriert

Preview-Route: /admin/mail-preview (Index) + /admin/mail-preview/{template}
→ Alle 8 Templates mit Fake-Daten in einer skalierten Vorschau-Grid-Ansicht.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 20:20:29 +02:00
boban b8afe0cb70 fix: Checkout-Button sofort via Alpine $wire freischalten, Features-Sort stabilisieren
- wire:model.live + :disabled="!$wire.rightAcknowledged || !$wire.waiverConfirmed"
  → Button reagiert clientseitig ohne Server-Roundtrip
- orderBy('sort')->orderBy('id') → stabile Feature-Reihenfolge beim Billing-Wechsel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:51:46 +02:00
boban f76ea32076 fix: SMTP-Auth via info@nimu.li, FROM-Adresse je Template auf aziros.com setzen
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>
2026-04-20 19:40:49 +02:00
boban a023ed19f6 fix: Verifizierungs-Mail via hello@aziros.com statt Fallback-Mailer senden
ProcessMailQueue verwendete Mail::html() ohne Mailer-Angabe, was den Default-
Mailer (smtp = info@nimu.li) nutzte. Jetzt: auth.* → hello-Mailer, Rest → system.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:34:11 +02:00
boban d880ee4d7d fix: Pro-Mailer (system/reminder/aria/hello) verwenden eigene SMTP-Credentials
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>
2026-04-20 19:25:04 +02:00
boban b863b67979 feat: Widerrufsrecht-Bestätigung beim Upgrade (Free → Pro)
- Migration: withdrawal_waivers (user, plan, billing, amount, IP,
  user_agent, confirmed_at, pdf_path für spätere PDF-Generierung)
- Model: WithdrawalWaiver mit User/Plan-Relation
- Checkout/Index: rightAcknowledged + waiverConfirmed Properties;
  Validierung vor Checkout; Waiver-Record wird vor Zahlung gespeichert
- View: Amber-Box mit Hinweistext + 2 Checkboxen; CTA-Button disabled
  solange nicht beide bestätigt; nur bei paid Plänen sichtbar
- Übersetzungen: waiver_info, waiver_right_acknowledged,
  waiver_confirmed, waiver_required (DE + EN)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:05:41 +02:00
boban 2c81e2533d fix: Überfällig-Badge bei offenen Aufgaben im Dashboard mit Text
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>
2026-04-20 18:40:01 +02:00
boban 8c69d3b4e6 feat: Aria-Prompt um Jarvis-Persönlichkeit, Humor und Konversation erweitert
Neue Blöcke: HUMOR & EMOTIONEN, KONVERSATION. PERSÖNLICHKEIT um
Jarvis-Charakter (trockener Humor, Selbstironie, eigene Meinung) ergänzt.
Bestehende Regeln unverändert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 18:17:33 +02:00
boban 552998f06a feat: Übersetzungsschlüssel tasks.reminder_custom hinzugefügt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 01:09:01 +02:00
boban 3a9534f699 fix: Push-Body zeigt Uhrzeit des Events statt abstrakten Countdown
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>
2026-04-20 01:02:40 +02:00
boban 772f11b517 fix: Push-Notifications und Reminder-Zeitberechnung
- 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>
2026-04-20 00:56:38 +02:00
boban 57b55503fd fix: time_of_day/day_before reminder times parsed as UTC in calculateSendTime
Also add 'specific' datetime reminder type support.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 23:40:25 +02:00
boban 2acc49ea66 fix: reminder validation + remove dead code 2026-04-19 23:22:01 +02:00
boban 439754b9ba fix: time_of_day reminder time stored as UTC, displayed as local
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 22:52:12 +02:00
boban ee795237db fix: reminder validation + remove dead reminder_at in EventPlannerService
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 22:39:52 +02:00
boban b88093ed46 Fix: 0 credits for farewell chat messages
Abschlussnachrichten (danke, ok, tschüss, passt, ...) kosten 0 statt 5
Credits — keine Leistung erbracht, keine Verrechnung.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 08:30:10 +02:00
boban 89cb058e83 Fix: parseJson chat responses, force override for conflicts
- 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>
2026-04-19 08:22:52 +02:00
boban 7d50647f39 Fix: strip markdown backticks from OpenAI JSON response
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>
2026-04-19 08:09:44 +02:00
boban 9beb8c15a3 Fix: unknown type logging, event_update fallback to create, multi-event example
- AgentAIService: Raw response + type=unknown immer loggen (Debug)
- AgentActionService: event_update ohne Kandidaten + Zeitangabe → neu erstellen
  statt mit 'failed' abbrechen
- AgentAIService Prompt: Pflicht-Beispiel Reifenwechsel+Volleyball als
  Multi-Event mit reminder_at, explizit FALSCH: task anlegen markiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 08:04:02 +02:00
boban bcc1c0aac2 Fix: event vs task distinction, event reminder support, correct credit calculation
- 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>
2026-04-19 07:49:39 +02:00
boban e205186465 Fix: ignore all-day conflicts, verify chat credits
- 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>
2026-04-19 07:36:01 +02:00
boban 68aa62db6f Fix: korrekte Credit-Verrechnung + Duplikat-Schutz
- 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>
2026-04-19 07:31:36 +02:00
boban 24f43be627 Test: webhook5 2026-04-19 07:17:01 +02:00
boban da647db4ca Test: webhook3 2026-04-19 07:15:44 +02:00
boban d90b5d5ae2 Test: webhook2 2026-04-19 07:03:36 +02:00
boban f48b0b8114 Test: webhook 2026-04-19 07:01:09 +02:00
boban b46b6d2720 Test: webhook 2026-04-19 06:57:28 +02:00
boban a13cd56f8d Test: webhook 2026-04-19 06:50:34 +02:00
boban ee63529289 Fix: ignore all-day events in conflict detection 2026-04-19 06:45:30 +02:00
boban 7bab29b5eb Fix: system prompt — multi-action, Austrian time expressions, dynamic UTC offset 2026-04-19 06:43:24 +02:00
boban d7a70a0e9b Fix: favicon light/dark mode separate SVG files 2026-04-19 04:30:10 +02:00
boban fac177da70 Fix: favicon dark mode clean 2026-04-19 04:25:29 +02:00
boban 6fb3f16f16 Fix: favicon dark mode correct 2026-04-19 04:23:52 +02:00
boban 4a10c71c89 Fix: separate favicons for dark/light mode 2026-04-19 04:20:02 +02:00
boban 53f3e60044 Fix: favicon dark mode support 2026-04-19 04:05:03 +02:00
boban e23b852488 Fix: DB name unified to aziros 2026-04-19 02:14:45 +02:00
boban ed098ba59b Feature: logos, favicon, layout fixes 2026-04-19 01:45:44 +02:00