feat(ui): Expose cache status and controls in UI
This commit is contained in:
@@ -1983,6 +1983,11 @@ class AppController:
|
||||
self.ui_base_system_prompt = ai_client._SYSTEM_PROMPT
|
||||
self.ui_use_default_base_prompt = False
|
||||
|
||||
def _cb_clear_summary_cache(self, user_data=None) -> None:
|
||||
from src import summarize
|
||||
summarize._summary_cache.clear()
|
||||
self._push_mma_state_update()
|
||||
|
||||
def _cb_show_base_prompt_diff(self, user_data=None) -> None:
|
||||
self._show_base_prompt_diff_modal = True
|
||||
|
||||
|
||||
+21
-1
@@ -144,6 +144,7 @@ class App:
|
||||
self._editing_persona_tool_preset_id = ""
|
||||
self._editing_persona_bias_profile_id = ""
|
||||
self._editing_persona_context_preset_id = ""
|
||||
self._editing_persona_aggregation_strategy = ""
|
||||
self._editing_persona_preferred_models_list: list[dict] = []
|
||||
self._editing_persona_scope = "project"
|
||||
self._editing_persona_is_new = True
|
||||
@@ -1475,6 +1476,7 @@ class App:
|
||||
self._editing_persona_name = ""; self._editing_persona_system_prompt = ""
|
||||
self._editing_persona_tool_preset_id = ""; self._editing_persona_bias_profile_id = ""
|
||||
self._editing_persona_context_preset_id = ""
|
||||
self._editing_persona_aggregation_strategy = ""
|
||||
self._editing_persona_preferred_models_list = [{"provider": self.current_provider, "model": self.current_model, "temperature": 0.7, "top_p": 1.0, "max_output_tokens": 4096, "history_trunc_limit": 900000}]
|
||||
self._editing_persona_scope = "project"; self._editing_persona_is_new = True
|
||||
imgui.separator()
|
||||
@@ -1484,6 +1486,7 @@ class App:
|
||||
p = personas[name]; self._editing_persona_name = p.name; self._editing_persona_system_prompt = p.system_prompt or ""
|
||||
self._editing_persona_tool_preset_id = p.tool_preset or ""; self._editing_persona_bias_profile_id = p.bias_profile or ""
|
||||
self._editing_persona_context_preset_id = getattr(p, 'context_preset', '') or ""
|
||||
self._editing_persona_aggregation_strategy = getattr(p, 'aggregation_strategy', '') or ""
|
||||
import copy; self._editing_persona_preferred_models_list = copy.deepcopy(p.preferred_models) if p.preferred_models else []
|
||||
self._editing_persona_scope = self.controller.persona_manager.get_persona_scope(p.name); self._editing_persona_is_new = False
|
||||
imgui.end_child()
|
||||
@@ -1573,6 +1576,9 @@ class App:
|
||||
imgui.table_next_column(); imgui.text("Context Preset:"); cn = ["None"] + sorted(self.controller.project.get("context_presets", {}).keys())
|
||||
c_idx = cn.index(self._editing_persona_context_preset_id) if getattr(self, '_editing_persona_context_preset_id', '') in cn else 0
|
||||
imgui.set_next_item_width(-1); _, c_idx = imgui.combo("##pcp", c_idx, cn); self._editing_persona_context_preset_id = cn[c_idx] if c_idx > 0 else ""
|
||||
imgui.table_next_column(); imgui.text("Aggregation Strategy:"); sn = ["auto", "full", "summarize", "skeleton"]
|
||||
s_idx = sn.index(self._editing_persona_aggregation_strategy) if getattr(self, '_editing_persona_aggregation_strategy', '') in sn else 0
|
||||
imgui.set_next_item_width(-1); _, s_idx = imgui.combo("##pas", s_idx, sn); self._editing_persona_aggregation_strategy = sn[s_idx]
|
||||
imgui.end_table()
|
||||
|
||||
if imgui.button("Manage Tools & Biases", imgui.ImVec2(-1, 0)): self.show_tool_preset_manager_window = True
|
||||
@@ -1600,7 +1606,7 @@ class App:
|
||||
if imgui.button("Save##pers", imgui.ImVec2(100, 0)):
|
||||
if self._editing_persona_name.strip():
|
||||
try:
|
||||
import copy; persona = models.Persona(name=self._editing_persona_name.strip(), system_prompt=self._editing_persona_system_prompt, tool_preset=self._editing_persona_tool_preset_id or None, bias_profile=self._editing_persona_bias_profile_id or None, context_preset=self._editing_persona_context_preset_id or None, preferred_models=copy.deepcopy(self._editing_persona_preferred_models_list))
|
||||
import copy; persona = models.Persona(name=self._editing_persona_name.strip(), system_prompt=self._editing_persona_system_prompt, tool_preset=self._editing_persona_tool_preset_id or None, bias_profile=self._editing_persona_bias_profile_id or None, context_preset=self._editing_persona_context_preset_id or None, aggregation_strategy=self._editing_persona_aggregation_strategy or None, preferred_models=copy.deepcopy(self._editing_persona_preferred_models_list))
|
||||
self.controller._cb_save_persona(persona, getattr(self, '_editing_persona_scope', 'project')); self.ai_status = f"Saved: {persona.name}"
|
||||
except Exception as e: self.ai_status = f"Error: {e}"
|
||||
else: self.ai_status = "Name required"
|
||||
@@ -2353,6 +2359,15 @@ def hello():
|
||||
d = filedialog.askdirectory()
|
||||
r.destroy()
|
||||
if d: self.files.append(models.FileItem(path=str(Path(d) / "**" / "*")))
|
||||
|
||||
imgui.separator()
|
||||
from src import summarize
|
||||
stats = summarize._summary_cache.get_stats()
|
||||
imgui.text_disabled(f"Summary Cache: {stats['entries']} entries ({stats['size_bytes']} bytes)")
|
||||
imgui.same_line()
|
||||
if imgui.button("Clear Summary Cache##btn_clear_summary_cache"):
|
||||
self.controller._cb_clear_summary_cache()
|
||||
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_files_panel")
|
||||
|
||||
def _render_screenshots_panel(self) -> None:
|
||||
@@ -2801,6 +2816,7 @@ def hello():
|
||||
self._editing_persona_tool_preset_id = persona.tool_preset or ""
|
||||
self._editing_persona_bias_profile_id = persona.bias_profile or ""
|
||||
self._editing_persona_context_preset_id = getattr(persona, 'context_preset', '') or ""
|
||||
self._editing_persona_aggregation_strategy = getattr(persona, 'aggregation_strategy', '') or ""
|
||||
import copy
|
||||
self._editing_persona_preferred_models_list = copy.deepcopy(persona.preferred_models) if persona.preferred_models else []
|
||||
self._editing_persona_is_new = False
|
||||
@@ -2842,6 +2858,8 @@ def hello():
|
||||
self._editing_persona_system_prompt = persona.system_prompt or ""
|
||||
self._editing_persona_tool_preset_id = persona.tool_preset or ""
|
||||
self._editing_persona_bias_profile_id = persona.bias_profile or ""
|
||||
self._editing_persona_context_preset_id = getattr(persona, 'context_preset', '') or ""
|
||||
self._editing_persona_aggregation_strategy = getattr(persona, 'aggregation_strategy', '') or ""
|
||||
import copy
|
||||
self._editing_persona_preferred_models_list = copy.deepcopy(persona.preferred_models) if persona.preferred_models else []
|
||||
self._editing_persona_scope = self.controller.persona_manager.get_persona_scope(persona.name)
|
||||
@@ -2851,6 +2869,8 @@ def hello():
|
||||
self._editing_persona_system_prompt = ""
|
||||
self._editing_persona_tool_preset_id = ""
|
||||
self._editing_persona_bias_profile_id = ""
|
||||
self._editing_persona_context_preset_id = ""
|
||||
self._editing_persona_aggregation_strategy = ""
|
||||
self._editing_persona_preferred_models_list = [{
|
||||
"provider": self.current_provider,
|
||||
"model": self.current_model,
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import pytest
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "src")))
|
||||
|
||||
from src import api_hook_client
|
||||
|
||||
@pytest.mark.integration
|
||||
@pytest.mark.timeout(300)
|
||||
def test_ui_cache_controls(live_gui) -> None:
|
||||
client = api_hook_client.ApiHookClient()
|
||||
assert client.wait_for_server(timeout=15), "Hook server did not start"
|
||||
|
||||
# Simply click the new clear cache button
|
||||
client.click('btn_clear_summary_cache')
|
||||
time.sleep(1.0)
|
||||
|
||||
# Ensure GUI is still responsive
|
||||
res = client.get_status()
|
||||
assert res.get('status') == 'ok', "GUI crashed during cache clear"
|
||||
print("[SIM] Cache controls UI test PASSED.")
|
||||
Reference in New Issue
Block a user