From 3ce4fa0c07d0d9fc03ba19e27c607a469500fe48 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Wed, 25 Feb 2026 14:06:14 -0500 Subject: [PATCH] feat(gui): support Gemini CLI provider and settings persistence --- gui_2.py | 29 ++++++++++++++++++++++++++++- project_manager.py | 1 + 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/gui_2.py b/gui_2.py index 96d7204..4526df1 100644 --- a/gui_2.py +++ b/gui_2.py @@ -29,7 +29,7 @@ from pydantic import BaseModel from imgui_bundle import imgui, hello_imgui, immapp CONFIG_PATH = Path("config.toml") -PROVIDERS = ["gemini", "anthropic"] +PROVIDERS = ["gemini", "anthropic", "gemini_cli"] COMMS_CLAMP_CHARS = 300 def load_config() -> dict: @@ -148,6 +148,7 @@ class App: self.ui_project_git_dir = proj_meta.get("git_dir", "") self.ui_project_main_context = proj_meta.get("main_context", "") self.ui_project_system_prompt = proj_meta.get("system_prompt", "") + self.ui_gemini_cli_path = self.project.get("gemini_cli", {}).get("binary_path", "gemini") self.ui_word_wrap = proj_meta.get("word_wrap", True) self.ui_summary_only = proj_meta.get("summary_only", False) self.ui_auto_add_history = disc_sec.get("auto_add", False) @@ -592,6 +593,7 @@ class App: self.ui_project_git_dir = proj.get("project", {}).get("git_dir", "") self.ui_project_system_prompt = proj.get("project", {}).get("system_prompt", "") self.ui_project_main_context = proj.get("project", {}).get("main_context", "") + self.ui_gemini_cli_path = proj.get("gemini_cli", {}).get("binary_path", "gemini") self.ui_auto_add_history = proj.get("discussion", {}).get("auto_add", False) self.ui_auto_scroll_comms = proj.get("project", {}).get("auto_scroll_comms", True) self.ui_auto_scroll_tool_calls = proj.get("project", {}).get("auto_scroll_tool_calls", True) @@ -1036,6 +1038,8 @@ class App: proj["project"]["auto_scroll_comms"] = self.ui_auto_scroll_comms proj["project"]["auto_scroll_tool_calls"] = self.ui_auto_scroll_tool_calls + proj.setdefault("gemini_cli", {})["binary_path"] = self.ui_gemini_cli_path + proj.setdefault("agent", {}).setdefault("tools", {}) for t_name in AGENT_TOOL_NAMES: proj["agent"]["tools"][t_name] = self.ui_agent_tools.get(t_name, True) @@ -1865,6 +1869,29 @@ class App: ch, self.max_tokens = imgui.input_int("Max Tokens (Output)", self.max_tokens, 1024) ch, self.history_trunc_limit = imgui.input_int("History Truncation Limit", self.history_trunc_limit, 1024) + if self.current_provider == "gemini_cli": + imgui.separator() + imgui.text("Gemini CLI") + sid = "None" + if hasattr(ai_client, "_gemini_cli_adapter") and ai_client._gemini_cli_adapter: + sid = ai_client._gemini_cli_adapter.session_id or "None" + imgui.text(f"Session ID: {sid}") + if imgui.button("Reset CLI Session"): + ai_client.reset_session() + + imgui.text("Binary Path") + ch, self.ui_gemini_cli_path = imgui.input_text("##gcli_path", self.ui_gemini_cli_path) + imgui.same_line() + if imgui.button("Browse##gcli"): + r = hide_tk_root() + p = filedialog.askopenfilename(title="Select gemini CLI binary") + r.destroy() + if p: + self.ui_gemini_cli_path = p + if ch: + if hasattr(ai_client, "_gemini_cli_adapter") and ai_client._gemini_cli_adapter: + ai_client._gemini_cli_adapter.binary_path = self.ui_gemini_cli_path + imgui.separator() imgui.text("Telemetry") usage = self.session_usage diff --git a/project_manager.py b/project_manager.py index 027a865..8966fea 100644 --- a/project_manager.py +++ b/project_manager.py @@ -100,6 +100,7 @@ def default_project(name: str = "unnamed") -> dict: "output": {"output_dir": "./md_gen"}, "files": {"base_dir": ".", "paths": []}, "screenshots": {"base_dir": ".", "paths": []}, + "gemini_cli": {"binary_path": "gemini"}, "agent": { "tools": { "run_powershell": True,