from __future__ import annotations from dataclasses import dataclass from pathlib import Path from typing import Any @dataclass class RunArtifacts: run_id: str root_dir: Path logs_dir: Path shots_dir: Path enhance_dir: Path log_file: Path @dataclass class AgentResult: completed: bool result: str return_message: str data: Any | None steps: int started_at: float ended_at: float usage: "UsageSummary" error: str | None = None cancelled: bool = False @dataclass class UsageSummary: input_tokens: int = 0 cached_input_tokens: int = 0 output_tokens: int = 0 reasoning_tokens: int = 0 total_tokens: int = 0 estimated_cost_usd: float | None = None model_for_pricing: str | None = None def to_dict(self) -> dict[str, Any]: return { "input_tokens": self.input_tokens, "cached_input_tokens": self.cached_input_tokens, "output_tokens": self.output_tokens, "reasoning_tokens": self.reasoning_tokens, "total_tokens": self.total_tokens, "estimated_cost_usd": self.estimated_cost_usd, "model_for_pricing": self.model_for_pricing, } @dataclass class RuntimeOptions: model: str max_steps: int = 60 command_timeout: int = 45 type_interval: float = 0.02 click_pause: float = 0.10 reasoning_effort: str = "medium" screen_context_decay_steps: int = 4 max_visual_context_images: int = 3 native_automation_mode: str = "prefer" dialog_timeout_seconds: float = 12.0 focus_timeout_seconds: float = 8.0 ui_element_timeout_seconds: float = 8.0 max_retries_per_surface: int = 3 pretty_logs: bool = False disable_tools: set[str] | None = None prohibited_key_combos: set[str] | None = None