""" Data models for the Shopify Store Audit & Remediation Environment. Defines the Action and Observation types that agents use to interact with a simulated Shopify store, mirroring real Admin GraphQL API patterns. """ from typing import Any, Dict, List from openenv.core.env_server.types import Action, Observation from pydantic import Field class ShopifyStoreAuditAction(Action): """Agent action that mirrors a Shopify Admin API operation. Commands map to real Shopify GraphQL mutations/queries: - query_products, query_product → products / product query - query_collections, query_collection → collections query - query_inventory → inventoryLevels query - query_orders → orders query - query_store_health → custom diagnostic summary - update_product → productUpdate mutation - update_variant → productVariantUpdate mutation - update_product_seo → productUpdate (seo fields) - update_image_alt_text → productImageUpdate mutation - update_collection → collectionUpdate mutation - add_product_to_collection → collectionAddProducts mutation - remove_product_from_collection → collectionRemoveProducts mutation - adjust_inventory → inventoryAdjustQuantities mutation - update_metafield → metafieldsSet mutation - publish_product → publishablePublish mutation """ command: str = Field( ..., description="API command to execute, e.g. 'query_products', 'update_product'", ) params: Dict[str, Any] = Field( default_factory=dict, description="Command parameters (varies by command)", ) class ShopifyStoreAuditObservation(Observation): """Observation returned after each environment step. Contains both human-readable feedback and structured data so that LLM agents can reason about the store state and decide next actions. """ message: str = Field(default="", description="Human-readable result description") data: Dict[str, Any] = Field( default_factory=dict, description="Structured API response data" ) issues_remaining: int = Field(default=0, description="Unfixed issues count") issues_fixed: int = Field(default=0, description="Issues fixed so far") total_issues: int = Field(default=0, description="Total issues in this task") store_health_score: float = Field( default=0.0, description="Store health 0.0-1.0" ) available_commands: List[str] = Field( default_factory=list, description="Commands the agent can use" ) task_name: str = Field(default="", description="Current task identifier")