test(ai-context): TODO-009 unit tests for LLM context message generators
Adds 18 new tests covering:
Backend (13 tests in ai-context.test.ts):
- keyword fallback — meeting, doctor, flight, case-insensitive
- generic fallback — no match, minute/hour formatting
- LLM path — flag-gated (off = no fetch), extraction-service success,
Ollama cascade when extraction returns null, error → keyword fallback,
short Ollama response rejected, non-200 fallthrough
- prompt construction — includes category, urgency, timeOfDay,
recentTimerLabels
Web (5 new tests in context-messages.test.ts):
- LLM success path
- keyword fallback when backend returns 500
- keyword fallback when backend throws
- generic fallback when backend fails and no keyword matches
- payload shape — POST /api/context-message with all params
Test counts: backend 240 (was ~227), web 399 (was ~394), all green.