from __future__ import annotations
import abc
from dataclasses import dataclass
from enum import Enum
from typing import Mapping
class ApprovalDecision(str, Enum):
"""Decision returned by an approval workflow."""
APPROVED = "approved"
DENIED = "denied"
EXPIRED = "expired"
@dataclass(slots=True, frozen=True)
class ApprovalRequest:
"""Details about a write tool invocation requiring approval."""
id: str
tool_name: str
request_id: str
client_id: str | None
arguments: Mapping[str, str]
class ApprovalManager(abc.ABC):
"""Interface for asynchronous approval backends."""
async def start(self) -> None:
"""Perform any startup/connection work."""
async def stop(self) -> None:
"""Clean up resources."""
@abc.abstractmethod
async def require(self, request: ApprovalRequest) -> ApprovalDecision:
"""Require approval for the provided request."""
class NoOpApprovalManager(ApprovalManager):
"""Approval manager that always approves requests."""
async def require(self, request: ApprovalRequest) -> ApprovalDecision: # noqa: ARG002
return ApprovalDecision.APPROVED
__all__ = [
"ApprovalDecision",
"ApprovalManager",
"ApprovalRequest",
"NoOpApprovalManager",
]