Log searches (article/category) and message-generation events to a new
interaction_log table, capturing IP address and User-Agent.
Also apply NOT NULL constraints to Contribution, SentMessage, FlickrUpload,
and ThumbnailCache fields that are always populated, and remove stale
continue_token references from category.html.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Move from JSON file storage to SQLite database using SQLAlchemy with
Mapped type hints. Deduplicate URL utility functions into shared
flickr_mail package.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>