From 01b3c266533d0b0415b99f5e4c479152d14bb210 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Wed, 4 Mar 2026 12:32:14 -0500 Subject: [PATCH] Botched: Need to do a higher reaosning model to fix this mess. --- .../debrief.md | 50 ++++++++ .../plan.md | 9 +- run_repro.py | 67 +++++++++++ simulation/workflow_sim.py | 7 +- src/app_controller.py | 107 +----------------- src/shell_runner.py | 4 + temp_conftest.py | Bin 0 -> 18660 bytes temp_conftest2.py | Bin 0 -> 18660 bytes temp_gui_old.py | Bin 0 -> 174204 bytes temp_gui_old2.py | Bin 0 -> 174204 bytes tests/conftest.py | 11 +- tests/test_api_hook_extensions.py | 6 +- tests/test_gui2_events.py | 14 +-- tests/test_gui_events.py | 2 +- tests/test_headless_service.py | 9 +- tests/test_layout_reorganization.py | 6 +- tests/test_mma_dashboard_refresh.py | 11 +- tests/test_process_pending_gui_tasks.py | 9 +- 18 files changed, 180 insertions(+), 132 deletions(-) create mode 100644 conductor/tracks/gui_decoupling_controller_20260302/debrief.md create mode 100644 run_repro.py create mode 100644 temp_conftest.py create mode 100644 temp_conftest2.py create mode 100644 temp_gui_old.py create mode 100644 temp_gui_old2.py diff --git a/conductor/tracks/gui_decoupling_controller_20260302/debrief.md b/conductor/tracks/gui_decoupling_controller_20260302/debrief.md new file mode 100644 index 0000000..57be288 --- /dev/null +++ b/conductor/tracks/gui_decoupling_controller_20260302/debrief.md @@ -0,0 +1,50 @@ +# Comprehensive Debrief: GUI Decoupling Track (Botched Implementation) + +## 1. Track Overview +* **Track Name:** GUI Decoupling & Controller Architecture +* **Track ID:** `gui_decoupling_controller_20260302` +* **Primary Objective:** Decouple business logic from `gui_2.py` (3,500+ lines) into a headless `AppController`. + +## 2. Phase-by-Phase Failure Analysis + +### Phase 1: Controller Skeleton & State Migration +* **Status:** [x] Completed (with major issues) +* **What happened:** State variables (locks, paths, flags) were moved to `AppController`. `App` was given a `__getattr__` and `__setattr__` bridge to delegate to the controller. +* **Failure:** The delegation created a "Phantom State" problem. Sub-agents began treating the two objects as interchangeable, but they are not. Shadowing (where `App` has a variable that blocks `Controller`) became a silent bug source. + +### Phase 2: Logic & Background Thread Migration +* **Status:** [x] Completed (with critical regressions) +* **What happened:** Async loops, AI client calls, and project I/O were moved to `AppController`. +* **Failure 1 (Over-deletion):** Tier 3 workers deleted essential UI-thread handlers from `App` (like `_handle_approve_script`). This broke button callbacks and crashed the app on startup. +* **Failure 2 (Thread Violation):** A "fallback queue processor" was added to the Controller thread. This caused two threads to race for the same event queue. If the Controller won, the UI never blinked/updated, causing simulation timeouts. +* **Failure 3 (Property Erasure):** During surgical cleanups in this high-reasoning session, the `current_provider` getter/setter in `AppController` was accidentally deleted while trying to remove a redundant method. `App` now attempts to delegate to a non-existent attribute, causing `AttributeError`. + +### Phase 3: Test Suite Refactoring +* **Status:** [x] Completed (fragile) +* **What happened:** `conftest.py` was updated to patch `AppController` methods. +* **Failure:** The `live_gui` sandbox environment (isolated workspace) was broken because the Controller now eagerly checks for `credentials.toml` on startup. The previous agent tried to "fix" this by copying secrets into the sandbox, which is a security regression and fragile. + +### Phase 4: Final Validation +* **Status:** [ ] FAILED +* **What happened:** Integration tests and extended simulations fail or timeout consistently. +* **Root Cause:** Broken synchronization between the Controller's background processing and the GUI's rendering loop. The "Brain" (Controller) and "Limb" (GUI) are disconnected. + +## 3. Current "Fucked" State of the Codebase +* **`src/gui_2.py`:** Contains rendering but is missing critical property logic. It still shadows core methods that should be purely in the controller. +* **`src/app_controller.py`:** Missing core properties (`current_provider`) and has broken `start_services` logic. +* **`tests/conftest.py`:** Has a messy `live_gui` fixture that uses environment variables (`SLOP_CREDENTIALS`, `SLOP_MCP_ENV`) but points to a sandbox that is missing the actual files. +* **`sloppy.py`:** The entry point works but the underlying classes are in a state of partial migration. + +## 4. Immediate Recovery Plan (New Phase 5) + +### Phase 5: Stabilization & Cleanup +1. **Task 5.1: AST Synchronization Audit.** Manually (via AST) compare `App` and `AppController`. Ensure every property needed for the UI exists in the Controller and is correctly delegated by `App`. +2. **Task 5.2: Restore Controller Properties.** Re-implement `current_provider` and `current_model` in `AppController` with proper logic (initializing adapters, clearing stats). +3. **Task 5.3: Explicit Delegation.** Remove the "magic" `__getattr__` and `__setattr__`. Replace them with explicit property pass-throughs. This will make `AttributeError` visible during static analysis rather than runtime. +4. **Task 5.4: Fix Sandbox Isolation.** Ensure `live_gui` fixture in `conftest.py` correctly handles `credentials.toml` via `SLOP_CREDENTIALS` env var pointing to the root, and ensure `sloppy.py` respects it. +5. **Task 5.5: Event Loop Consolidation.** Ensure there is EXACTLY ONE `asyncio` loop running, owned by the Controller, and that the GUI thread only reads from `_pending_gui_tasks`. + +## 5. Technical Context for Next Session +* **Encoding issues:** `temp_conftest.py` and other git-shipped files often have UTF-16 or different line endings. Use Python-based readers to bypass `read_file` failures. +* **Crucial Lines:** `src/gui_2.py` line 180-210 (Delegation) and `src/app_controller.py` line 460-500 (Event Processing) are the primary areas of failure. +* **Mocking:** All `patch` targets in `tests/` must now be audited to ensure they hit the Controller, not the App. diff --git a/conductor/tracks/gui_decoupling_controller_20260302/plan.md b/conductor/tracks/gui_decoupling_controller_20260302/plan.md index 17dd6fd..9eb0856 100644 --- a/conductor/tracks/gui_decoupling_controller_20260302/plan.md +++ b/conductor/tracks/gui_decoupling_controller_20260302/plan.md @@ -22,4 +22,11 @@ - [ ] WHAT: `uv run pytest` - [ ] HOW: Ensure 100% pass rate. - [ ] SAFETY: Watch out for lingering thread closure issues. -- [ ] Task: Conductor - User Manual Verification 'Phase 4: Final Validation' (Protocol in workflow.md) \ No newline at end of file +- [ ] Task: Conductor - User Manual Verification 'Phase 4: Final Validation' (Protocol in workflow.md) + +## Phase 5: Stabilization & Cleanup (RECOVERY) +- [ ] Task: Task 5.1: AST Synchronization Audit +- [ ] Task: Task 5.2: Restore Controller Properties (Restore `current_provider`) +- [ ] Task: Task 5.3: Replace magic `__getattr__` with Explicit Delegation +- [ ] Task: Task 5.4: Fix Sandbox Isolation logic in `conftest.py` +- [ ] Task: Task 5.5: Event Loop Consolidation & Single-Writer Sync \ No newline at end of file diff --git a/run_repro.py b/run_repro.py new file mode 100644 index 0000000..ca20f0b --- /dev/null +++ b/run_repro.py @@ -0,0 +1,67 @@ +import time +import requests +import sys +import os + +# Ensure src/ is in path +project_root = os.path.dirname(os.path.abspath(__file__)) +src_path = os.path.join(project_root, "src") +sys.path.insert(0, src_path) + +from api_hook_client import ApiHookClient + +def run_repro(): + client = ApiHookClient("http://127.0.0.1:8999") + if not client.wait_for_server(timeout=15): + print("Failed to connect to GUI Hook Server.") + return + + print("[REPRO] Connected to GUI.") + + # 1. Reset and Setup + client.click("btn_reset") + time.sleep(1) + client.set_value("auto_add_history", True) + client.set_value("manual_approve", False) # Auto-approve for simulation + client.set_value("current_provider", "gemini_cli") + + mock_script = os.path.abspath("tests/mock_gemini_cli.py") + client.set_value("gcli_path", f'"{sys.executable}" "{mock_script}"') + + # 2. Trigger Chat + msg = "What is the current date and time? Answer in one sentence." + print(f"[REPRO] Sending message: {msg}") + client.set_value("ai_input", msg) + client.click("btn_gen_send") + + # 3. Wait and Monitor + start_time = time.time() + while time.time() - start_time < 30: + status = client.get_value("ai_status") + print(f"[REPRO] Status: {status}") + + if status == "error": + print("[REPRO] DETECTED ERROR STATUS!") + # Try to get more info if possible + break + + if status == "done": + print("[REPRO] Success! Status is done.") + break + + # Check events + events = client.get_events() + for ev in events: + print(f"[REPRO] Received Event: {ev.get('type')}") + + time.sleep(1) + + # 4. Check Session + session = client.get_session() + entries = session.get('session', {}).get('entries', []) + print(f"[REPRO] History Entries: {len(entries)}") + for i, entry in enumerate(entries): + print(f" {i}: [{entry.get('role')}] {entry.get('content')[:100]}...") + +if __name__ == "__main__": + run_repro() diff --git a/simulation/workflow_sim.py b/simulation/workflow_sim.py index 991edc2..13fd348 100644 --- a/simulation/workflow_sim.py +++ b/simulation/workflow_sim.py @@ -103,9 +103,10 @@ class WorkflowSimulator: print(f"\n[DEBUG] {elapsed:.1f}s - status: '{status}', roles: {roles}") last_debug_time = elapsed - if "error" in status: - print(f"\n[ABORT] GUI reported error status: {status}") - return last_ai_entry if last_ai_entry else {"role": "AI", "content": f"ERROR: {status}"} + if "error" in status: + resp = self.client.get_value("ai_response") + print(f"\n[ABORT] GUI reported error status: {status} | AI Response: {resp}") + return last_ai_entry if last_ai_entry else {"role": "AI", "content": f"ERROR: {status}"} # Turn completion logic: # 1. Transition: we were busy and now we are not, and the last role is AI. diff --git a/src/app_controller.py b/src/app_controller.py index 44387eb..faed00d 100644 --- a/src/app_controller.py +++ b/src/app_controller.py @@ -469,18 +469,7 @@ class AppController: asyncio.set_event_loop(self._loop) self._loop.create_task(self._process_event_queue()) - # Fallback: process queues even if GUI thread is idling/stuck - async def queue_fallback() -> None: - while True: - try: - # Headless/fallback queue processing - # Note: In GUI mode, App._gui_func still calls these for low latency. - self._process_pending_gui_tasks() - # _process_pending_history_adds might need more care regarding project state - except: pass - await asyncio.sleep(0.1) - - self._loop.create_task(queue_fallback()) + pass # Loop runs the process_event_queue task self._loop.run_forever() async def _process_event_queue(self) -> None: @@ -671,100 +660,6 @@ class AppController: return True return False - def _process_pending_gui_tasks(self) -> None: - if not self._pending_gui_tasks: - return - with self._pending_gui_tasks_lock: - tasks = self._pending_gui_tasks[:] - self._pending_gui_tasks.clear() - for task in tasks: - try: - action = task.get("action") - if action == "refresh_api_metrics": - self._refresh_api_metrics(task.get("payload", {})) - elif action == "handle_ai_response": - payload = task.get("payload", {}) - text = payload.get("text", "") - stream_id = payload.get("stream_id") - is_streaming = payload.get("status") == "streaming..." - if stream_id: - if is_streaming: - if stream_id not in self.mma_streams: self.mma_streams[stream_id] = "" - self.mma_streams[stream_id] += text - else: - self.mma_streams[stream_id] = text - if stream_id == "Tier 1": - if "status" in payload: - self.ai_status = payload["status"] - else: - if is_streaming: - self.ai_response += text - else: - self.ai_response = text - self.ai_status = payload.get("status", "done") - self._trigger_blink = True - if not stream_id: - self._token_stats_dirty = True - elif action == "mma_stream_append": - payload = task.get("payload", {}) - stream_id = payload.get("stream_id") - text = payload.get("text", "") - if stream_id: - if stream_id not in self.mma_streams: - self.mma_streams[stream_id] = "" - self.mma_streams[stream_id] += text - elif action == "mma_state_update": - payload = task.get("payload", {}) - self.mma_status = payload.get("status", "idle") - self.active_tier = payload.get("active_tier") - self.mma_tier_usage = payload.get("tier_usage", self.mma_tier_usage) - self.active_tickets = payload.get("tickets", []) - elif action == "mma_step_approval": - dlg = MMAApprovalDialog(str(task.get("ticket_id") or ""), str(task.get("payload") or "")) - self._pending_mma_approval = task - if "dialog_container" in task: - task["dialog_container"][0] = dlg - elif action == "mma_spawn_approval": - spawn_dlg = MMASpawnApprovalDialog( - str(task.get("ticket_id") or ""), - str(task.get("role") or ""), - str(task.get("prompt") or ""), - str(task.get("context_md") or "") - ) - self._pending_mma_spawn = task - if "dialog_container" in task: - task["dialog_container"][0] = spawn_dlg - except Exception as e: - print(f"Error executing GUI task: {e}") - - def stop_services(self): - """Stops background threads and async event loop.""" - if self._loop: - self._loop.call_soon_threadsafe(self._loop.stop) - if self._loop_thread: - self._loop_thread.join(timeout=2.0) - - @property - def current_provider(self) -> str: - return self._current_provider - - @current_provider.setter - def current_provider(self, value: str) -> None: - if value != self._current_provider: - self._current_provider = value - ai_client.reset_session() - ai_client.set_provider(value, self.current_model) - if value == "gemini_cli": - if not ai_client._gemini_cli_adapter: - ai_client._gemini_cli_adapter = ai_client.GeminiCliAdapter(binary_path=self.ui_gemini_cli_path) - else: - ai_client._gemini_cli_adapter.binary_path = self.ui_gemini_cli_path - if hasattr(self, 'hook_server'): - self.hook_server.start() - self.available_models = [] - self._fetch_models(value) - self._token_stats = {} - self._token_stats_dirty = True @property def current_model(self) -> str: diff --git a/src/shell_runner.py b/src/shell_runner.py index 8a8d2cc..cf2f4b5 100644 --- a/src/shell_runner.py +++ b/src/shell_runner.py @@ -15,6 +15,10 @@ _ENV_CONFIG: dict = {} def _load_env_config() -> dict: """Load mcp_env.toml from project root (sibling of this file or parent dir).""" + env_path = os.environ.get("SLOP_MCP_ENV") + if env_path and Path(env_path).exists(): + with open(env_path, "rb") as f: + return tomllib.load(f) candidates = [ Path(__file__).parent / "mcp_env.toml", Path(__file__).parent.parent / "mcp_env.toml", diff --git a/temp_conftest.py b/temp_conftest.py new file mode 100644 index 0000000000000000000000000000000000000000..7138a3d4938dc9d21400d642c85928c646da6aec GIT binary patch literal 18660 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 V$0`MHr{x&3$Ig7r&dtSq`47`D)o}m- literal 0 HcmV?d00001 diff --git a/temp_conftest2.py b/temp_conftest2.py new file mode 100644 index 0000000000000000000000000000000000000000..7138a3d4938dc9d21400d642c85928c646da6aec GIT binary patch literal 18660 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 V$0`MHr{x&3$Ig7r&dtSq`47`D)o}m- literal 0 HcmV?d00001 diff --git a/temp_gui_old.py b/temp_gui_old.py new file mode 100644 index 0000000000000000000000000000000000000000..4b27e6949ef3f6af6f45518facf92d487784b9ea GIT binary patch literal 174204 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 literal 0 HcmV?d00001 diff --git a/temp_gui_old2.py b/temp_gui_old2.py new file mode 100644 index 0000000000000000000000000000000000000000..4b27e6949ef3f6af6f45518facf92d487784b9ea GIT binary patch literal 174204 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 literal 0 HcmV?d00001 diff --git a/tests/conftest.py b/tests/conftest.py index 1844f74..1ff12b7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -189,6 +189,11 @@ def live_gui() -> Generator[tuple[subprocess.Popen, str], None, None]: (temp_workspace / "manual_slop.toml").write_text("[project]\nname = 'TestProject'\n", encoding="utf-8") (temp_workspace / "conductor" / "tracks").mkdir(parents=True, exist_ok=True) + # Resolve absolute paths for shared resources + project_root = Path(os.getcwd()) + cred_file = project_root / "credentials.toml" + mcp_file = project_root / "mcp_env.toml" + # Preserve GUI layout for tests layout_file = Path("manualslop_layout.ini") if layout_file.exists(): @@ -209,7 +214,11 @@ def live_gui() -> Generator[tuple[subprocess.Popen, str], None, None]: # Use environment variable to point to temp config if App supports it, # or just run from that CWD. env = os.environ.copy() - env["PYTHONPATH"] = os.getcwd() + env["PYTHONPATH"] = str(project_root.absolute()) + if cred_file.exists(): + env["SLOP_CREDENTIALS"] = str(cred_file.absolute()) + if mcp_file.exists(): + env["SLOP_MCP_ENV"] = str(mcp_file.absolute()) process = subprocess.Popen( ["uv", "run", "python", "-u", gui_script, "--enable-test-hooks"], diff --git a/tests/test_api_hook_extensions.py b/tests/test_api_hook_extensions.py index a8efbd6..4f2c9ba 100644 --- a/tests/test_api_hook_extensions.py +++ b/tests/test_api_hook_extensions.py @@ -34,11 +34,11 @@ def test_get_indicator_state_integration(live_gui: Any) -> None: def test_app_processes_new_actions() -> None: import gui_2 - with patch('gui_2.load_config', return_value={}), \ + with patch('src.models.load_config', return_value={}), \ patch('gui_2.PerformanceMonitor'), \ patch('gui_2.session_logger'), \ - patch.object(gui_2.App, '_prune_old_logs'), \ - patch.object(gui_2.App, '_load_active_project'): + patch('src.app_controller.AppController._prune_old_logs'), \ + patch('src.app_controller.AppController._load_active_project'): app = gui_2.App() # Test set_value via _pending_gui_tasks # First we need to register a settable field for testing if not present diff --git a/tests/test_gui2_events.py b/tests/test_gui2_events.py index 94cd625..9d5ce60 100644 --- a/tests/test_gui2_events.py +++ b/tests/test_gui2_events.py @@ -8,19 +8,19 @@ from events import EventEmitter @pytest.fixture def app_instance() -> Generator[type[App], None, None]: """ - Fixture to create an instance of the gui_2.App class for testing. - It mocks functions that would render a window or block execution. - """ + Fixture to create an instance of the gui_2.App class for testing. + It mocks functions that would render a window or block execution. + """ if not hasattr(ai_client, 'events') or ai_client.events is None: ai_client.events = EventEmitter() with ( - patch('gui_2.load_config', return_value={'ai': {}, 'projects': {}}), + patch('src.models.load_config', return_value={'ai': {}, 'projects': {}}), patch('gui_2.save_config'), patch('gui_2.project_manager'), patch('gui_2.session_logger'), patch('gui_2.immapp.run'), - patch.object(App, '_load_active_project'), - patch.object(App, '_fetch_models'), + patch('src.app_controller.AppController._load_active_project'), + patch('src.app_controller.AppController._fetch_models'), patch.object(App, '_load_fonts'), patch.object(App, '_post_init') ): @@ -43,4 +43,4 @@ def test_app_subscribes_to_events(app_instance: type[App]) -> None: for call in calls: handler = call.args[1] assert hasattr(handler, '__self__') - assert handler.__self__ is app + assert handler.__self__ is app.controller diff --git a/tests/test_gui_events.py b/tests/test_gui_events.py index e6a870b..12c31f0 100644 --- a/tests/test_gui_events.py +++ b/tests/test_gui_events.py @@ -9,7 +9,7 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "s def test_gui_updates_on_event(app_instance: App) -> None: app_instance.last_md = "mock_md" - with patch.object(app_instance, '_refresh_api_metrics') as mock_refresh: + with patch.object(app_instance.controller, '_refresh_api_metrics') as mock_refresh: # Simulate event (bypassing events.emit since _init_ai_and_hooks is mocked) app_instance._on_api_event(payload={"text": "test"}) # Process tasks manually diff --git a/tests/test_headless_service.py b/tests/test_headless_service.py index 34de6c2..b92bb2d 100644 --- a/tests/test_headless_service.py +++ b/tests/test_headless_service.py @@ -9,10 +9,15 @@ from fastapi.testclient import TestClient class TestHeadlessAPI(unittest.TestCase): def setUp(self) -> None: - with patch('gui_2.session_logger.open_session'), \ + with patch('src.models.load_config', return_value={'ai': {'provider': 'gemini', 'model': 'gemini-2.5-flash-lite'}, 'projects': {}, 'gui': {'show_windows': {}}}), \ + patch('gui_2.session_logger.open_session'), \ patch('gui_2.ai_client.set_provider'), \ patch('gui_2.PerformanceMonitor'), \ - patch('gui_2.session_logger.close_session'): + patch('gui_2.session_logger.close_session'), \ + patch('src.app_controller.AppController._init_ai_and_hooks'), \ + patch('src.app_controller.AppController._fetch_models'), \ + patch('src.app_controller.AppController._prune_old_logs'), \ + patch('src.app_controller.AppController.start_services'): self.app_instance = gui_2.App() # Set a default API key for tests self.test_api_key = "test-secret-key" diff --git a/tests/test_layout_reorganization.py b/tests/test_layout_reorganization.py index 499b9ca..26e7165 100644 --- a/tests/test_layout_reorganization.py +++ b/tests/test_layout_reorganization.py @@ -41,7 +41,11 @@ def test_old_windows_removed_from_gui2(app_instance_simple: Any) -> None: def app_instance_simple() -> Any: from unittest.mock import patch from gui_2 import App - with patch('gui_2.load_config', return_value={}): + with patch('src.models.load_config', return_value={'ai': {}, 'projects': {}, 'gui': {'show_windows': {}}}), \ + patch('src.app_controller.AppController._init_ai_and_hooks'), \ + patch('src.app_controller.AppController._fetch_models'), \ + patch('src.app_controller.AppController._prune_old_logs'), \ + patch('src.app_controller.AppController.start_services'): app = App() return app diff --git a/tests/test_mma_dashboard_refresh.py b/tests/test_mma_dashboard_refresh.py index d7c4bdd..ce2eb11 100644 --- a/tests/test_mma_dashboard_refresh.py +++ b/tests/test_mma_dashboard_refresh.py @@ -7,15 +7,18 @@ from gui_2 import App def app_instance() -> Any: # We patch the dependencies of App.__init__ to avoid side effects with ( - patch('gui_2.load_config', return_value={'ai': {}, 'projects': {}}), + patch('src.models.load_config', return_value={'ai': {}, 'projects': {}}), patch('gui_2.save_config'), patch('gui_2.project_manager') as mock_pm, patch('gui_2.session_logger'), patch('gui_2.immapp.run'), - patch.object(App, '_load_active_project'), - patch.object(App, '_fetch_models'), + patch('src.app_controller.AppController._load_active_project'), + patch('src.app_controller.AppController._fetch_models'), patch.object(App, '_load_fonts'), - patch.object(App, '_post_init') + patch.object(App, '_post_init'), + patch('src.app_controller.AppController._prune_old_logs'), + patch('src.app_controller.AppController.start_services'), + patch('src.app_controller.AppController._init_ai_and_hooks') ): app = App() # Ensure project and ui_files_base_dir are set for _refresh_from_project diff --git a/tests/test_process_pending_gui_tasks.py b/tests/test_process_pending_gui_tasks.py index 14bacc4..eee4253 100644 --- a/tests/test_process_pending_gui_tasks.py +++ b/tests/test_process_pending_gui_tasks.py @@ -7,15 +7,18 @@ from gui_2 import App @pytest.fixture def app_instance() -> Generator[App, None, None]: with ( - patch('gui_2.load_config', return_value={'ai': {'provider': 'gemini', 'model': 'gemini-2.5-flash-lite'}, 'projects': {}}), + patch('src.models.load_config', return_value={'ai': {'provider': 'gemini', 'model': 'gemini-2.5-flash-lite'}, 'projects': {}}), patch('gui_2.save_config'), patch('gui_2.project_manager'), patch('gui_2.session_logger'), patch('gui_2.immapp.run'), - patch.object(App, '_load_active_project'), - patch.object(App, '_fetch_models'), + patch('src.app_controller.AppController._load_active_project'), + patch('src.app_controller.AppController._fetch_models'), patch.object(App, '_load_fonts'), patch.object(App, '_post_init'), + patch('src.app_controller.AppController._prune_old_logs'), + patch('src.app_controller.AppController.start_services'), + patch('src.app_controller.AppController._init_ai_and_hooks'), patch('ai_client.set_provider'), patch('ai_client.reset_session') ):