feat: wire Finnhub into routing layer — insider txns, calendars, fallback
Changes:
- interface.py: Finnhub added as third vendor (alongside yfinance + AV)
- get_insider_transactions: Finnhub primary (free, + MSPR bonus signal)
- get_market_indices/sector_performance/topic_news: Finnhub added as option
- Fallback catch extended: (AlphaVantageError, FinnhubError, ConnectionError, TimeoutError)
- New calendar_data category with get_earnings_calendar + get_economic_calendar
- finnhub_scanner.py: added get_earnings_calendar_finnhub, get_economic_calendar_finnhub
(FOMC/CPI/NFP/GDP events + earnings beats — unique, not in AV at any tier)
- finnhub.py: re-exports new calendar functions
- scanner_tools.py: @tool wrappers for get_earnings_calendar, get_economic_calendar
- default_config.py: tool_vendors["get_insider_transactions"]="finnhub",
calendar_data vendor category defaulting to "finnhub"
- .env.example: FINNHUB_API_KEY documented
- docs/agent/decisions/010-finnhub-vendor-integration.md: ADR for this decision
All 173 offline tests pass. ADR 002 constraints respected throughout.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>