72056faf8f
Long-lived sessions (e.g. a Telegram thread resumed over hours/days) accumulate a large context that the existing size-based threshold only trims once it crosses `threshold × context_window`. Until then every turn re-reads the full history, which on large-context models can mean hundreds of K of cache-read tokens per call even across long idle gaps. Add a time-based trigger that complements (does not replace) the size threshold: when a session resumes after `compression.idle_compact_after_seconds` of inactivity, compact the accumulated history up front, before the first reply. Disabled by default (0), so existing behaviour is unchanged. The trigger reuses `_last_activity_ts` (the last time the turn loop did work) to measure the idle gap at turn start, gates the token estimate behind a cheap gap pre-check, and skips compaction when the context is already at/below the post-compression target (threshold × target_ratio) so a short idle thread never pays for a summarization that saves nothing. It also defers to an active compression-failure cooldown. The decision is factored into a pure predicate, `_should_idle_compact`, which is unit-tested without a live agent.