Add freshness check to _detect_gaps() in all cache layers (memory,
database, async_database). For limit-only requests (no start/end),
verify the most recent candle is within 2 intervals of current time.
If stale, flag as a gap so fresh data is fetched from exchange.
This fixes the issue where EDM served hours-old cached data instead
of fetching current candles when clients requested "latest N candles".
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CacheManager.get_candles_with_source() supports per-request connector
overrides and reports data source (memory/database/exchange)
- AsyncDatabaseCache now receives pool_size/max_overflow from config
- CacheManager.close() properly shuts down async DB connection pool
- /candles endpoint accepts optional session_id for authenticated access
- /candles records metrics on success and errors (latency, cache source)
- Added tests for connector override, source reporting, and metrics
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>