fix(webui): keep idle compaction out of session recency

This commit is contained in:
chengyongru
2026-06-30 23:38:32 +08:00
committed by Xubin Ren
parent bfbae5a7b3
commit 3403b87641
7 changed files with 145 additions and 25 deletions
+10 -8
View File
@@ -8,6 +8,7 @@ from unittest.mock import AsyncMock, MagicMock
import pytest
from nanobot.agent.loop import AgentLoop
from nanobot.agent.memory import LAST_COMPACTED_AT_META
from nanobot.bus.events import InboundMessage
from nanobot.bus.queue import MessageBus
from nanobot.command import CommandContext
@@ -88,10 +89,11 @@ def _make_fake_compact(
async def _fake_compact(key: str, max_suffix: int = 8) -> str:
state["count"] += 1
session = loop.sessions.get_or_create(key)
compacted_at = datetime.now().isoformat()
tail = list(session.messages[session.last_consolidated:])
if not tail:
session.updated_at = datetime.now()
session.metadata[LAST_COMPACTED_AT_META] = compacted_at
loop.sessions.save(session)
return ""
@@ -111,7 +113,7 @@ def _make_fake_compact(
archive_msgs = result.dropped[result.already_consolidated_count:]
if not archive_msgs and not kept:
session.updated_at = datetime.now()
session.metadata[LAST_COMPACTED_AT_META] = compacted_at
loop.sessions.save(session)
return ""
@@ -132,7 +134,7 @@ def _make_fake_compact(
session.messages = kept
session.last_consolidated = 0
session.updated_at = datetime.now()
session.metadata[LAST_COMPACTED_AT_META] = compacted_at
loop.sessions.save(session)
return s
@@ -1021,14 +1023,14 @@ class TestProactiveAutoCompact:
await self._run_check_expired(loop)
assert _fake_compact.state["count"] == 1
# Second tick: should NOT re-schedule (updated_at is fresh after clear)
# Second tick: should NOT re-schedule (maintenance timestamp is fresh)
await self._run_check_expired(loop)
assert _fake_compact.state["count"] == 1 # Still 1, not re-scheduled
await loop.close_mcp()
@pytest.mark.asyncio
async def test_empty_skip_refreshes_updated_at_prevents_reschedule(self, tmp_path):
"""Empty session skip refreshes updated_at, preventing immediate re-scheduling."""
async def test_empty_skip_records_compaction_prevents_reschedule(self, tmp_path):
"""Empty session skip records maintenance, preventing immediate re-scheduling."""
loop = _make_loop(tmp_path, session_ttl_minutes=15)
session = loop.sessions.get_or_create("cli:test")
session.updated_at = datetime.now() - timedelta(minutes=20)
@@ -1036,11 +1038,11 @@ class TestProactiveAutoCompact:
loop.consolidator.compact_idle_session = _make_fake_compact(loop)
# First tick: skips (no messages), refreshes updated_at
# First tick: skips (no messages), records compaction metadata
await self._run_check_expired(loop)
assert "cli:test" not in loop.auto_compact._summaries
# Second tick: should NOT re-schedule because updated_at is fresh
# Second tick: should NOT re-schedule because maintenance metadata is fresh
await self._run_check_expired(loop)
assert "cli:test" not in loop.auto_compact._summaries
await loop.close_mcp()