""" State Tools Shared utilities for workflow state management and validation. """ import logging from typing import Any logger = logging.getLogger(__name__) class WorkflowStoppedException(Exception): """Exception raised when a workflow is stopped by the user.""" pass def checkWorkflowStopped(services: Any) -> None: """ Check if workflow has been stopped by user and raise exception if so. Args: services: Services object with workflow and interfaceDbChat for fresh status check Raises: WorkflowStoppedException: If workflow status is "stopped" """ workflow = services.workflow if not workflow: return try: # Get the current workflow status from the database to avoid stale data currentWorkflow = services.interfaceDbChat.getWorkflow(workflow.id) if currentWorkflow and currentWorkflow.status == "stopped": logger.info("Workflow stopped by user, aborting operation") raise WorkflowStoppedException("Workflow was stopped by user") except WorkflowStoppedException: # Re-raise the stop signal immediately raise except Exception as e: # If we can't get the current status due to other database issues, fall back to the in-memory object logger.warning(f"Could not check current workflow status from database: {str(e)}") if workflow and workflow.status == "stopped": logger.info("Workflow stopped by user (from in-memory object), aborting operation") raise WorkflowStoppedException("Workflow was stopped by user")