from app.core.contracts import UserTask from app.runtime.runtime_controller import RuntimeController def test_runtime_loop_emits_basic_events() -> None: controller = RuntimeController() result = controller.handle_task(UserTask(input="hello runtime")) event_types = [event["type"] for event in result["events"]] assert result["status"] == "completed" assert "message" in result["result"] assert "task_received" in event_types assert "context_built" in event_types assert "task_completed" in event_types def test_runtime_loop_routes_natural_language_shell_request_to_permission_flow() -> None: import os, shutil # Clear permission cache to ensure clean state cache_file = os.path.join(os.path.dirname(__file__), '..', 'data', 'runtime', 'allowed_commands.json') if os.path.exists(cache_file): os.remove(cache_file) controller = RuntimeController() result = controller.handle_task(UserTask(input="запусти sudo apt update")) event_types = [event["type"] for event in result["events"]] # sudo commands require both permission and password # First step: permission request assert result["status"] == "awaiting_permission" assert result["directive"]["type"] == "tool" assert result["directive"]["payload"]["tool"] == "shell_exec" assert "permission_requested" in event_types assert "task_awaiting_permission" in event_types assert result["result"]["error"] == "Permission required before execution." # After granting permission, should request sudo password resumed = controller.resolve_permission(task_id=result["task_id"], decision="allow_once") assert resumed["status"] == "awaiting_input" assert resumed["result"]["secret_request"]["kind"] == "sudo_password"