From 68f5b91ea33ce2817d6a364b2f696fde26899c5c Mon Sep 17 00:00:00 2001 From: abonneth Date: Thu, 8 Oct 2026 01:02:26 +0200 Subject: [PATCH] Forget the exit cancel of a session whose bridges stopped --- src/hai_agents_local/sessions.py | 1 + tests/test_local.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/hai_agents_local/sessions.py b/src/hai_agents_local/sessions.py index c0b49d7..8a75af7 100644 --- a/src/hai_agents_local/sessions.py +++ b/src/hai_agents_local/sessions.py @@ -268,6 +268,7 @@ def _live_sessions(self) -> typing.List[str]: for session_id, bridge_ids in list(self._owned_bridges.items()): if not serving_bridges(bridge_ids): del self._owned_bridges[session_id] + _deregister_exit_cancel(session_id) return list(self._owned_bridges) def _track(self, session: typing.Any, started: typing.List[str]) -> None: diff --git a/tests/test_local.py b/tests/test_local.py index 06a293b..408ff3e 100644 --- a/tests/test_local.py +++ b/tests/test_local.py @@ -1087,8 +1087,10 @@ async def async_cancel(*args, **kwargs): @pytest.mark.parametrize("asynchronous", [False, True]) async def test_close_cancels_only_sessions_still_served(monkeypatch, asynchronous): from hai_agents import AsyncClient + from hai_agents_local import sessions as module cancelled = [] + monkeypatch.setattr(module, "_exit_cancels", {"ended": lambda: cancelled.append("ended at exit")}) def respond(request: httpx.Request) -> httpx.Response: session_id = request.url.path.rsplit("/", 1)[1] @@ -1110,5 +1112,6 @@ def respond(request: httpx.Request) -> httpx.Response: else: sessions.cancel_session(id="unbridged") sessions.close() + module._cancel_sessions_at_exit() assert cancelled == ["unbridged", "live", "evicted"] assert sessions._owned_bridges == {}