🐛 fix(acp): reset session counters on slash reset

This commit is contained in:
墨綠BG 2026-06-01 03:16:26 +08:00 committed by Teknium
parent b9858acb0c
commit 6803519aa5
2 changed files with 43 additions and 1 deletions

View file

@ -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:

View file

@ -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)