Private
Public Access
0
0

feat(hot-reload): Final style polish and gap fix

This commit is contained in:
2026-05-16 04:47:51 -04:00
parent 3c2fde3c83
commit 5b76607293
2 changed files with 22 additions and 204 deletions
+22
View File
@@ -0,0 +1,22 @@
import sys
import re
def fix_gaps():
file_path = "src/gui_2.py"
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
# Replace 3+ newlines with 2 newlines (one empty line)
# Using \r\n for Windows support if needed, but \n is standard for Python reads
content = re.sub(r"\n\n\n+", "\n\n", content)
# Specific fix for regions: ensure no extra space after region start or before region end
content = re.sub(r"(#region: .*)\n\n+", r"\1\n", content)
content = re.sub(r"\n\n+(#endregion: .*)", r"\n\1", content)
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)
print("Whitespace gaps fixed.")
if __name__ == "__main__":
fix_gaps()
-204
View File
@@ -630,12 +630,8 @@ class App:
f.write(data)
# ---------------------------------------------------------------- helpers
# ---------------------------------------------------------------- gui
def _gui_func(self) -> None:
io = imgui.get_io()
if io.key_ctrl and io.key_alt and io.keys_down[ord('R')]:
@@ -673,7 +669,6 @@ class App:
if self.perf_profiling_enabled: self.perf_monitor.end_component("_gui_func")
return
def _render_window_if_open(self, name: str, render_func: Callable[[], None], flag_condition: bool = True) -> None:
"""Helper to render a window only if its toggle is active."""
if not flag_condition or not self.show_windows.get(name, False): return
@@ -681,7 +676,6 @@ class App:
self.show_windows[name] = bool(opened)
if exp: render_func()
def _show_menus(self) -> None:
"""
[C: tests/test_gui_window_controls.py:test_gui_window_controls_minimize_maximize_close]
@@ -785,7 +779,6 @@ class App:
imgui.pop_style_color()
imgui.pop_style_color()
def _handle_history_logic(self) -> None:
"""
@@ -846,20 +839,13 @@ class App:
sys.stderr.flush()
#region: Diangostics & Analytics
#endregion: Diangostics & Analytics
#region: Logging
def cb_load_prior_log(self, path: Optional[str] = None) -> None:
if path is None:
root = hide_tk_root()
@@ -867,16 +853,9 @@ class App:
root.destroy()
if path:
self.controller.cb_load_prior_log(path)
#endregion: Logging
#region: Project Management
def _set_external_editor_default(self, editor_name: str) -> None:
from src import models
if "tools" not in self.config: self.config["tools"] = {}
@@ -911,34 +890,13 @@ class App:
paths.reset_resolved()
self.init_state()
self.ai_status = 'paths applied and session reset'
#endregion: Project Management
#region: AI Settings
#endregion: AI Settings
#region: Context Management
def _populate_auto_slices(self, f_item: models.FileItem) -> None:
"""
[C: tests/test_auto_slices.py:test_populate_auto_slices_basic]
@@ -973,10 +931,6 @@ class App:
slice_data['comment'] = name
f_item.custom_slices.append(slice_data)
def _update_context_file_stats(self) -> tuple[int, int]:
if not hasattr(self, '_file_stats_cache'): self._file_stats_cache = {}
if not hasattr(self, '_file_stats_queue'): self._file_stats_queue = []
@@ -1006,41 +960,15 @@ class App:
threading.Thread(target=_stats_worker, daemon=True).start()
return total_lines, total_ast
#endregion: Context Management
#region: Discussions
#endregion: Discussions
#region: Operations Monitor
#endregion: Operations Monitor
#region: Misc Tools
def _close_vscode_diff(self) -> None:
if hasattr(self, '_vscode_diff_process') and self._vscode_diff_process:
try:
@@ -1049,7 +977,6 @@ class App:
pass
self._vscode_diff_process = None
def _apply_pending_patch(self) -> None:
if not self._pending_patch_text:
self._patch_error_message = "No patch to apply"
@@ -1093,18 +1020,12 @@ class App:
self._vscode_diff_process = result
except Exception as e:
self._patch_error_message = str(e)
#endregion: Misc Tools
#region: Sanity Tests
#endregion: Sanity Tests
#region: MMA
def _reorder_ticket(self, src_idx: int, dst_idx: int) -> None:
"""
[C: tests/test_ticket_queue.py:TestReorder.test_reorder_ticket_invalid, tests/test_ticket_queue.py:TestReorder.test_reorder_ticket_valid]
@@ -1127,22 +1048,6 @@ class App:
self.active_tickets = new_tickets
self._push_mma_state_update()
def request_patch_from_tier4(self, error: str, file_context: str) -> None:
try:
from src import ai_client
@@ -1230,7 +1135,6 @@ class App:
t['status'] = 'todo'
changed = True
self._push_mma_state_update()
#endregion: MMA
def main() -> None:
@@ -1240,10 +1144,7 @@ def main() -> None:
if __name__ == "__main__":
main()
#region: Diagnostics & Analytics
def render_usage_analytics_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_usage_analytics_panel")
render_token_budget_panel(app)
@@ -1269,7 +1170,6 @@ def render_usage_analytics_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_usage_analytics_panel")
def render_diagnostics_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_diagnostics_panel")
with imscope.window("Diagnostics", app.show_windows.get("Diagnostics", False)) as (exp, opened):
@@ -1374,12 +1274,9 @@ def render_diagnostics_panel(app: App) -> None:
imgui.end_table()
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_diagnostics_panel")
#endregion: Diagnostics & Analytics
#region: Logging
def render_log_management(app: App) -> None:
"""
[C: tests/test_log_management_ui.py:test_render_log_management_logic]
@@ -1453,24 +1350,18 @@ def render_log_management(app: App) -> None:
imgui.end_table()
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_log_management")
#endregion: Logging
#region: Project Management
def render_project_settings_hub(app: App) -> None:
with imscope.tab_bar('context_hub_tabs'):
with imscope.tab_item('Projects') as (exp, _):
if exp: render_projects_panel(app)
with imscope.tab_item('Paths') as (exp, _):
if exp: render_paths_panel(app)
#endregion: Project Management
#region: AI Settings
def render_ai_settings_hub(app: App) -> None:
render_persona_selector_panel(app)
if imgui.collapsing_header("Provider & Model"): render_provider_panel(app)
@@ -1478,7 +1369,6 @@ def render_ai_settings_hub(app: App) -> None:
if imgui.collapsing_header("RAG Settings"): render_rag_panel(app)
render_agent_tools_panel(app)
def render_preset_manager_content(app: App, is_embedded: bool = False) -> None:
avail = imgui.get_content_region_avail()
if not hasattr(app, "_prompt_md_preview"): app._prompt_md_preview = False
@@ -1568,7 +1458,6 @@ def render_preset_manager_content(app: App, is_embedded: bool = False) -> None:
if imgui.button("Close##p", imgui.ImVec2(100, 0)): app.show_preset_manager_window = False
imgui.end_table()
def render_preset_manager_window(app: App, is_embedded: bool = False) -> None:
if not app.show_preset_manager_window and not is_embedded: return
if not is_embedded:
@@ -1579,7 +1468,6 @@ def render_preset_manager_window(app: App, is_embedded: bool = False) -> None:
else:
render_preset_manager_content(app, is_embedded=is_embedded)
def render_tool_preset_manager_content(app: App, is_embedded: bool = False) -> None:
avail = imgui.get_content_region_avail()
if not hasattr(app, "_tool_split_v"): app._tool_split_v = 0.4
@@ -1761,7 +1649,6 @@ def render_tool_preset_manager_content(app: App, is_embedded: bool = False) -> N
if imgui.button("Close##tp", imgui.ImVec2(100, 0)): app.show_tool_preset_manager_window = False
imgui.end_table()
def render_tool_preset_manager_window(app: App, is_embedded: bool = False) -> None:
if not app.show_tool_preset_manager_window and not is_embedded: return
if not is_embedded:
@@ -1772,7 +1659,6 @@ def render_tool_preset_manager_window(app: App, is_embedded: bool = False) -> No
else:
render_preset_manager_content(app, is_embedded=is_embedded)
def render_persona_editor_window(app: App, is_embedded: bool = False) -> None:
if not app.show_persona_editor_window and not is_embedded: return
if not is_embedded:
@@ -1944,12 +1830,9 @@ def render_persona_editor_window(app: App, is_embedded: bool = False) -> None:
if not is_embedded:
imgui.end()
#endregion: AI Settings
#region: Context Management
def render_files_and_media(app: App) -> None:
"""
[C: tests/test_gui_fast_render.py:test_render_files_and_media_fast]
@@ -2059,7 +1942,6 @@ def render_files_and_media(app: App) -> None:
if p not in app.screenshots: app.screenshots.append(p)
return
def render_files_panel(app: App, height_override: float = 0) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_files_panel")
imgui.text("Paths")
@@ -2140,7 +2022,6 @@ def render_files_panel(app: App, height_override: float = 0) -> None:
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_files_panel")
def render_screenshots_panel(app: App, height_override: float = 0) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_screenshots_panel")
imgui.text("Paths"); imgui.same_line(); imgui.text("| Base Dir:"); imgui.same_line();
@@ -2175,7 +2056,6 @@ def render_screenshots_panel(app: App, height_override: float = 0) -> None:
if p not in app.screenshots: app.screenshots.append(p)
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_screenshots_panel")
def render_context_batch_actions(app: App, total_lines: int, total_ast: int) -> None:
imgui.text("Batch:")
for mode in ["full", "summary", "skeleton", "outline", "masked", "none"]:
@@ -2212,7 +2092,6 @@ def render_context_batch_actions(app: App, total_lines: int, total_ast: int) ->
imgui.same_line()
imgui.text(f" | Total: {len(app.context_files)} files, {total_lines} lines, {total_ast} AST elements")
def render_add_context_files_modal(app: App) -> None:
"""
[C: tests/test_auto_slices.py:test_add_selected_triggers_auto_slices]
@@ -2252,12 +2131,9 @@ def render_add_context_files_modal(app: App) -> None:
app._ui_picker_selected.clear()
imgui.close_current_popup()
imgui.end_popup()
#endregion: Context Management
#region: Discussions
def render_discussion_hub(app: App) -> None:
with imscope.tab_bar("discussion_hub_tabs"):
with imscope.tab_item("Discussion") as (exp, opened):
@@ -2270,7 +2146,6 @@ def render_discussion_hub(app: App) -> None:
if exp: render_takes_panel(app)
return
def render_discussion_entry(app: App, entry: dict, index: int) -> None:
with imscope.id(f"disc_{index}"):
collapsed, read_mode = entry.get("collapsed", False), entry.get("read_mode", False)
@@ -2316,7 +2191,6 @@ def render_discussion_entry(app: App, entry: dict, index: int) -> None:
if not (bool(thinking_segments) and not has_content): ch, entry["content"] = imgui.input_text_multiline("##content", entry["content"], imgui.ImVec2(-1, 150))
imgui.separator()
def render_discussion_entry_read_mode(app: App, entry: dict, index: int) -> None:
content = entry["content"]
if not content.strip(): return
@@ -2362,12 +2236,9 @@ def render_discussion_entry_read_mode(app: App, entry: dict, index: int) -> None
with theme.ai_text_style():
markdown_helper.render(after, context_id=f'disc_{index}_a')
if app.ui_word_wrap: imgui.pop_text_wrap_pos()
#endregion: Discussions
#region: Operations Monitor
def render_operations_hub(app: App) -> None:
imgui.push_style_var(imgui.StyleVar_.item_spacing, imgui.ImVec2(10, 4))
ch1, app.ui_separate_tool_calls_panel = imgui.checkbox("Pop Out Tool Calls", app.ui_separate_tool_calls_panel)
@@ -2408,7 +2279,6 @@ def render_operations_hub(app: App) -> None:
ch_combo, new_idx = imgui.combo(t, idx, profiles)
if ch_combo: app.controller.ui_tier_layout_bindings[t] = profiles[new_idx]
def render_message_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_message_panel")
# LIVE indicator
@@ -2448,7 +2318,6 @@ def render_message_panel(app: App) -> None:
if imgui.button("Reset"): app._handle_reset_session()
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_message_panel")
def render_response_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_response_panel")
if app._trigger_blink:
@@ -2489,7 +2358,6 @@ def render_response_panel(app: App) -> None:
app.disc_entries.append(entry)
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_response_panel")
def render_tool_calls_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_tool_calls_panel")
imgui.text("Tool call history")
@@ -2555,7 +2423,6 @@ def render_tool_calls_panel(app: App) -> None:
app._scroll_tool_calls_to_bottom = False
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tool_calls_panel")
def render_external_tools_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_external_tools_panel")
if imgui.button("Refresh External MCPs"): app.event_queue.put("refresh_external_mcps", None)
@@ -2599,12 +2466,9 @@ def render_external_tools_panel(app: App) -> None:
imgui.text(tinfo.get('description', ''))
imgui.end_table()
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_external_tools_panel")
#endregion: Operations Monitor
#region: Misc Tools
def render_text_viewer(app: App, label: str, content: str, text_type: str = 'text', force_open: bool = False) -> None:
if imgui.button("[+]##" + str(id(content))) or force_open:
app.text_viewer_type = text_type
@@ -2612,7 +2476,6 @@ def render_text_viewer(app: App, label: str, content: str, text_type: str = 'tex
app.text_viewer_title = label
app.text_viewer_content = content
def render_heavy_text(app: App, label: str, content: str, id_suffix: str = "") -> None:
imgui.text_colored(C_LBL, f"{label}:")
imgui.same_line()
@@ -2648,7 +2511,6 @@ def render_heavy_text(app: App, label: str, content: str, id_suffix: str = "") -
else:
imgui.text(content)
def render_thinking_trace(app: App, segments: list[dict], entry_index: int, is_standalone: bool = False) -> None:
if not segments:
return
@@ -2678,7 +2540,6 @@ def render_thinking_trace(app: App, segments: list[dict], entry_index: int, is_s
imgui.unindent()
def render_selectable_label(app: App, label: str, value: str, width: float = 0.0, multiline: bool = False, height: float = 0.0, color: Optional[imgui.ImVec4] = None) -> None:
with imscope.id(label + str(hash(value))):
with imscope.style_color(imgui.Col_.frame_bg, vec4(0, 0, 0, 0)), \
@@ -2700,12 +2561,9 @@ def render_selectable_label(app: App, label: str, value: str, width: float = 0.0
else:
if width > 0: imgui.set_next_item_width(width)
imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only)
#endregion: Misc Tools
#region: MMA
def render_mma_dashboard(app: App) -> None:
"""
Main MMA dashboard interface.
@@ -2739,7 +2597,6 @@ def render_mma_dashboard(app: App) -> None:
render_mma_agent_streams(app)
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_mma_dashboard")
def render_mma_modals(app: App) -> None:
"""Renders all MMA-specific approval and info modals."""
is_nerv = theme.is_nerv_active()
@@ -2816,7 +2673,6 @@ def render_mma_modals(app: App) -> None:
if imgui.button("OK"): imgui.close_current_popup()
imgui.end_popup()
def render_mma_track_summary(app: App) -> None:
"""
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
@@ -2848,7 +2704,6 @@ def render_mma_track_summary(app: App) -> None:
eta_mins = (app._avg_ticket_time * remaining) / 60.0
imgui.text_colored(C_LBL, "ETA:"); imgui.same_line(); imgui.text_colored(C_VAL, f"~{int(eta_mins)}m ({remaining} tickets remaining)")
def render_mma_epic_planner(app: App) -> None:
"""
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
@@ -2857,7 +2712,6 @@ def render_mma_epic_planner(app: App) -> None:
_, app.ui_epic_input = imgui.input_text_multiline('##epic_input', app.ui_epic_input, imgui.ImVec2(-1, 80))
if imgui.button('Plan Epic (Tier 1)', imgui.ImVec2(-1, 0)): app._cb_plan_epic()
def render_mma_conductor_setup(app: App) -> None:
"""
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
@@ -2865,7 +2719,6 @@ def render_mma_conductor_setup(app: App) -> None:
if imgui.button("Run Setup Scan"): app._cb_run_conductor_setup()
if app.ui_conductor_setup_summary: imgui.input_text_multiline("##setup_summary", app.ui_conductor_setup_summary, imgui.ImVec2(-1, 120), imgui.InputTextFlags_.read_only)
def render_mma_track_browser(app: App) -> None:
"""
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
@@ -2895,7 +2748,6 @@ def render_mma_track_browser(app: App) -> None:
app._cb_create_track(app.ui_new_track_name, app.ui_new_track_desc, app.ui_new_track_type)
app.ui_new_track_name = ""; app.ui_new_track_desc = ""
def render_mma_global_controls(app: App) -> None:
"""
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
@@ -2927,7 +2779,6 @@ def render_mma_global_controls(app: App) -> None:
imgui.text_colored(imgui.ImVec4(1, 0, 0, 1), f"Error: {app._hot_reload_error or 'Unknown'}")
imgui.same_line(); imgui.text_disabled("(Ctrl+Alt+R)")
def render_mma_usage_section(app: App) -> None:
"""
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
@@ -2974,7 +2825,6 @@ def render_mma_usage_section(app: App) -> None:
imgui.end_combo()
imgui.pop_item_width()
def render_mma_ticket_editor(app: App) -> None:
imgui.separator(); imgui.text_colored(C_VAL, f"Editing: {app.ui_selected_ticket_id}")
ticket = next((t for t in app.active_tickets if str(t.get('id', '')) == app.ui_selected_ticket_id), None)
@@ -2995,7 +2845,6 @@ def render_mma_ticket_editor(app: App) -> None:
imgui.same_line()
if imgui.button(f"Delete##{app.ui_selected_ticket_id}"): app.active_tickets = [t for t in app.active_tickets if str(t.get('id', '')) != app.ui_selected_ticket_id]; app.ui_selected_ticket_id = None; app._push_mma_state_update()
def render_mma_agent_streams(app: App) -> None:
"""
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
@@ -3016,7 +2865,6 @@ def render_mma_agent_streams(app: App) -> None:
if exp: render_beads_tab(app)
imgui.end_tab_bar()
def render_tier_stream_panel(app: App, tier_key: str, stream_key: str | None) -> None:
"""
[C: tests/test_mma_dashboard_streams.py:TestMMADashboardStreams.test_tier1_renders_stream_content, tests/test_mma_dashboard_streams.py:TestMMADashboardStreams.test_tier3_renders_worker_subheaders]
@@ -3067,7 +2915,6 @@ def render_tier_stream_panel(app: App, tier_key: str, stream_key: str | None) ->
pass
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tier_stream_panel")
def render_track_proposal_modal(app: App) -> None:
if app._show_track_proposal_modal:
imgui.open_popup("Track Proposal")
@@ -3112,8 +2959,6 @@ def render_track_proposal_modal(app: App) -> None:
else:
imgui.close_current_popup()
imgui.end_popup()
#endregion: MMA
def render_save_preset_modal(app: App) -> None:
@@ -3140,7 +2985,6 @@ def render_save_preset_modal(app: App) -> None:
app._show_save_preset_modal = False
imgui.close_current_popup()
def render_main_interface(app: App) -> None:
render_error_tint(app)
app.perf_monitor.start_frame()
@@ -3232,13 +3076,11 @@ def render_main_interface(app: App) -> None:
render_approve_script_modal(app)
render_mma_modals(app)
def render_custom_title_bar(app: App) -> None:
# Obsolete, removed since it renders behind the full screen dock space.
# Controls are now embedded in _show_menus.
pass
def render_history_window(app: App) -> None:
if not app.show_windows.get('Undo/Redo History', False):
return
@@ -3263,7 +3105,6 @@ def render_history_window(app: App) -> None:
if not history: imgui.text("No history available.")
else: iterate_history()
def render_theme_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_theme_panel")
exp, opened = imgui.begin("Theme", app.show_windows["Theme"])
@@ -3346,7 +3187,6 @@ def render_theme_panel(app: App) -> None:
imgui.end()
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_theme_panel")
def render_shader_live_editor(app: App) -> None:
"""
[C: tests/test_shader_live_editor.py:test_shader_live_editor_renders]
@@ -3359,7 +3199,6 @@ def render_shader_live_editor(app: App) -> None:
changed_scan, app.shader_uniforms['scanline'] = imgui.slider_float('Scanline Intensity', app.shader_uniforms['scanline'], 0.0, 1.0)
changed_bloom, app.shader_uniforms['bloom'] = imgui.slider_float('Bloom Threshold', app.shader_uniforms['bloom'], 0.0, 1.0)
def render_cache_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_cache_panel")
if app.current_provider != "gemini":
@@ -3392,7 +3231,6 @@ def render_cache_panel(app: App) -> None:
imgui.text_colored(imgui.ImVec4(0.2, 1.0, 0.2, 1.0), "Cache cleared - will rebuild on next request")
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_cache_panel")
def render_tool_analytics_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_tool_analytics_panel")
imgui.text_colored(C_LBL, 'Tool Usage')
@@ -3431,7 +3269,6 @@ def render_tool_analytics_panel(app: App) -> None:
imgui.end_table()
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tool_analytics_panel")
def render_token_budget_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_token_budget_panel")
imgui.text_colored(C_LBL, 'Prompt Utilization')
@@ -3528,7 +3365,6 @@ def render_token_budget_panel(app: App) -> None:
imgui.text_disabled("Cache Usage: INACTIVE")
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_token_budget_panel")
def render_session_insights_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_session_insights_panel")
imgui.text_colored(C_LBL, 'Session Insights')
@@ -3544,7 +3380,6 @@ def render_session_insights_panel(app: App) -> None:
imgui.text(f"Tokens/Ticket: {efficiency:.0f}" if efficiency > 0 else "Tokens/Ticket: N/A")
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_session_insights_panel")
def render_projects_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_projects_panel")
proj_name = app.project.get("project", {}).get("name", Path(app.active_project_path).stem)
@@ -3630,7 +3465,6 @@ def render_projects_panel(app: App) -> None:
ch, app.ui_auto_scroll_tool_calls = imgui.checkbox("Auto-scroll Tool History", app.ui_auto_scroll_tool_calls)
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_projects_panel")
def render_paths_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_paths_panel")
path_info = paths.get_full_path_info()
@@ -3638,7 +3472,6 @@ def render_paths_panel(app: App) -> None:
imgui.text_colored(C_IN, "System Path Configuration")
imgui.separator()
def render_path_field(label: str, attr: str, key: str, tooltip: str):
info = path_info.get(key, {'source': 'unknown'})
imgui.text(label)
@@ -3657,7 +3490,6 @@ def render_path_field(label: str, attr: str, key: str, tooltip: str):
r.destroy()
if d: setattr(app, attr, d)
def render_rag_panel(app: App) -> None:
conf = app.controller.rag_config
if not conf: return
@@ -3695,7 +3527,6 @@ def render_rag_panel(app: App) -> None:
if imgui.button("Rebuild Index"): app.controller.event_queue.put('click', 'btn_rebuild_rag_index')
def render_system_prompts_panel(app: App) -> None:
imgui.text("Global System Prompt (all projects)")
preset_names = sorted(app.controller.presets.keys())
@@ -3748,7 +3579,6 @@ def render_system_prompts_panel(app: App) -> None:
imgui.set_item_tooltip("Open preset management modal")
ch, app.ui_project_system_prompt = imgui.input_text_multiline("##psp", app.ui_project_system_prompt, imgui.ImVec2(-1, 100))
def render_agent_tools_panel(app: App) -> None:
if imgui.collapsing_header("Active Tool Presets & Biases", imgui.TreeNodeFlags_.default_open):
imgui.text("Tool Preset")
@@ -3814,7 +3644,6 @@ def render_agent_tools_panel(app: App) -> None:
if imgui.radio_button(f"Ask##{cat_name}_{tool.name}", mode == "ask"): tool.approval = "ask"
imgui.tree_pop()
def render_provider_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_provider_panel")
imgui.text("Provider")
@@ -3881,7 +3710,6 @@ def render_provider_panel(app: App) -> None:
ai_client._gemini_cli_adapter.binary_path = app.ui_gemini_cli_path
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_provider_panel")
def render_persona_selector_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_persona_selector_panel")
imgui.text("Persona")
@@ -3964,7 +3792,6 @@ def render_persona_selector_panel(app: App) -> None:
imgui.separator()
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_persona_selector_panel")
def render_context_composition_panel(app: App) -> None:
"""
[C: tests/test_auto_slices.py:test_add_all_triggers_auto_slices, tests/test_gui_fast_render.py:test_render_context_composition_panel_fast]
@@ -3980,7 +3807,6 @@ def render_context_composition_panel(app: App) -> None:
imgui.separator()
render_context_presets(app)
def render_ast_inspector_modal(app: App) -> None:
"""
[C: tests/test_ast_inspector_extended.py:test_ast_inspector_line_range_parsing]
@@ -3990,7 +3816,6 @@ def render_ast_inspector_modal(app: App) -> None:
app._show_ast_inspector = False
#region: AST Inspector
expanded, opened = imgui.begin_popup_modal('AST Inspector', True, imgui.WindowFlags_.always_auto_resize)
if opened:
if expanded:
@@ -4120,7 +3945,6 @@ def render_ast_inspector_modal(app: App) -> None:
if not opened: app.ui_inspecting_ast_file = None
def render_save_workspace_profile_modal(app: App) -> None:
if app._show_save_workspace_profile_modal:
imgui.open_popup("Save Workspace Profile")
@@ -4148,7 +3972,6 @@ def render_save_workspace_profile_modal(app: App) -> None:
imgui.end_popup()
def render_context_presets_panel(app: App) -> None:
imgui.text_colored(C_IN, "Context Presets")
imgui.separator()
@@ -4171,11 +3994,9 @@ def render_context_presets_panel(app: App) -> None:
imgui.same_line()
if imgui.button(f"Delete##{name}"): app.delete_context_preset(name)
def render_context_screenshots(app: App) -> None:
for i, s in enumerate(app.screenshots): imgui.text(s)
def render_context_files_table(app: App) -> None:
imgui.dummy(imgui.ImVec2(0, 4))
grouped_files = aggregate.group_files_by_dir(app.context_files)
@@ -4281,7 +4102,6 @@ def render_context_files_table(app: App) -> None:
imgui.same_line()
imgui.text_colored(imgui.ImVec4(1.0, 0.5, 0.0, 1.0), "[Slices Active]")
def render_context_presets(app: App) -> None:
imgui.text("Presets")
presets = app.controller.project.get('context_presets', {})
@@ -4310,7 +4130,6 @@ def render_context_presets(app: App) -> None:
app.delete_context_preset(app.ui_active_context_preset)
app.ui_active_context_preset = ""
def render_discussion_entries(app: App) -> None:
with imscope.child("disc_scroll"):
display_entries = app.disc_entries
@@ -4325,7 +4144,6 @@ def render_discussion_entries(app: App) -> None:
render_discussion_entry(app, display_entries[i], i)
if app._scroll_disc_to_bottom: imgui.set_scroll_here_y(1.0); app._scroll_disc_to_bottom = False
def render_discussion_entry_controls(app: App) -> None:
if imgui.button("+ Entry"): app.disc_entries.append({"role": app.disc_roles[0] if app.disc_roles else "User", "content": "", "collapsed": True, "ts": project_manager.now_ts()})
imgui.same_line()
@@ -4347,7 +4165,6 @@ def render_discussion_entry_controls(app: App) -> None:
with app._disc_entries_lock: app.disc_entries = truncate_entries(app.disc_entries, app.ui_disc_truncate_pairs)
app.ai_status = f"history truncated to {app.ui_disc_truncate_pairs} pairs"
def render_discussion_metadata(app: App) -> None:
disc_data = app.project.get("discussion", {}).get("discussions", {}).get(app.active_discussion, {})
git_commit, last_updated = disc_data.get("git_commit", ""), disc_data.get("last_updated", "")
@@ -4370,7 +4187,6 @@ def render_discussion_metadata(app: App) -> None:
imgui.same_line()
if imgui.button("Delete"): app._delete_discussion(app.active_discussion)
def render_discussion_panel(app: App) -> None:
"""
[C: tests/test_discussion_takes_gui.py:test_render_discussion_tabs, tests/test_discussion_takes_gui.py:test_switching_discussion_via_tabs, tests/test_gui_discussion_tabs.py:test_discussion_tabs_rendered, tests/test_gui_fast_render.py:test_render_discussion_panel_fast, tests/test_gui_phase4.py:test_track_discussion_toggle, tests/test_gui_symbol_navigation.py:test_render_discussion_panel_symbol_lookup]
@@ -4393,7 +4209,6 @@ def render_discussion_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_discussion_panel")
return
def render_discussion_roles(app: App) -> None:
if imgui.collapsing_header("Roles"):
with imscope.child("roles_scroll", size_y=100, flags=True):
@@ -4407,7 +4222,6 @@ def render_discussion_roles(app: App) -> None:
if r and r not in app.disc_roles: app.disc_roles.append(r); app.ui_disc_new_role_input = ""
return
def render_discussion_selector(app: App) -> None:
if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open):
return
@@ -4453,7 +4267,6 @@ def render_discussion_selector(app: App) -> None:
render_discussion_metadata(app)
return
def render_discussion_tab(app: App) -> None:
imgui.begin_child("HistoryChild", size=(0, -app.ui_discussion_split_h))
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_discussion_panel")
@@ -4489,7 +4302,6 @@ def render_discussion_tab(app: App) -> None:
else:
imgui.text_disabled("Message & Response panels are detached.")
def render_takes_panel(app: App) -> None:
imgui.text("Takes & Synthesis")
imgui.separator()
@@ -4546,7 +4358,6 @@ def render_takes_panel(app: App) -> None:
app.disc_entries.append({"role": "user", "content": prompt, "collapsed": False, "ts": project_manager.now_ts()})
app._handle_generate_send()
def render_prior_session_view(app: App) -> None:
with imscope.style_color(imgui.Col_.child_bg, vec4(50, 40, 20)):
if imgui.button("Exit Prior Session"): app.controller.cb_exit_prior_session(); app._comms_log_dirty = True
@@ -4572,7 +4383,6 @@ def render_prior_session_view(app: App) -> None:
markdown_helper.render(content, context_id=f'prior_disc_{idx}')
imgui.separator()
def render_thinking_indicator(app: App) -> None:
is_thinking = app.ai_status in ['sending...', 'streaming...', 'running powershell...']
if is_thinking:
@@ -4581,7 +4391,6 @@ def render_thinking_indicator(app: App) -> None:
c = vec4(255, 50, 50, alpha) if theme.is_nerv_active() else vec4(255, 100, 100, alpha)
imgui.text_colored(c, "THINKING..."); imgui.same_line()
def render_synthesis_panel(app: App) -> None:
"""
@@ -4614,7 +4423,6 @@ def render_synthesis_panel(app: App) -> None:
with app._disc_entries_lock: app.disc_entries.append({"role": "User", "content": prompt, "collapsed": False, "ts": project_manager.now_ts()})
app._handle_generate_send()
def render_snapshot_tab(app: App) -> None:
if imgui.begin_tab_bar("snapshot_tabs"):
if imgui.begin_tab_item("Aggregate MD")[0]:
@@ -4651,7 +4459,6 @@ def render_snapshot_tab(app: App) -> None:
imgui.end_tab_item()
imgui.end_tab_bar()
def render_comms_history_panel(app: App) -> None:
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_comms_history_panel")
st_col = vec4(200, 220, 160)
@@ -4770,7 +4577,6 @@ def render_comms_history_panel(app: App) -> None:
if app.is_viewing_prior_session: imgui.pop_style_color()
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_comms_history_panel")
def render_text_viewer_window(app: App) -> None:
"""Renders the standalone text/code/markdown viewer window."""
if not app.show_text_viewer: return
@@ -4892,7 +4698,6 @@ def render_text_viewer_window(app: App) -> None:
render_ast_inspector_modal(app)
return
def render_base_prompt_diff_modal(app: App) -> None:
if not getattr(app.controller, "_show_base_prompt_diff_modal", False):
return
@@ -4922,7 +4727,6 @@ def render_base_prompt_diff_modal(app: App) -> None:
imgui.close_current_popup()
imgui.end_popup()
def render_patch_modal(app: App) -> None:
if not app._show_patch_modal:
return
@@ -4967,7 +4771,6 @@ def render_patch_modal(app: App) -> None:
app._patch_error_message = None
imgui.close_current_popup()
def render_external_editor_panel(app: App) -> None:
from src.external_editor import get_default_launcher
imgui.text("External Editor for Diff Viewing")
@@ -5014,7 +4817,6 @@ def render_external_editor_panel(app: App) -> None:
except Exception as e:
imgui.text_colored(C_TC, f"Error: {str(e)}")
def render_approve_script_modal(app: App) -> None:
"""Renders the modal dialog for approving AI-generated PowerShell scripts."""
with app._pending_dialog_lock:
@@ -5058,7 +4860,6 @@ def render_approve_script_modal(app: App) -> None:
imgui.close_current_popup()
imgui.end_popup()
def render_markdown_test(app: App) -> None:
imgui.text("Markdown Test Panel")
imgui.separator()
@@ -5083,7 +4884,6 @@ def hello():
"""
markdown_helper.render(md)
def render_ticket_queue(app: App) -> None:
"""
[C: tests/test_gui_kill_button.py:test_render_ticket_queue_table_columns]
@@ -5199,7 +4999,6 @@ def render_ticket_queue(app: App) -> None:
imgui.end_table()
def render_task_dag_panel(app: App) -> None: # 4. Task DAG Visualizer
imgui.text("Task DAG")
if (app.active_track or app.active_tickets) and app.node_editor_ctx:
@@ -5343,7 +5142,6 @@ def render_task_dag_panel(app: App) -> None: # 4. Task DAG Visualizer
else:
imgui.text_disabled("No active MMA track or tickets.")
def render_beads_tab(app: App) -> None:
imgui.text("Beads Graph (Dolt-backed)")
if imgui.button("Refresh Beads"):
@@ -5385,7 +5183,6 @@ def render_beads_tab(app: App) -> None:
except Exception as e:
imgui.text_colored(imgui.ImVec4(1, 0, 0, 1), f"Error loading beads: {e}")
def render_mma_focus_selector(app: App) -> None:
"""
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
@@ -5400,7 +5197,6 @@ def render_mma_focus_selector(app: App) -> None:
imgui.same_line()
if app.ui_focus_agent and imgui.button("x##clear_focus"): app.ui_focus_agent = None
def render_error_tint(app: App) -> None:
"""Renders a red tint overlay if hot reload failed."""
if not HotReloader.is_error_state: return