2b606d20e2
Adds SessionDB.get_messages_around(session_id, around_message_id, window) which returns up to 'window' messages before the anchor, the anchor itself, and up to 'window' after — all from the same session, ordered by id ascending. Used by the upcoming session_search mode='guided' (anchored drill-down) to surface a focused conversation window without summarisation cost or the 100k-char truncation gamble of mode='summary'. Boundaries are honoured (fewer messages at session start/end), the anchor is verified to exist in the named session before fetching (cheap guard against cross-session id confusion), and content/tool_calls decoding mirrors get_messages() so callers can swap between the two without surprises. Tested: 9 new cases in tests/hermes_state/test_get_messages_around.py (middle-of-session, first-message, last-message, anchor-not-in-session, no cross-session leakage, window > session, window=0, window negative, content decoding parity with get_messages). 62/62 passing including the existing 53 session_search tests.