gemini 3.1 fails

This commit is contained in:
2026-05-12 19:50:46 -04:00
parent 87aeee3322
commit ff1a9d77f7
2 changed files with 425 additions and 438 deletions
+43 -92
View File
@@ -15,7 +15,7 @@ import threading
import time import time
# from defer import defer # from defer import defer
import tomli_w import tomli_w
# from contextlib import ExitStack # from contextlib import ExitStack, nullcontext
import traceback import traceback
import typing import typing
from pathlib import Path from pathlib import Path
@@ -605,8 +605,8 @@ class App:
def _render_thinking_trace(self, segments: list[dict], entry_index: int, is_standalone: bool = False) -> None: def _render_thinking_trace(self, segments: list[dict], entry_index: int, is_standalone: bool = False) -> None:
if not segments: if not segments:
return return
imgui.push_style_color(imgui.Col_.child_bg, vec4(40, 35, 25, 180)) with imscope.style_color(imgui.Col_.child_bg, vec4(40, 35, 25, 180)), \
imgui.push_style_color(imgui.Col_.text, vec4(200, 200, 150)) imscope.style_color(imgui.Col_.text, vec4(200, 200, 150)):
imgui.indent() imgui.indent()
show_content = True show_content = True
@@ -623,35 +623,35 @@ class App:
with imscope.id(f"think_{entry_index}_{idx}"): with imscope.id(f"think_{entry_index}_{idx}"):
imgui.text_colored(vec4(180, 150, 80), f"[{marker}]") imgui.text_colored(vec4(180, 150, 80), f"[{marker}]")
if self.ui_word_wrap: if self.ui_word_wrap:
imscope.text_wrap(imgui.get_content_region_avail().x) with imscope.text_wrap(imgui.get_content_region_avail().x):
imgui.text_colored(vec4(200, 200, 150), content) imgui.text_colored(vec4(200, 200, 150), content)
else: else:
imgui.text_colored(vec4(200, 200, 150), content) imgui.text_colored(vec4(200, 200, 150), content)
imgui.separator() imgui.separator()
imgui.unindent() imgui.unindent()
imgui.pop_style_color(2)
def _render_selectable_label(self, label: str, value: str, width: float = 0.0, multiline: bool = False, height: float = 0.0, color: Optional[imgui.ImVec4] = None) -> None: def _render_selectable_label(self, label: str, value: str, width: float = 0.0, multiline: bool = False, height: float = 0.0, color: Optional[imgui.ImVec4] = None) -> None:
imgui.push_id(label + str(hash(value))) with imscope.id(label + str(hash(value))):
pops = 4 with imscope.style_color(imgui.Col_.frame_bg, vec4(0, 0, 0, 0)), \
imgui.push_style_color(imgui.Col_.frame_bg, vec4(0, 0, 0, 0)) imscope.style_color(imgui.Col_.frame_bg_hovered, vec4(0, 0, 0, 0)), \
imgui.push_style_color(imgui.Col_.frame_bg_hovered, vec4(0, 0, 0, 0)) imscope.style_color(imgui.Col_.frame_bg_active, vec4(0, 0, 0, 0)), \
imgui.push_style_color(imgui.Col_.frame_bg_active, vec4(0, 0, 0, 0)) imscope.style_color(imgui.Col_.border, vec4(0, 0, 0, 0)):
imgui.push_style_color(imgui.Col_.border, vec4(0, 0, 0, 0)) with imscope.style_var(imgui.StyleVar_.frame_border_size, 0.0), \
imscope.style_var(imgui.StyleVar_.frame_padding, imgui.ImVec2(0, 0)):
if color: if color:
imgui.push_style_color(imgui.Col_.text, color) with imscope.style_color(imgui.Col_.text, color):
pops += 1 if multiline:
imgui.push_style_var(imgui.StyleVar_.frame_border_size, 0.0) imgui.input_text_multiline("##" + label, value, imgui.ImVec2(width, height), imgui.InputTextFlags_.read_only)
imgui.push_style_var(imgui.StyleVar_.frame_padding, imgui.ImVec2(0, 0)) else:
if width > 0: imgui.set_next_item_width(width)
imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only)
else:
if multiline: if multiline:
imgui.input_text_multiline("##" + label, value, imgui.ImVec2(width, height), imgui.InputTextFlags_.read_only) imgui.input_text_multiline("##" + label, value, imgui.ImVec2(width, height), imgui.InputTextFlags_.read_only)
else: else:
if width > 0: imgui.set_next_item_width(width) if width > 0: imgui.set_next_item_width(width)
imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only) imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only)
imgui.pop_style_color(pops)
imgui.pop_style_var(2)
imgui.pop_id()
def _render_window_if_open(self, name: str, render_func: Callable[[], None], flag_condition: bool = True) -> None: 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.""" """Helper to render a window only if its toggle is active."""
@@ -1220,7 +1220,7 @@ class App:
imgui.text_colored(c, "THINKING..."); imgui.same_line() imgui.text_colored(c, "THINKING..."); imgui.same_line()
def _render_prior_session_view(self) -> None: def _render_prior_session_view(self) -> None:
imgui.push_style_color(imgui.Col_.child_bg, vec4(50, 40, 20)) with imscope.style_color(imgui.Col_.child_bg, vec4(50, 40, 20)):
if imgui.button("Exit Prior Session"): self.controller.cb_exit_prior_session(); self._comms_log_dirty = True if imgui.button("Exit Prior Session"): self.controller.cb_exit_prior_session(); self._comms_log_dirty = True
imgui.separator() imgui.separator()
with imscope.child("prior_scroll"): with imscope.child("prior_scroll"):
@@ -1241,13 +1241,9 @@ class App:
imgui.text_colored(vec4(180, 180, 180), preview) imgui.text_colored(vec4(180, 180, 180), preview)
else: else:
is_nerv = theme.is_nerv_active() is_nerv = theme.is_nerv_active()
if is_nerv: imgui.push_style_color(imgui.Col_.text, vec4(80, 255, 80)) with imscope.style_color(imgui.Col_.text, vec4(80, 255, 80)) if is_nerv else nullcontext():
markdown_helper.render(content, context_id=f'prior_disc_{idx}') markdown_helper.render(content, context_id=f'prior_disc_{idx}')
if is_nerv: imgui.pop_style_color()
imgui.separator() imgui.separator()
imgui.pop_style_color()
def _render_discussion_selector(self) -> None:
if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return
names = self._get_discussion_names(); grouped = {} names = self._get_discussion_names(); grouped = {}
for name in names: for name in names:
@@ -2204,11 +2200,12 @@ class App:
if not self.show_preset_manager_window and not is_embedded: return if not self.show_preset_manager_window and not is_embedded: return
if not is_embedded: if not is_embedded:
imgui.set_next_window_size(imgui.ImVec2(1000, 800), imgui.Cond_.first_use_ever) imgui.set_next_window_size(imgui.ImVec2(1000, 800), imgui.Cond_.first_use_ever)
opened, self.show_preset_manager_window = imgui.begin("Prompt Presets Manager", self.show_preset_manager_window) with imscope.window("Prompt Presets Manager", self.show_preset_manager_window) as (opened, visible):
if not opened: self.show_preset_manager_window = visible
imgui.end(); return if opened:
self._render_preset_manager_content(is_embedded=is_embedded)
else:
self._render_preset_manager_content(is_embedded=is_embedded) self._render_preset_manager_content(is_embedded=is_embedded)
if not is_embedded: imgui.end()
def _render_tool_preset_manager_content(self, is_embedded: bool = False) -> None: def _render_tool_preset_manager_content(self, is_embedded: bool = False) -> None:
avail = imgui.get_content_region_avail() avail = imgui.get_content_region_avail()
@@ -2382,16 +2379,16 @@ class App:
if not is_embedded: if not is_embedded:
if imgui.button("Close##tp", imgui.ImVec2(100, 0)): self.show_tool_preset_manager_window = False if imgui.button("Close##tp", imgui.ImVec2(100, 0)): self.show_tool_preset_manager_window = False
imgui.end_table() imgui.end_table()
def _render_tool_preset_manager_window(self, is_embedded: bool = False) -> None: def _render_tool_preset_manager_window(self, is_embedded: bool = False) -> None:
if not self.show_tool_preset_manager_window and not is_embedded: return if not self.show_tool_preset_manager_window and not is_embedded: return
if not is_embedded: if not is_embedded:
imgui.set_next_window_size(imgui.ImVec2(1000, 800), imgui.Cond_.first_use_ever) imgui.set_next_window_size(imgui.ImVec2(1000, 800), imgui.Cond_.first_use_ever)
opened, self.show_tool_preset_manager_window = imgui.begin("Tool Preset Manager", self.show_tool_preset_manager_window) with imscope.window("Tool Preset Manager", self.show_tool_preset_manager_window) as (opened, visible):
if not opened: self.show_tool_preset_manager_window = visible
imgui.end(); return if opened:
self._render_tool_preset_manager_content(is_embedded=is_embedded) self._render_tool_preset_manager_content(is_embedded=is_embedded)
if not is_embedded: imgui.end() else:
self._render_preset_manager_content(is_embedded=is_embedded)
def _render_persona_editor_window(self, is_embedded: bool = False) -> None: def _render_persona_editor_window(self, is_embedded: bool = False) -> None:
if not self.show_persona_editor_window and not is_embedded: return if not self.show_persona_editor_window and not is_embedded: return
@@ -2557,7 +2554,6 @@ class App:
if imgui.button("Close##pers", imgui.ImVec2(100, 0)): if imgui.button("Close##pers", imgui.ImVec2(100, 0)):
self.show_persona_editor_window = False self.show_persona_editor_window = False
imgui.end_table() imgui.end_table()
if not is_embedded: imgui.end()
def _render_projects_panel(self) -> None: def _render_projects_panel(self) -> None:
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_projects_panel") if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_projects_panel")
@@ -2908,12 +2904,9 @@ class App:
[C: tests/test_log_management_ui.py:test_render_log_management_logic] [C: tests/test_log_management_ui.py:test_render_log_management_logic]
""" """
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_log_management") if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_log_management")
exp, opened = imgui.begin("Log Management", self.show_windows["Log Management"]) with imscope.window("Log Management", self.show_windows["Log Management"]) as (exp, opened):
self.show_windows["Log Management"] = bool(opened) self.show_windows["Log Management"] = bool(opened)
if not exp: if exp:
imgui.end()
return
if self._log_registry is None: if self._log_registry is None:
self._log_registry = log_registry.LogRegistry(str(paths.get_logs_dir() / "log_registry.toml")) self._log_registry = log_registry.LogRegistry(str(paths.get_logs_dir() / "log_registry.toml"))
else: else:
@@ -2983,17 +2976,12 @@ class App:
imgui.end_table() imgui.end_table()
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_log_management") if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_log_management")
imgui.end()
def _render_diagnostics_panel(self) -> None: def _render_diagnostics_panel(self) -> None:
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_diagnostics_panel") if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_diagnostics_panel")
exp, opened = imgui.begin("Diagnostics", self.show_windows.get("Diagnostics", False)) with imscope.window("Diagnostics", self.show_windows.get("Diagnostics", False)) as (exp, opened):
self.show_windows["Diagnostics"] = bool(opened) self.show_windows["Diagnostics"] = bool(opened)
if not exp: if exp:
imgui.end()
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_diagnostics_panel")
return
metrics = self.perf_monitor.get_metrics() metrics = self.perf_monitor.get_metrics()
imgui.text("Performance Telemetry") imgui.text("Performance Telemetry")
imgui.same_line() imgui.same_line()
@@ -3093,7 +3081,6 @@ class App:
imgui.end_table() imgui.end_table()
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_diagnostics_panel") if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_diagnostics_panel")
imgui.end()
def _render_discussion_tab(self) -> None: def _render_discussion_tab(self) -> None:
imgui.begin_child("HistoryChild", size=(0, -self.ui_discussion_split_h)) imgui.begin_child("HistoryChild", size=(0, -self.ui_discussion_split_h))
@@ -3215,7 +3202,8 @@ class App:
grouped_files = aggregate.group_files_by_dir(self.context_files) grouped_files = aggregate.group_files_by_dir(self.context_files)
if imgui.begin_table("ctx_comp_table", 2, imgui.TableFlags_.resizable | imgui.TableFlags_.borders): with imscope.table("ctx_comp_table", 2, imgui.TableFlags_.resizable | imgui.TableFlags_.borders) as active:
if active:
imgui.table_setup_column("File", imgui.TableColumnFlags_.width_stretch) imgui.table_setup_column("File", imgui.TableColumnFlags_.width_stretch)
imgui.table_setup_column("Flags", imgui.TableColumnFlags_.width_fixed, 200) imgui.table_setup_column("Flags", imgui.TableColumnFlags_.width_fixed, 200)
imgui.table_headers_row() imgui.table_headers_row()
@@ -3225,7 +3213,7 @@ class App:
for dir_name, g_files in grouped_files.items(): for dir_name, g_files in grouped_files.items():
imgui.table_next_row() imgui.table_next_row()
imgui.table_set_column_index(0) imgui.table_set_column_index(0)
is_open = imgui.tree_node_ex(f"{dir_name}##dir_{dir_name}", imgui.TreeNodeFlags_.default_open) with imscope.tree_node_ex(f"{dir_name}##dir_{dir_name}", imgui.TreeNodeFlags_.default_open) as is_open:
imgui.table_set_column_index(1) imgui.table_set_column_index(1)
if is_open: if is_open:
for f_item in g_files: for f_item in g_files:
@@ -3324,9 +3312,6 @@ class App:
if hasattr(f_item, "custom_slices") and f_item.custom_slices: if hasattr(f_item, "custom_slices") and f_item.custom_slices:
imgui.same_line() imgui.same_line()
imgui.text_colored(imgui.ImVec4(1.0, 0.5, 0.0, 1.0), "[Slices Active]") imgui.text_colored(imgui.ImVec4(1.0, 0.5, 0.0, 1.0), "[Slices Active]")
imgui.tree_pop()
imgui.end_table()
# Context Composition collasping header # Context Composition collasping header
imgui.separator() imgui.separator()
@@ -4089,6 +4074,7 @@ def hello():
except: except:
pass pass
is_blinking = False is_blinking = False
blink_color = vec4(0, 0, 0, 0)
if self._is_blinking: if self._is_blinking:
elapsed = time.time() - self._blink_start_time elapsed = time.time() - self._blink_start_time
if elapsed > 1.5: if elapsed > 1.5:
@@ -4097,23 +4083,18 @@ def hello():
is_blinking = True is_blinking = True
val = math.sin(elapsed * 8 * math.pi) val = math.sin(elapsed * 8 * math.pi)
alpha = 50/255 if val > 0 else 0 alpha = 50/255 if val > 0 else 0
imgui.push_style_color(imgui.Col_.frame_bg, vec4(0, 255, 0, alpha)) blink_color = vec4(0, 255, 0, alpha)
imgui.push_style_color(imgui.Col_.child_bg, vec4(0, 255, 0, alpha))
# --- Always Render Content ---
imgui.begin_child("response_scroll_area", imgui.ImVec2(0, -40), True) with imscope.style_color(imgui.Col_.frame_bg, blink_color) if is_blinking else nullcontext():
with imscope.style_color(imgui.Col_.child_bg, blink_color) if is_blinking else nullcontext():
with imscope.child("response_scroll_area", imgui.ImVec2(0, -40), True):
is_nerv = theme.is_nerv_active() is_nerv = theme.is_nerv_active()
if is_nerv: imgui.push_style_color(imgui.Col_.text, vec4(80, 255, 80)) with imscope.style_color(imgui.Col_.text, vec4(80, 255, 80)) if is_nerv else nullcontext():
segments, parsed_response = thinking_parser.parse_thinking_trace(self.ai_response) segments, parsed_response = thinking_parser.parse_thinking_trace(self.ai_response)
if segments: if segments:
self._render_thinking_trace([{"content": s.content, "marker": s.marker} for s in segments], 9999) self._render_thinking_trace([{"content": s.content, "marker": s.marker} for s in segments], 9999)
markdown_helper.render(parsed_response, context_id="response") markdown_helper.render(parsed_response, context_id="response")
if is_nerv: imgui.pop_style_color()
imgui.end_child()
imgui.separator() imgui.separator()
if imgui.button("-> History"): if imgui.button("-> History"):
if self.ai_response: if self.ai_response:
@@ -4122,8 +4103,6 @@ def hello():
if segments: if segments:
entry["thinking_segments"] = [{"content": s.content, "marker": s.marker} for s in segments] entry["thinking_segments"] = [{"content": s.content, "marker": s.marker} for s in segments]
self.disc_entries.append(entry) self.disc_entries.append(entry)
if is_blinking:
imgui.pop_style_color(2)
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_response_panel") if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_response_panel")
def _render_external_tools_panel(self) -> None: def _render_external_tools_panel(self) -> None:
@@ -5188,34 +5167,6 @@ def hello():
imgui.end() imgui.end()
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_theme_panel") if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_theme_panel")
def _render_prior_session_view(self) -> None: imgui.push_style_color(imgui.Col_.child_bg, vec4(50, 40, 20))
if imgui.button("Exit Prior Session"): self.controller.cb_exit_prior_session(); self._comms_log_dirty = True
imgui.separator()
with imscope.child("prior_scroll"):
clipper = imgui.ListClipper(); clipper.begin(len(self.prior_disc_entries))
while clipper.step():
for idx in range(clipper.display_start, clipper.display_end):
entry = self.prior_disc_entries[idx];
with imscope.id(f"prior_disc_{idx}"):
collapsed = entry.get("collapsed", False)
if imgui.button("+" if collapsed else "-"): entry["collapsed"] = not collapsed
imgui.same_line(); role, ts = entry.get("role", "??"), entry.get("ts", "")
imgui.text_colored(C_LBL, f"[{role}]")
if ts: imgui.same_line(); imgui.text_colored(vec4(160, 160, 160), str(ts))
content = entry.get("content", "")
if collapsed:
imgui.same_line(); preview = content.replace("\n", " ")[:80]
if len(content) > 80: preview += "..."
imgui.text_colored(vec4(180, 180, 180), preview)
else:
is_nerv = theme.is_nerv_active()
if is_nerv: imgui.push_style_color(imgui.Col_.text, vec4(80, 255, 80))
markdown_helper.render(content, context_id=f'prior_disc_{idx}')
if is_nerv: imgui.pop_style_color()
imgui.separator()
imgui.pop_style_color()
def _render_discussion_selector(self) -> None:
if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return
names = self._get_discussion_names(); grouped = {} names = self._get_discussion_names(); grouped = {}
for name in names: for name in names:
+36
View File
@@ -160,3 +160,39 @@ class _ScopeTabItem:
if self._expanded: if self._expanded:
imgui.end_tab_item() imgui.end_tab_item()
return False return False
def style_color(col: int, val: Any): return _ScopeStyleColor(col, val)
class _ScopeStyleColor:
def __init__(self, col: int, val: Any):
self._col = col
self._val = val
def __enter__(self):
imgui.push_style_color(self._col, self._val)
def __exit__(self, *args):
imgui.pop_style_color()
return False
def style_var(var: int, val: Any): return _ScopeStyleVar(var, val)
class _ScopeStyleVar:
def __init__(self, var: int, val: Any):
self._var = var
self._val = val
def __enter__(self):
imgui.push_style_var(self._var, self._val)
def __exit__(self, *args):
imgui.pop_style_var()
return False
def tree_node_ex(label: str, flags: int = 0): return _ScopeTreeNodeEx(label, flags)
class _ScopeTreeNodeEx:
def __init__(self, label: str, flags: int):
self._label = label
self._flags = flags
self._opened = False
def __enter__(self):
self._opened = imgui.tree_node_ex(self._label, self._flags)
return self._opened
def __exit__(self, *args):
if self._opened:
imgui.tree_pop()
return False