from __future__ import annotations from enum import Enum from typing import Any, Dict, List, Optional, Tuple from pydantic import BaseModel, Field class ActionType(str, Enum): CLICK = "click" DOUBLE_CLICK = "double_click" DRAG = "drag" TYPE = "type" SCROLL = "scroll" class GridInitRequest(BaseModel): width: int height: int screenshot_base64: str rows: Optional[int] = None columns: Optional[int] = None memo: Optional[str] = None class GridCellModel(BaseModel): cell_id: str row: int column: int bounds: Tuple[int, int, int, int] label: Optional[str] = None class GridDescriptor(BaseModel): grid_id: str rows: int columns: int cells: List[GridCellModel] metadata: Dict[str, Any] = Field(default_factory=dict) class ActionPayload(BaseModel): grid_id: str action: ActionType target_cell: Optional[str] = None text: Optional[str] = None comment: Optional[str] = None data: Dict[str, Any] = Field(default_factory=dict) class ActionResult(BaseModel): success: bool detail: str coordinates: Optional[Tuple[int, int]] = None payload: Dict[str, Any] = Field(default_factory=dict) class GridPlanRequest(BaseModel): preferred_label: Optional[str] = None action: ActionType = ActionType.CLICK text: Optional[str] = None comment: Optional[str] = None class GridRefreshRequest(BaseModel): screenshot_base64: str memo: Optional[str] = None