""" State Schema for LangGraph UI Regression Testing Workflow Updated to be fully serializable for LangGraph persistence. """ from typing import Dict, List, Any, Optional, Annotated, TypedDict import operator # Use TypedDict for all state components to ensure serializability class ViewportDict(TypedDict): name: str width: int height: int class VisualDifferenceDict(TypedDict): category: str severity: str title: str description: str viewport: str location: Optional[Dict[str, int]] class VisualDifference: """Class representing a visual difference between design and implementation.""" def __init__( self, category: str, severity: str, issue_id: str, title: str, description: str, design_value: str, website_value: str, viewport: str, confidence: float = 1.0, detection_method: str = "manual", location: Optional[Dict[str, int]] = None ): self.category = category self.severity = severity self.issue_id = issue_id self.title = title self.description = description self.design_value = design_value self.website_value = website_value self.viewport = viewport self.confidence = confidence self.detection_method = detection_method self.location = location def to_dict(self) -> VisualDifferenceDict: """Convert to dictionary for serialization.""" return { "category": self.category, "severity": self.severity, "title": self.title, "description": self.description, "viewport": self.viewport, "location": self.location } class WorkflowState(TypedDict): # Configuration figma_file_key: str figma_access_token: str website_url: str hf_token: str execution_id: str # Viewports and Categories viewports: List[ViewportDict] test_plan: Dict[str, Any] # Agent Results figma_screenshots: Dict[str, str] website_screenshots: Dict[str, str] visual_differences: Annotated[List[VisualDifferenceDict], operator.add] # Analysis Results hf_analysis: Optional[Dict[str, Any]] similarity_score: float # Status and Metadata status: str error_message: str user_approval: bool def create_initial_state( figma_file_key: str, figma_access_token: str, website_url: str, hf_token: str, execution_id: str ) -> WorkflowState: """Create initial workflow state.""" return { "figma_file_key": figma_file_key, "figma_access_token": figma_access_token, "website_url": website_url, "hf_token": hf_token, "execution_id": execution_id, "viewports": [], "test_plan": {}, "figma_screenshots": {}, "website_screenshots": {}, "visual_differences": [], "hf_analysis": None, "similarity_score": 0.0, "status": "initialized", "error_message": "", "user_approval": False }