feat(command): add /history command to show recent session messages
Adds /history [n] to display the last N user/assistant messages from the current session (default 10, max 50). - Tool and system messages are filtered out for readability - Long messages are truncated to 200 characters with an ellipsis - Multimodal content (image blocks) is collapsed to its text parts - Invalid count argument returns a usage hint - /history n uses prefix routing; /history uses exact routing Also registers /history in build_help_text().
This commit is contained in:
@@ -243,6 +243,58 @@ class TestRestartCommand:
|
||||
assert "Context: 1k/65k (1% of input budget)" in response.content
|
||||
assert "Tasks: 0 active" in response.content
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_history_shows_recent_messages(self):
|
||||
loop, _bus = _make_loop()
|
||||
session = MagicMock()
|
||||
session.get_history.return_value = [
|
||||
{"role": "user", "content": "Hello"},
|
||||
{"role": "assistant", "content": "Hi there!"},
|
||||
{"role": "tool", "content": "tool result"}, # should be filtered out
|
||||
{"role": "user", "content": "How are you?"},
|
||||
{"role": "assistant", "content": "I am doing well."},
|
||||
]
|
||||
loop.sessions.get_or_create.return_value = session
|
||||
|
||||
msg = InboundMessage(channel="telegram", sender_id="u1", chat_id="c1", content="/history")
|
||||
response = await loop._process_message(msg)
|
||||
|
||||
assert response is not None
|
||||
assert "👤 You: Hello" in response.content
|
||||
assert "🤖 Bot: Hi there!" in response.content
|
||||
assert "tool result" not in response.content # tool messages filtered
|
||||
assert response.metadata == {"render_as": "text"}
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_history_respects_count_argument(self):
|
||||
loop, _bus = _make_loop()
|
||||
session = MagicMock()
|
||||
session.get_history.return_value = [
|
||||
{"role": "user", "content": f"message {i}"} for i in range(20)
|
||||
]
|
||||
loop.sessions.get_or_create.return_value = session
|
||||
|
||||
msg = InboundMessage(channel="telegram", sender_id="u1", chat_id="c1", content="/history 3")
|
||||
response = await loop._process_message(msg)
|
||||
|
||||
assert response is not None
|
||||
assert "Last 3 message(s)" in response.content
|
||||
assert "message 19" in response.content # most recent
|
||||
assert "message 0" not in response.content # too old
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_history_empty_session(self):
|
||||
loop, _bus = _make_loop()
|
||||
session = MagicMock()
|
||||
session.get_history.return_value = []
|
||||
loop.sessions.get_or_create.return_value = session
|
||||
|
||||
msg = InboundMessage(channel="telegram", sender_id="u1", chat_id="c1", content="/history")
|
||||
response = await loop._process_message(msg)
|
||||
|
||||
assert response is not None
|
||||
assert "No conversation history yet." in response.content
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_process_direct_preserves_render_metadata(self):
|
||||
loop, _bus = _make_loop()
|
||||
|
||||
Reference in New Issue
Block a user