Skip to content
24 changes: 21 additions & 3 deletions strix/interface/tui/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,8 @@ def __init__(self, args: argparse.Namespace):
self._displayed_agents: set[str] = set()
self._displayed_events: list[str] = []

self._event_render_cache: dict[str, Any] = {}

self._scan_thread: threading.Thread | None = None
self._scan_loop: asyncio.AbstractEventLoop | None = None
self._scan_stop_event = threading.Event()
Expand Down Expand Up @@ -902,7 +904,8 @@ def _update_ui(self) -> None:

self._update_chat_view()

self._update_agent_status_display()
if self._dot_animation_timer is None:
self._update_agent_status_display()

self._update_stats_display()

Expand Down Expand Up @@ -1086,11 +1089,24 @@ def _get_rendered_events_content(self, events: list[dict[str, Any]]) -> Any:

for event in events:
content: Any = None
event_id = event["id"]

if event["type"] == "chat":
content = self._render_chat_content(event["data"])
if event_id in self._event_render_cache:
content = self._event_render_cache[event_id]
else:
content = self._render_chat_content(event["data"])
if content is not None:
self._event_render_cache[event_id] = content
elif event["type"] == "tool":
content = render_tool_widget(event["data"])
status = event["data"].get("status", "")
cache_key = f"{event_id}_{status}"
if cache_key in self._event_render_cache:
content = self._event_render_cache[cache_key]
else:
content = render_tool_widget(event["data"])
if content is not None and status in ("completed", "failed", "error"):
self._event_render_cache[cache_key] = content

if content:
if renderables:
Expand Down Expand Up @@ -1305,6 +1321,7 @@ def _animate_dots(self) -> None:
status = agent_data.get("status", "running")
if status in ["running", "waiting"]:
has_active_agents = True
if status == "running":
num_colors = len(self._sweep_colors)
offset = num_colors - 1
max_pos = (self._sweep_num_squares - 1) + offset
Expand Down Expand Up @@ -1346,6 +1363,7 @@ def watch_selected_agent_id(self, _agent_id: str | None) -> None:
return

self._displayed_events.clear()
self._event_render_cache.clear()

self.call_later(self._update_chat_view)
self._update_agent_status_display()
Expand Down