diff --git a/plugins/platforms/slack/adapter.py b/plugins/platforms/slack/adapter.py index 7515a85f28961..04cff4051eb00 100644 --- a/plugins/platforms/slack/adapter.py +++ b/plugins/platforms/slack/adapter.py @@ -3806,7 +3806,15 @@ def _has_active_session_for_thread( ) session_store._ensure_loaded() - return session_key in session_store._entries + entry = session_store._entries.get(session_key) + if entry is None: + return False + + should_reset = getattr(type(session_store), "_should_reset", None) + if callable(should_reset) and should_reset(session_store, entry, source): + return False + + return True except Exception: return False diff --git a/tests/gateway/test_slack_approval_buttons.py b/tests/gateway/test_slack_approval_buttons.py index b85fc37872328..c10f5e56e88be 100644 --- a/tests/gateway/test_slack_approval_buttons.py +++ b/tests/gateway/test_slack_approval_buttons.py @@ -663,6 +663,31 @@ def test_no_session_store(self): ) assert result is False + def test_stale_session_returns_false(self): + adapter = _make_adapter() + + class Store: + config = MagicMock() + config.group_sessions_per_user = False + config.thread_sessions_per_user = False + _entries = { + "agent:main:slack:group:C1:1000.0": MagicMock() + } + + def _ensure_loaded(self): + return None + + def _should_reset(self, entry, source): + return "idle" + + adapter._session_store = Store() + + result = adapter._has_active_session_for_thread( + channel_id="C1", thread_ts="1000.0", user_id="U123" + ) + + assert result is False + # =========================================================================== # Thread engagement — bot-started threads & mentioned threads