- Add extractContent() helper: parses JSON WhatsApp payloads to show
human-readable text (button titles, body text, captions) instead of
raw JSON in both the conversation list preview and message bubbles
- Fix unread_count subquery: was comparing outbound_queue.id with
conversations.id (different sequences); now uses created_at comparison
- Remove broken outbound_queue secondary query from chatMessages():
all messages (bot + admin) are already in conversations table —
the extra join caused duplicates and wrong ordering
- chatSend() now calls OutboundWorker::processQueue() immediately after
queuing so admin messages are sent to WhatsApp without manual trigger
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>