"""Tests for ACP context/cost UI events.""" from acp import text_block from acp.schema import AgentMessageChunk, Cost, SessionInfoUpdate, UsageUpdate import pytest from investibook.core.agent_runtime import AgentEventBridge pytestmark = pytest.mark.asyncio async def _next_event(client: AgentEventBridge) -> dict: return await client.queue.get() async def test_usage_update_emits_structured_ui_event(): client = AgentEventBridge(workspace_id="ws-1") await client.session_update( "acp-1", UsageUpdate( sessionUpdate="usage_update", used=42, size=100, cost=Cost(amount=1.25, currency="USD"), ), ) assert await _next_event(client) == { "type": "usage", "context_used": 42, "context_size": 100, "cost_amount": 1.25, "cost_currency": "USD", } assert client.get_and_reset_usage()["context_used"] == 42 async def test_session_compacted_meta_emits_structured_ui_event(): client = AgentEventBridge(workspace_id="ws-1") await client.session_update( "acp-1", SessionInfoUpdate( sessionUpdate="session_info_update", _meta={"opencode/session_compacted": {"auto": True, "overflow": False}}, ), ) assert await _next_event(client) == { "type": "session_compacted", "auto": True, "overflow": False, } async def test_only_exact_session_compacted_meta_suppresses_message_text(): client = AgentEventBridge(workspace_id="ws-1") await client.session_update( "acp-1", AgentMessageChunk( sessionUpdate="agent_message_chunk", _meta={"some/compaction_note": {"internal": True}}, content=text_block("normal assistant text"), ), ) assert await _next_event(client) == {"type": "text", "text": "normal assistant text"}