conductor(checkpoint): Final optimizations for Phase 3: Throttled updates and incremental rendering
This commit is contained in:
228
gui.py
228
gui.py
@@ -519,6 +519,7 @@ class App:
|
|||||||
mcp_client.perf_monitor_callback = self.perf_monitor.get_metrics
|
mcp_client.perf_monitor_callback = self.perf_monitor.get_metrics
|
||||||
self.perf_monitor.alert_callback = self._on_performance_alert
|
self.perf_monitor.alert_callback = self._on_performance_alert
|
||||||
self._last_bleed_update_time = 0
|
self._last_bleed_update_time = 0
|
||||||
|
self._last_diag_update_time = 0
|
||||||
self._recalculate_session_usage()
|
self._recalculate_session_usage()
|
||||||
|
|
||||||
# ---------------------------------------------------------------- project loading
|
# ---------------------------------------------------------------- project loading
|
||||||
@@ -833,48 +834,51 @@ class App:
|
|||||||
limit = stats.get("limit", 0)
|
limit = stats.get("limit", 0)
|
||||||
dpg.set_value("token_budget_label", f"{current:,} / {limit:,}")
|
dpg.set_value("token_budget_label", f"{current:,} / {limit:,}")
|
||||||
|
|
||||||
# Update Gemini-specific cache stats
|
# Update Gemini-specific cache stats (throttled with diagnostics)
|
||||||
if dpg.does_item_exist("gemini_cache_label"):
|
if now - self._last_diag_update_time > 0.1:
|
||||||
if self.current_provider == "gemini":
|
self._last_diag_update_time = now
|
||||||
try:
|
|
||||||
cache_stats = ai_client.get_gemini_cache_stats()
|
if dpg.does_item_exist("gemini_cache_label"):
|
||||||
count = cache_stats.get("cache_count", 0)
|
if self.current_provider == "gemini":
|
||||||
size_bytes = cache_stats.get("total_size_bytes", 0)
|
try:
|
||||||
size_kb = size_bytes / 1024.0
|
cache_stats = ai_client.get_gemini_cache_stats()
|
||||||
text = f"Gemini Caches: {count} ({size_kb:.1f} KB)"
|
count = cache_stats.get("cache_count", 0)
|
||||||
dpg.set_value("gemini_cache_label", text)
|
size_bytes = cache_stats.get("total_size_bytes", 0)
|
||||||
dpg.configure_item("gemini_cache_label", show=True)
|
size_kb = size_bytes / 1024.0
|
||||||
except Exception as e:
|
text = f"Gemini Caches: {count} ({size_kb:.1f} KB)"
|
||||||
# If the API call fails, just hide the label
|
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)
|
dpg.configure_item("gemini_cache_label", show=False)
|
||||||
else:
|
|
||||||
dpg.configure_item("gemini_cache_label", show=False)
|
|
||||||
|
|
||||||
# Update Diagnostics panel
|
# Update Diagnostics panel
|
||||||
if dpg.is_item_shown("win_diagnostics"):
|
if dpg.is_item_shown("win_diagnostics"):
|
||||||
metrics = self.perf_monitor.get_metrics()
|
metrics = self.perf_monitor.get_metrics()
|
||||||
|
|
||||||
# Update history
|
# Update history
|
||||||
self.perf_history["frame_time"].append(metrics['last_frame_time_ms'])
|
self.perf_history["frame_time"].append(metrics['last_frame_time_ms'])
|
||||||
self.perf_history["fps"].append(metrics['fps'])
|
self.perf_history["fps"].append(metrics['fps'])
|
||||||
self.perf_history["cpu"].append(metrics['cpu_percent'])
|
self.perf_history["cpu"].append(metrics['cpu_percent'])
|
||||||
self.perf_history["input_lag"].append(metrics['input_lag_ms'])
|
self.perf_history["input_lag"].append(metrics['input_lag_ms'])
|
||||||
|
|
||||||
for k in self.perf_history:
|
for k in self.perf_history:
|
||||||
if len(self.perf_history[k]) > 100:
|
if len(self.perf_history[k]) > 100:
|
||||||
self.perf_history[k].pop(0)
|
self.perf_history[k].pop(0)
|
||||||
|
|
||||||
# Update labels
|
# Update labels
|
||||||
dpg.set_value("perf_fps_text", f"{metrics['fps']:.1f}")
|
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_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_cpu_text", f"{metrics['cpu_percent']:.1f}%")
|
||||||
dpg.set_value("perf_lag_text", f"{metrics['input_lag_ms']:.1f}ms")
|
dpg.set_value("perf_lag_text", f"{metrics['input_lag_ms']:.1f}ms")
|
||||||
|
|
||||||
# Update plots
|
# Update plots
|
||||||
if dpg.does_item_exist("perf_frame_plot"):
|
if dpg.does_item_exist("perf_frame_plot"):
|
||||||
dpg.set_value("perf_frame_plot", [list(range(100)), self.perf_history["frame_time"]])
|
dpg.set_value("perf_frame_plot", [list(range(100)), self.perf_history["frame_time"]])
|
||||||
if dpg.does_item_exist("perf_cpu_plot"):
|
if dpg.does_item_exist("perf_cpu_plot"):
|
||||||
dpg.set_value("perf_cpu_plot", [list(range(100)), self.perf_history["cpu"]])
|
dpg.set_value("perf_cpu_plot", [list(range(100)), self.perf_history["cpu"]])
|
||||||
|
|
||||||
def _append_comms_entry(self, entry: dict, idx: int):
|
def _append_comms_entry(self, entry: dict, idx: int):
|
||||||
if not dpg.does_item_exist("comms_scroll"):
|
if not dpg.does_item_exist("comms_scroll"):
|
||||||
@@ -1565,84 +1569,89 @@ class App:
|
|||||||
|
|
||||||
# ---- disc entry list ----
|
# ---- 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):
|
def _rebuild_disc_list(self):
|
||||||
|
"""Full rebuild of the discussion UI. Expensive! Use incrementally where possible."""
|
||||||
if not dpg.does_item_exist("disc_scroll"):
|
if not dpg.does_item_exist("disc_scroll"):
|
||||||
return
|
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)
|
dpg.delete_item("disc_scroll", children_only=True)
|
||||||
for i, entry in enumerate(self.disc_entries):
|
for i, entry in enumerate(self.disc_entries):
|
||||||
collapsed = entry.get("collapsed", False)
|
self._render_disc_entry(i, entry)
|
||||||
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()
|
|
||||||
|
|
||||||
def _make_disc_role_cb(self, idx: int):
|
def _make_disc_role_cb(self, idx: int):
|
||||||
def cb(sender, app_data):
|
def cb(sender, app_data):
|
||||||
@@ -2245,7 +2254,8 @@ class App:
|
|||||||
self.disc_roles.append(item["role"])
|
self.disc_roles.append(item["role"])
|
||||||
self._rebuild_disc_roles_list()
|
self._rebuild_disc_roles_list()
|
||||||
self.disc_entries.append(item)
|
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"):
|
if dpg.does_item_exist("disc_scroll"):
|
||||||
# Force scroll to bottom using a very large number
|
# Force scroll to bottom using a very large number
|
||||||
dpg.set_y_scroll("disc_scroll", 99999)
|
dpg.set_y_scroll("disc_scroll", 99999)
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ history = [
|
|||||||
|
|
||||||
[discussion.discussions."test for gemini conductor"]
|
[discussion.discussions."test for gemini conductor"]
|
||||||
git_commit = "ccdba69214aea169a4e707da7b425ae0c6139fca"
|
git_commit = "ccdba69214aea169a4e707da7b425ae0c6139fca"
|
||||||
last_updated = "2026-02-23T15:00:53"
|
last_updated = "2026-02-23T15:06:42"
|
||||||
history = [
|
history = [
|
||||||
"@2026-02-23T11:08:38\nUser:\nadded a file to yoru exposed files read it.",
|
"@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.",
|
"@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: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-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: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]
|
[agent.tools]
|
||||||
|
|||||||
@@ -35,5 +35,5 @@ active = "main"
|
|||||||
|
|
||||||
[discussion.discussions.main]
|
[discussion.discussions.main]
|
||||||
git_commit = ""
|
git_commit = ""
|
||||||
last_updated = "2026-02-23T15:01:18"
|
last_updated = "2026-02-23T15:07:42"
|
||||||
history = []
|
history = []
|
||||||
|
|||||||
Reference in New Issue
Block a user