Commit Graph

24 Commits (fa5214802195865df60e7739f125fc725b6f0009)

Author SHA1 Message Date
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 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 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 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 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 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 db8a012f73 Initial commit — Aziros v1.0.0 2026-04-18 20:53:15 +02:00