diff --git a/tests/test_agent_memory.py b/tests/test_agent_memory.py index 35669d36..bb8e4327 100644 --- a/tests/test_agent_memory.py +++ b/tests/test_agent_memory.py @@ -20,6 +20,7 @@ from agent.memory import ( SessionTranscript, create_agent_memory, ) +from nexus.mempalace.conversation_artifacts import ConversationArtifact from agent.memory_hooks import MemoryHooks @@ -184,6 +185,24 @@ class TestAgentMemory: doc_id = mem.write_diary() assert doc_id is None # MemPalace unavailable + def test_remember_alexander_request_response_uses_sovereign_room(self): + mem = AgentMemory(agent_name="allegro") + mem._available = True + with patch("nexus.mempalace.searcher.add_memory", return_value="doc-123") as add_memory: + doc_id = mem.remember_alexander_request_response( + request_text="Catalog my requests.", + response_text="I will preserve them as artifacts.", + requester="Alexander Whitestone", + source="telegram:timmy-time", + ) + + assert doc_id == "doc-123" + kwargs = add_memory.call_args.kwargs + assert kwargs["room"] == "sovereign" + assert kwargs["wing"] == mem.wing + assert kwargs["extra_metadata"]["artifact_type"] == "alexander_request_response" + assert kwargs["extra_metadata"]["speaker_tags"] == ["speaker:alexander", "speaker:allegro"] + # --------------------------------------------------------------------------- # MemoryHooks tests diff --git a/tests/test_conversation_artifacts.py b/tests/test_conversation_artifacts.py new file mode 100644 index 00000000..dec55bb5 --- /dev/null +++ b/tests/test_conversation_artifacts.py @@ -0,0 +1,52 @@ +from nexus.mempalace.config import CORE_ROOMS +from nexus.mempalace.conversation_artifacts import ( + ConversationArtifact, + build_request_response_artifact, + extract_alexander_request_pairs, + normalize_speaker, +) + + +def test_sovereign_room_is_core_room() -> None: + assert "sovereign" in CORE_ROOMS + + +def test_normalize_speaker_maps_alexander_variants() -> None: + assert normalize_speaker("Alexander Whitestone") == "alexander" + assert normalize_speaker("Rockachopa") == "alexander" + assert normalize_speaker(" ALEXANDER ") == "alexander" + assert normalize_speaker("Bezalel") == "bezalel" + + +def test_build_request_response_artifact_creates_sovereign_metadata() -> None: + artifact = build_request_response_artifact( + requester="Alexander Whitestone", + responder="Allegro", + request_text="Please organize my conversation artifacts.", + response_text="I will catalog them under a sovereign room.", + source="telegram:timmy-time", + timestamp="2026-04-16T01:30:00Z", + ) + + assert isinstance(artifact, ConversationArtifact) + assert artifact.room == "sovereign" + assert artifact.metadata["speaker_tags"] == ["speaker:alexander", "speaker:allegro"] + assert artifact.metadata["artifact_type"] == "alexander_request_response" + assert artifact.metadata["responder"] == "allegro" + assert "## Alexander Request" in artifact.text + assert "## Wizard Response" in artifact.text + + +def test_extract_alexander_request_pairs_finds_following_wizard_response() -> None: + turns = [ + {"speaker": "Alexander Whitestone", "text": "Catalog my requests as artifacts.", "timestamp": "2026-04-16T01:00:00Z"}, + {"speaker": "Allegro", "text": "I'll build a sovereign room contract.", "timestamp": "2026-04-16T01:01:00Z"}, + {"speaker": "Alexander", "text": "Make sure my words are easy to recall.", "timestamp": "2026-04-16T01:02:00Z"}, + {"speaker": "Allegro", "text": "I will tag them with speaker metadata.", "timestamp": "2026-04-16T01:03:00Z"}, + ] + + artifacts = extract_alexander_request_pairs(turns, responder="Allegro", source="telegram") + + assert len(artifacts) == 2 + assert artifacts[0].metadata["request_timestamp"] == "2026-04-16T01:00:00Z" + assert artifacts[1].metadata["response_timestamp"] == "2026-04-16T01:03:00Z"