From 34f776b48ba83e91d9898ff01660da46fcbf1782 Mon Sep 17 00:00:00 2001 From: Xubin Ren <52506698+Re-bin@users.noreply.github.com> Date: Thu, 25 Jun 2026 16:30:34 +0800 Subject: [PATCH] test(cli): lock disabled dream cursor advancement --- nanobot/cli/commands.py | 10 +++++++--- tests/cli/test_commands.py | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/nanobot/cli/commands.py b/nanobot/cli/commands.py index ae288de2..67d70dbd 100644 --- a/nanobot/cli/commands.py +++ b/nanobot/cli/commands.py @@ -154,6 +154,12 @@ def _install_gateway_shutdown_handlers( return restore +def _advance_dream_cursor_if_behind(memory: Any) -> None: + latest = memory.get_latest_cursor() + if memory.get_last_dream_cursor() < latest: + memory.set_last_dream_cursor(latest) + + class SafeFileHistory(FileHistory): """FileHistory subclass that sanitizes surrogate characters on write. @@ -1165,9 +1171,7 @@ def _run_gateway( console.print(f"[green]✓[/green] Dream: {dream_cfg.describe_schedule()}") else: console.print("[yellow]○[/yellow] Dream: disabled") - latest = agent.context.memory.get_latest_cursor() - if agent.context.memory.get_last_dream_cursor() < latest: - agent.context.memory.set_last_dream_cursor(latest) + _advance_dream_cursor_if_behind(agent.context.memory) # Register Heartbeat system job (idempotent on restart) if hb_cfg.enabled: diff --git a/tests/cli/test_commands.py b/tests/cli/test_commands.py index 3a6ad286..3d9e79c6 100644 --- a/tests/cli/test_commands.py +++ b/tests/cli/test_commands.py @@ -10,6 +10,7 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest from typer.testing import CliRunner +from nanobot.agent.memory import MemoryStore from nanobot.bus.events import InboundMessage, OutboundMessage from nanobot.cli import commands as cli_commands from nanobot.cli.commands import app @@ -140,6 +141,19 @@ def test_gateway_tty_signal_mode_restores_ctrl_c(monkeypatch) -> None: os.close(slave_fd) +def test_disabled_dream_cursor_only_advances_when_behind(tmp_path) -> None: + store = MemoryStore(tmp_path) + store.append_history("first") + store.append_history("second") + + cli_commands._advance_dream_cursor_if_behind(store) + assert store.get_last_dream_cursor() == 2 + + store.set_last_dream_cursor(10) + cli_commands._advance_dream_cursor_if_behind(store) + assert store.get_last_dream_cursor() == 10 + + @pytest.fixture def mock_paths(): """Mock config/workspace paths for test isolation."""