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)