diff --git a/strix/interface/tui/app.py b/strix/interface/tui/app.py index 4453ea194..fcbacf086 100644 --- a/strix/interface/tui/app.py +++ b/strix/interface/tui/app.py @@ -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() @@ -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() @@ -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: @@ -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 @@ -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()