From 9fdece9404e65aa9c21559f92775ed2e5eb6853b Mon Sep 17 00:00:00 2001 From: Ed_ Date: Mon, 23 Feb 2026 15:07:48 -0500 Subject: [PATCH] conductor(checkpoint): Final optimizations for Phase 3: Throttled updates and incremental rendering --- gui.py | 234 ++++++++++++++++++++++++----------------------- manual_slop.toml | 3 +- project.toml | 2 +- 3 files changed, 125 insertions(+), 114 deletions(-) diff --git a/gui.py b/gui.py index 5f124ef..d53033b 100644 --- a/gui.py +++ b/gui.py @@ -519,6 +519,7 @@ class App: mcp_client.perf_monitor_callback = self.perf_monitor.get_metrics self.perf_monitor.alert_callback = self._on_performance_alert self._last_bleed_update_time = 0 + self._last_diag_update_time = 0 self._recalculate_session_usage() # ---------------------------------------------------------------- project loading @@ -833,48 +834,51 @@ class App: limit = stats.get("limit", 0) dpg.set_value("token_budget_label", f"{current:,} / {limit:,}") - # Update Gemini-specific cache stats - if dpg.does_item_exist("gemini_cache_label"): - if self.current_provider == "gemini": - try: - cache_stats = ai_client.get_gemini_cache_stats() - count = cache_stats.get("cache_count", 0) - size_bytes = cache_stats.get("total_size_bytes", 0) - size_kb = size_bytes / 1024.0 - text = f"Gemini Caches: {count} ({size_kb:.1f} KB)" - dpg.set_value("gemini_cache_label", text) - dpg.configure_item("gemini_cache_label", show=True) - except Exception as e: - # If the API call fails, just hide the label + # Update Gemini-specific cache stats (throttled with diagnostics) + if now - self._last_diag_update_time > 0.1: + self._last_diag_update_time = now + + if dpg.does_item_exist("gemini_cache_label"): + if self.current_provider == "gemini": + try: + cache_stats = ai_client.get_gemini_cache_stats() + count = cache_stats.get("cache_count", 0) + size_bytes = cache_stats.get("total_size_bytes", 0) + size_kb = size_bytes / 1024.0 + text = f"Gemini Caches: {count} ({size_kb:.1f} KB)" + dpg.set_value("gemini_cache_label", text) + dpg.configure_item("gemini_cache_label", show=True) + except Exception as e: + # If the API call fails, just hide the label + dpg.configure_item("gemini_cache_label", show=False) + else: dpg.configure_item("gemini_cache_label", show=False) - else: - dpg.configure_item("gemini_cache_label", show=False) - # Update Diagnostics panel - if dpg.is_item_shown("win_diagnostics"): - metrics = self.perf_monitor.get_metrics() - - # Update history - self.perf_history["frame_time"].append(metrics['last_frame_time_ms']) - self.perf_history["fps"].append(metrics['fps']) - self.perf_history["cpu"].append(metrics['cpu_percent']) - self.perf_history["input_lag"].append(metrics['input_lag_ms']) - - for k in self.perf_history: - if len(self.perf_history[k]) > 100: - self.perf_history[k].pop(0) + # Update Diagnostics panel + if dpg.is_item_shown("win_diagnostics"): + metrics = self.perf_monitor.get_metrics() + + # Update history + self.perf_history["frame_time"].append(metrics['last_frame_time_ms']) + self.perf_history["fps"].append(metrics['fps']) + self.perf_history["cpu"].append(metrics['cpu_percent']) + self.perf_history["input_lag"].append(metrics['input_lag_ms']) + + for k in self.perf_history: + if len(self.perf_history[k]) > 100: + self.perf_history[k].pop(0) - # Update labels - dpg.set_value("perf_fps_text", f"{metrics['fps']:.1f}") - dpg.set_value("perf_frame_text", f"{metrics['last_frame_time_ms']:.1f}ms") - dpg.set_value("perf_cpu_text", f"{metrics['cpu_percent']:.1f}%") - dpg.set_value("perf_lag_text", f"{metrics['input_lag_ms']:.1f}ms") - - # Update plots - if dpg.does_item_exist("perf_frame_plot"): - dpg.set_value("perf_frame_plot", [list(range(100)), self.perf_history["frame_time"]]) - if dpg.does_item_exist("perf_cpu_plot"): - dpg.set_value("perf_cpu_plot", [list(range(100)), self.perf_history["cpu"]]) + # Update labels + dpg.set_value("perf_fps_text", f"{metrics['fps']:.1f}") + dpg.set_value("perf_frame_text", f"{metrics['last_frame_time_ms']:.1f}ms") + dpg.set_value("perf_cpu_text", f"{metrics['cpu_percent']:.1f}%") + dpg.set_value("perf_lag_text", f"{metrics['input_lag_ms']:.1f}ms") + + # Update plots + if dpg.does_item_exist("perf_frame_plot"): + dpg.set_value("perf_frame_plot", [list(range(100)), self.perf_history["frame_time"]]) + if dpg.does_item_exist("perf_cpu_plot"): + dpg.set_value("perf_cpu_plot", [list(range(100)), self.perf_history["cpu"]]) def _append_comms_entry(self, entry: dict, idx: int): if not dpg.does_item_exist("comms_scroll"): @@ -1565,84 +1569,89 @@ class App: # ---- disc entry list ---- + def _render_disc_entry(self, i: int, entry: dict): + collapsed = entry.get("collapsed", False) + read_mode = entry.get("read_mode", False) + ts_str = entry.get("ts", "") + + preview = entry["content"].replace("\n", " ")[:60] + if len(entry["content"]) > 60: + preview += "..." + + with dpg.group(parent="disc_scroll", tag=f"disc_entry_group_{i}"): + with dpg.group(horizontal=True): + dpg.add_button( + tag=f"disc_toggle_{i}", + label="+" if collapsed else "-", + width=24, + callback=self._make_disc_toggle_cb(i), + ) + dpg.add_combo( + tag=f"disc_role_{i}", + items=self.disc_roles, + default_value=entry["role"], + width=120, + callback=self._make_disc_role_cb(i), + ) + if not collapsed: + dpg.add_button( + label="[Edit]" if read_mode else "[Read]", + user_data=i, + callback=self._cb_toggle_read + ) + if ts_str: + dpg.add_text(ts_str, color=(120, 120, 100)) + if collapsed: + dpg.add_button( + label="Ins", + width=36, + callback=self._make_disc_insert_cb(i), + ) + dpg.add_button( + label="[+ Max]", + user_data=i, + callback=lambda s, a, u: _show_text_viewer(f"Entry #{u+1}", self.disc_entries[u]["content"]) + ) + dpg.add_button( + label="Del", + width=36, + callback=self._make_disc_remove_cb(i), + ) + dpg.add_text(preview, color=(160, 160, 150)) + + with dpg.group(tag=f"disc_body_{i}", show=not collapsed): + if read_mode: + with dpg.child_window(height=150, border=True): + dpg.add_text(entry["content"], wrap=0, color=(200, 200, 200)) + else: + dpg.add_input_text( + tag=f"disc_content_{i}", + default_value=entry["content"], + multiline=True, + width=-1, + height=150, + callback=self._make_disc_content_cb(i), + on_enter=False, + ) + dpg.add_separator() + + def _cb_toggle_read(self, sender, app_data, user_data): + idx = user_data + # Save edit box content before switching to read mode + tag = f"disc_content_{idx}" + if dpg.does_item_exist(tag) and not self.disc_entries[idx].get("read_mode", False): + self.disc_entries[idx]["content"] = dpg.get_value(tag) + self.disc_entries[idx]["read_mode"] = not self.disc_entries[idx].get("read_mode", False) + self._rebuild_disc_list() + def _rebuild_disc_list(self): + """Full rebuild of the discussion UI. Expensive! Use incrementally where possible.""" if not dpg.does_item_exist("disc_scroll"): return - def _toggle_read(s, a, idx): - # Save edit box content before switching to read mode - tag = f"disc_content_{idx}" - if dpg.does_item_exist(tag) and not self.disc_entries[idx].get("read_mode", False): - self.disc_entries[idx]["content"] = dpg.get_value(tag) - self.disc_entries[idx]["read_mode"] = not self.disc_entries[idx].get("read_mode", False) - self._rebuild_disc_list() - dpg.delete_item("disc_scroll", children_only=True) for i, entry in enumerate(self.disc_entries): - collapsed = entry.get("collapsed", False) - read_mode = entry.get("read_mode", False) - ts_str = entry.get("ts", "") - - preview = entry["content"].replace("\n", " ")[:60] - if len(entry["content"]) > 60: - preview += "..." - - with dpg.group(parent="disc_scroll"): - with dpg.group(horizontal=True): - dpg.add_button( - tag=f"disc_toggle_{i}", - label="+" if collapsed else "-", - width=24, - callback=self._make_disc_toggle_cb(i), - ) - dpg.add_combo( - tag=f"disc_role_{i}", - items=self.disc_roles, - default_value=entry["role"], - width=120, - callback=self._make_disc_role_cb(i), - ) - if not collapsed: - dpg.add_button( - label="[Edit]" if read_mode else "[Read]", - user_data=i, - callback=_toggle_read - ) - if ts_str: - dpg.add_text(ts_str, color=(120, 120, 100)) - if collapsed: - dpg.add_button( - label="Ins", - width=36, - callback=self._make_disc_insert_cb(i), - ) - dpg.add_button( - label="[+ Max]", - user_data=i, - callback=lambda s, a, u: _show_text_viewer(f"Entry #{u+1}", self.disc_entries[u]["content"]) - ) - dpg.add_button( - label="Del", - width=36, - callback=self._make_disc_remove_cb(i), - ) - dpg.add_text(preview, color=(160, 160, 150)) - - with dpg.group(tag=f"disc_body_{i}", show=not collapsed): - if read_mode: - with dpg.child_window(height=150, border=True): - dpg.add_text(entry["content"], wrap=0, color=(200, 200, 200)) - else: - dpg.add_input_text( - tag=f"disc_content_{i}", - default_value=entry["content"], - multiline=True, - width=-1, - height=150, - callback=self._make_disc_content_cb(i), - on_enter=False, - ) - dpg.add_separator() + self._render_disc_entry(i, entry) def _make_disc_role_cb(self, idx: int): def cb(sender, app_data): @@ -2245,7 +2254,8 @@ class App: self.disc_roles.append(item["role"]) self._rebuild_disc_roles_list() self.disc_entries.append(item) - self._rebuild_disc_list() + self._render_disc_entry(len(self.disc_entries) - 1, item) + if dpg.does_item_exist("disc_scroll"): # Force scroll to bottom using a very large number dpg.set_y_scroll("disc_scroll", 99999) diff --git a/manual_slop.toml b/manual_slop.toml index 42490d6..f865afd 100644 --- a/manual_slop.toml +++ b/manual_slop.toml @@ -165,7 +165,7 @@ history = [ [discussion.discussions."test for gemini conductor"] git_commit = "ccdba69214aea169a4e707da7b425ae0c6139fca" -last_updated = "2026-02-23T15:00:53" +last_updated = "2026-02-23T15:06:42" history = [ "@2026-02-23T11:08:38\nUser:\nadded a file to yoru exposed files read it.", "@2026-02-23T11:08:43\nAI:\nI have read the `MainContext.md` file. It contains extensive documentation about the \"Manual Slop\" project.\n\nWas `MainContext.md` the file you were referring to? If not, please specify the file's name or path.", @@ -175,6 +175,7 @@ history = [ "@2026-02-23T14:59:26\nSystem:\n[PERFORMANCE ALERT] Frame time high: 194.0ms; Input lag high: 156.2ms. Please consider optimizing recent changes or reducing load.", "@2026-02-23T14:59:56\nSystem:\n[PERFORMANCE ALERT] Frame time high: 117.4ms; Input lag high: 156.2ms. Please consider optimizing recent changes or reducing load.", "@2026-02-23T15:00:27\nSystem:\n[PERFORMANCE ALERT] Frame time high: 206.5ms; Input lag high: 156.2ms. Please consider optimizing recent changes or reducing load.", + "@2026-02-23T15:06:32\nSystem:\n[PERFORMANCE ALERT] Frame time high: 817.2ms. Please consider optimizing recent changes or reducing load.", ] [agent.tools] diff --git a/project.toml b/project.toml index 3e36e87..d7ee5bc 100644 --- a/project.toml +++ b/project.toml @@ -35,5 +35,5 @@ active = "main" [discussion.discussions.main] git_commit = "" -last_updated = "2026-02-23T15:01:18" +last_updated = "2026-02-23T15:07:42" history = []