fix(tui): release agent workers on close

This commit is contained in:
yanghang committed 2026-08-06 23:27:55 +08:00
1 parent 7083b9377e
commit 5aec9a75b6
3 files changed
+33 -10

No files matched your search

+10
View File
@@ -1489,6 +1489,14 @@ class AgentBridge:
def abort(self):
self.agent.abort()
def shutdown(self) -> None:
self.agent.abort()
self.agent.task_queue.put("__shutdown__")
self._runner.join(timeout=5.0)
from frontends.continue_cmd import release_current
release_current(self.agent)
_rmdir_if_empty(getattr(self.agent, 'task_dir', None))
@property
def is_running(self) -> bool:
return self.agent.is_running
@@ -6008,6 +6016,8 @@ class SB:
except KeyboardInterrupt:
pass
finally:
if self._bridge:
self._bridge.shutdown()
_set_term_title('GenericAgent')
+8
View File
@@ -513,9 +513,17 @@ class GenericAgentTUI(App[None]):
def _cmd_clear(self, args: list[str]) -> None:
self.current.messages.clear(); self._refresh_all()
def _stop_session_runtime(self, session) -> None:
session.agent.abort()
session.agent.task_queue.put("__shutdown__")
if session.thread is not None:
session.thread.join(timeout=5.0)
def _cmd_close(self, args: list[str]) -> None:
if len(self.sessions) <= 1:
self._system("Cannot close the last session."); return
closed = self.current
self._stop_session_runtime(closed)
del self.sessions[self.current_id]
self.current_id = next(iter(self.sessions))
self._refresh_all()
+15 -10
View File
@@ -4352,6 +4352,13 @@ class GenericAgentTUI(App[None]):
except Exception: pass
self._rewind_timer = self.set_timer(2.0, self._disarm_rewind)
def _stop_session_runtime(self, session) -> None:
session.agent.abort()
session.agent.task_queue.put("__shutdown__")
thread = getattr(session, "thread", None)
if thread is not None:
thread.join(timeout=5.0)
def action_drop_session(self) -> None:
# Sidebar-only removal: drops the in-memory session so it stops appearing
# in the sidebar/switcher. The on-disk log + session_names entry are kept,
@@ -4364,18 +4371,12 @@ class GenericAgentTUI(App[None]):
ids = list(self.sessions)
i = ids.index(sid)
next_id = ids[i + 1] if i + 1 < len(ids) else ids[i - 1]
# 释放被移除会话的日志锁:否则它仍留在心跳的 _held_locks 里被持续续活,
# 占用检测永远判其"活着",之后无法对该日志原地 /continue。先 abort 停掉
# 可能仍在写日志的 agent,避免"锁已释放但仍在写"的冲突窗口(对齐 begin_fresh_session)。
dropped = self.sessions.get(sid)
if dropped is not None:
try: dropped.agent.abort()
except Exception: pass
try:
dropped = self.sessions[sid]
self._stop_session_runtime(dropped)
from continue_cmd import release_current
release_current(dropped.agent)
except Exception: pass
del self.sessions[sid]
_rmdir_if_empty(getattr(dropped.agent, 'task_dir', None))
self.current_id = next_id
self._last_title = "" # force title refresh on next call
self._refresh_all()
@@ -5026,8 +5027,12 @@ class GenericAgentTUI(App[None]):
def _cmd_close(self, args, raw):
if len(self.sessions) <= 1:
self._system("Cannot close the last session."); return
closed = self.sessions.pop(self.current_id)
closed = self.current
self._stop_session_runtime(closed)
from continue_cmd import release_current
release_current(closed.agent)
_rmdir_if_empty(getattr(closed.agent, 'task_dir', None))
del self.sessions[self.current_id]
self.current_id = next(iter(self.sessions))
self._refresh_all()