From 6803519aa5b6d2fff4d9eceadf43f706228d81c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E7=B6=A0BG?= Date: Mon, 1 Jun 2026 03:16:26 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(acp):=20reset=20session=20co?= =?UTF-8?q?unters=20on=20slash=20reset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- acp_adapter/server.py | 13 ++++++++++++- tests/acp/test_server.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/acp_adapter/server.py b/acp_adapter/server.py index df773297346a..def8ec18b53b 100644 --- a/acp_adapter/server.py +++ b/acp_adapter/server.py @@ -1903,7 +1903,18 @@ class HermesACPAgent(acp.Agent): def _cmd_reset(self, args: str, state: SessionState) -> str: state.history.clear() - self.session_manager.save_session(state.session_id) + reset_failed = False + try: + reset_session_state = getattr(state.agent, "reset_session_state", None) + if callable(reset_session_state): + reset_session_state() + except Exception: + reset_failed = True + logger.warning("ACP session state reset failed for %s", state.session_id, exc_info=True) + finally: + self.session_manager.save_session(state.session_id) + if reset_failed: + return "Conversation history cleared. Agent session state reset failed; see logs." return "Conversation history cleared." def _cmd_compact(self, args: str, state: SessionState) -> str: diff --git a/tests/acp/test_server.py b/tests/acp/test_server.py index 8465ce423723..9b7ac1bc7967 100644 --- a/tests/acp/test_server.py +++ b/tests/acp/test_server.py @@ -1541,6 +1541,37 @@ class TestSlashCommands: assert "cleared" in result.lower() assert len(state.history) == 0 + def test_reset_resets_agent_session_state(self, agent, mock_manager): + state = self._make_state(mock_manager) + state.history = [{"role": "user", "content": "hello"}] + state.agent.reset_session_state = MagicMock() + + with patch.object(agent.session_manager, "save_session") as mock_save: + result = agent._handle_slash_command("/reset", state) + + assert "cleared" in result.lower() + assert state.history == [] + state.agent.reset_session_state.assert_called_once_with() + mock_save.assert_called_once_with(state.session_id) + + def test_reset_saves_session_when_agent_state_reset_fails(self, agent, mock_manager): + state = self._make_state(mock_manager) + state.history = [{"role": "user", "content": "hello"}] + state.agent.reset_session_state = MagicMock(side_effect=RuntimeError("boom")) + + with ( + patch.object(agent.session_manager, "save_session") as mock_save, + patch("acp_adapter.server.logger") as mock_logger, + ): + result = agent._handle_slash_command("/reset", state) + + assert "cleared" in result.lower() + assert "state reset failed" in result.lower() + assert state.history == [] + state.agent.reset_session_state.assert_called_once_with() + mock_save.assert_called_once_with(state.session_id) + mock_logger.warning.assert_called_once() + def test_version(self, agent, mock_manager): state = self._make_state(mock_manager) result = agent._handle_slash_command("/version", state)