"""Create recovery_planner
Generated by Phi-Octopus Eden
2025-11-06 17:50:03.431569
"""

```python
from typing import List, Dict, Any


class RecoveryPlanner:
    """
    A class designed to manage and plan recovery actions in case of errors or malfunctions.
    
    Attributes:
        error_history: A list of dictionaries containing information about past errors.
        current_error: The most recent error encountered by the system. (str)
        recovery_strategies: A dictionary mapping error types to their corresponding recovery strategies. (Dict[str, Any])
        
    Methods:
        log_error(error_info: Dict[str, Any]) -> None:
            Logs an error into the history with a timestamp.
            
        detect_error(error_message: str) -> None:
            Detects errors and updates the current_error attribute.
            
        plan_recovery() -> Dict[str, Any]:
            Plans recovery actions based on the current_error. Returns a strategy or None if no applicable strategy exists.
    """

    def __init__(self):
        self.error_history = []
        self.current_error = ""
        self.recovery_strategies = {
            "ResourceExhaustion": {"action": "scale_down_resources", "timeout": 60},
            "DataCorruption": {"action": "perform_data_backup", "timeout": 120}
        }

    def log_error(self, error_info: Dict[str, Any]) -> None:
        """
        Logs an error into the history with a timestamp.

        :param error_info: A dictionary containing details about the error.
        """
        import datetime
        current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        self.error_history.append({"time": current_time, "error_info": error_info})
        print(f"Error logged at {current_time}: {error_info}")

    def detect_error(self, error_message: str) -> None:
        """
        Detects errors and updates the current_error attribute.

        :param error_message: The message describing the error.
        """
        self.current_error = error_message
        print(f"Detected error: {error_message}")

    def plan_recovery(self) -> Dict[str, Any]:
        """
        Plans recovery actions based on the current_error. Returns a strategy or None if no applicable strategy exists.

        :return: A dictionary with recovery strategy details or None.
        """
        for error_type, strategy in self.recovery_strategies.items():
            if error_message := self.current_error.split(": ")[1] in error_type:
                print(f"Planning recovery for {error_type}")
                return strategy
        print("No applicable recovery strategy found.")
        return None


# Example usage:

if __name__ == "__main__":
    planner = RecoveryPlanner()
    
    # Simulate errors and their handling
    planner.detect_error("ResourceExhaustion: Insufficient server capacity")
    strategy = planner.plan_recovery()
    if strategy:
        print(f"Recovery plan executed with action '{strategy['action']}'")

    planner.detect_error("DataCorruption: Found bad sectors in the database backup")
    strategy = planner.plan_recovery()
    if strategy:
        print(f"Recovery plan executed with action '{strategy['action']}'")
```