From 60b088ce6f751bb215918ef57a3aa225780bc6df Mon Sep 17 00:00:00 2001 From: Greer Guthrie <149740518+g-guthrie@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:59:20 -0500 Subject: [PATCH] fix: restore approval session cleanup --- tests/gateway/test_approve_deny_commands.py | 1 + tools/approval.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/tests/gateway/test_approve_deny_commands.py b/tests/gateway/test_approve_deny_commands.py index b1c192f1ac..1b44dba91f 100644 --- a/tests/gateway/test_approve_deny_commands.py +++ b/tests/gateway/test_approve_deny_commands.py @@ -73,6 +73,7 @@ def _clear_approval_state(): mod._gateway_queues.clear() mod._gateway_notify_cbs.clear() mod._session_approved.clear() + mod._session_yolo.clear() mod._permanent_approved.clear() mod._pending.clear() diff --git a/tools/approval.py b/tools/approval.py index 70420976b2..aace3240cc 100644 --- a/tools/approval.py +++ b/tools/approval.py @@ -297,6 +297,24 @@ def approve_session(session_key: str, pattern_key: str): _session_approved.setdefault(session_key, set()).add(pattern_key) +def clear_session(session_key: str) -> None: + """Clear all in-memory approval state for a session key. + + Safe to call even when the session has no tracked approval state. + Any blocked gateway approvals for the session are unblocked. + """ + if not session_key: + return + with _lock: + _pending.pop(session_key, None) + _session_approved.pop(session_key, None) + _session_yolo.discard(session_key) + _gateway_notify_cbs.pop(session_key, None) + entries = _gateway_queues.pop(session_key, []) + for entry in entries: + entry.event.set() + + def enable_session_yolo(session_key: str) -> None: """Enable YOLO bypass for a single session key.""" if not session_key: