diff --git a/src/app_controller.py b/src/app_controller.py index c3490f4..f10b88c 100644 --- a/src/app_controller.py +++ b/src/app_controller.py @@ -352,9 +352,9 @@ class AppController: 'btn_approve_spawn': lambda: self._handle_mma_respond(approved=True), } self._predefined_callbacks: dict[str, Callable[..., Any]] = { - '_test_callback_func_write_to_file': self._test_callback_func_write_to_file + '_test_callback_func_write_to_file': self._test_callback_func_write_to_file, + '_set_env_var': lambda k, v: os.environ.update({k: v}) } - def _update_gcli_adapter(self, path: str) -> None: sys.stderr.write(f"[DEBUG] _update_gcli_adapter called with: {path}\n") sys.stderr.flush() diff --git a/src/gemini_cli_adapter.py b/src/gemini_cli_adapter.py index 84fab0a..c0818f1 100644 --- a/src/gemini_cli_adapter.py +++ b/src/gemini_cli_adapter.py @@ -79,7 +79,14 @@ class GeminiCliAdapter: # Use communicate to avoid pipe deadlocks with large input/output. # This blocks until the process exits, so we lose real-time streaming, # but it's much more robust. We then simulate streaming by processing the output. - stdout_final, stderr_final = process.communicate(input=prompt_text) + try: + stdout_final, stderr_final = process.communicate(input=prompt_text, timeout=60.0) + except subprocess.TimeoutExpired: + process.kill() + stdout_final, stderr_final = process.communicate() + stderr_final += "\n\n[ERROR] Gemini CLI subprocess timed out after 60 seconds." + # Mock a JSON error result to bubble up + stdout_final += '\n{"type": "result", "status": "error", "error": "subprocess timeout"}\n' for line in stdout_final.splitlines(): line = line.strip() diff --git a/tests/mock_gemini_cli.py b/tests/mock_gemini_cli.py index d6a5e99..8749d04 100644 --- a/tests/mock_gemini_cli.py +++ b/tests/mock_gemini_cli.py @@ -22,6 +22,8 @@ def main() -> None: # Read prompt from stdin try: prompt = sys.stdin.read() + with open("mock_debug_prompt.txt", "a") as f: + f.write(f"--- MOCK INVOKED ---\nARGS: {sys.argv}\nPROMPT:\n{prompt}\n------------------\n") except EOFError: prompt = "" except Exception: diff --git a/tests/test_visual_orchestration.py b/tests/test_visual_orchestration.py index 717f35e..5464860 100644 --- a/tests/test_visual_orchestration.py +++ b/tests/test_visual_orchestration.py @@ -14,6 +14,10 @@ def test_mma_epic_lifecycle(live_gui) -> None: client = api_hook_client.ApiHookClient() assert client.wait_for_server(timeout=15) + # Reset + client.click("btn_reset") + time.sleep(2) + # Set provider and path client.set_value("current_provider", "gemini_cli") time.sleep(2) @@ -21,10 +25,6 @@ def test_mma_epic_lifecycle(live_gui) -> None: client.set_value("gcli_path", f'"{sys.executable}" "{mock_path}"') time.sleep(2) - # Reset - client.click("btn_reset") - time.sleep(2) - # Set epic and click client.set_value("mma_epic_input", "Add timestamps") time.sleep(1)