From b06bb1d40955f9c01c3390e68523a47222dcafc4 Mon Sep 17 00:00:00 2001 From: worldmozara Date: Tue, 21 Jul 2026 22:44:09 +0800 Subject: [PATCH] core/agent: shift persist_from when prepending system prompt --- src/plyngent/agent/chat.py | 6 +++--- tests/test_cli/test_compact_cmd.py | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/plyngent/agent/chat.py b/src/plyngent/agent/chat.py index b52e38d..dfebb6b 100644 --- a/src/plyngent/agent/chat.py +++ b/src/plyngent/agent/chat.py @@ -210,9 +210,9 @@ class ChatAgent: if self.messages and isinstance(self.messages[0], SystemChatMessage): return self.messages.insert(0, SystemChatMessage(content=self.system_prompt)) - # System inject is not a DB message unless already stored. - if self._persist_from == 0: - self._persist_from = 1 + # Prepended system is local-only; shift the checkpoint so indices that + # already pointed past stored messages stay correct after insert. + self._persist_from = min(len(self.messages), self._persist_from + 1) def replace_messages( self, diff --git a/tests/test_cli/test_compact_cmd.py b/tests/test_cli/test_compact_cmd.py index 737fd8a..20a6d6f 100644 --- a/tests/test_cli/test_compact_cmd.py +++ b/tests/test_cli/test_compact_cmd.py @@ -152,10 +152,15 @@ async def test_rebuild_client_preserves_persist_cursor(tmp_path: Path) -> None: [UserChatMessage(content="hi"), AssistantChatMessage(content="yo")], persisted=True, ) - assert state.agent.persist_from == 2 + # Default system prompt is prepended locally (not a DB row); checkpoint + # shifts so the two stored turns stay in the persisted prefix. + n_msgs = len(state.agent.messages) + assert n_msgs >= 2 + assert state.agent.persist_from == n_msgs + cursor = state.agent.persist_from state.rebuild_client() - assert len(state.agent.messages) == 2 - assert state.agent.persist_from == 2 + assert len(state.agent.messages) == n_msgs + assert state.agent.persist_from == cursor finally: await memory.close()