Previously any chat message containing an article URL triggered the
Blinkist FSM: Firecrawl extraction + LLM topic detection + 3-option
menu. Pasting a link as conversational context spammed the menu.
Now _check_for_url additionally requires an intent keyword (summary,
zusammenfassung, audio, mp3, blinkist, tldr, lies das, fasse zusammen,
discuss/diskutieren, etc.) before engaging. Without intent the URL
falls through to the normal AI handler.
Also bind-mount article_summary/ so future fixes survive container
recreate (matches the pattern used for bot.py/voice.py/agent.py).
Replace brittle exact-string matching with keyword/substring classifier
that handles edge cases (punctuation, partial matches, German variants).
Detect article language and present all prompts in the users language.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
'Audiozusammenfassung' and 'Textzusammenfassung' now correctly trigger
the audio/text summary flows instead of falling through to regular LLM
which says it can't create audio files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add scheduled messages/reminders system:
- New scheduled_messages table in memory-service with CRUD endpoints
- schedule_message, list_reminders, cancel_reminder tools for the bot
- Background scheduler loop (30s) sends due reminders automatically
- Supports one-time, daily, weekly, weekdays, monthly repeat patterns
Make article URL handling non-blocking:
- Show 3 options (discuss, text summary, audio) instead of forcing audio wizard
- Default to passing article context to AI if user just keeps chatting
- New AWAITING_LANGUAGE state for cleaner audio flow FSM
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>