"""MacosContainerBottleBackend — Apple Container implementation.""" from __future__ import annotations from contextlib import contextmanager from pathlib import Path from typing import Generator, Sequence from ...agent_provider import AgentProvisionPlan from ...egress import EgressPlan from ...env import ResolvedEnv from ...git_gate import GitGatePlan from ...supervise import SupervisePlan from .. import ActiveAgent, BottleBackend, BottleSpec from . import cleanup as _cleanup from . import enumerate as _enumerate from . import launch as _launch from . import resolve_plan as _resolve_plan from . import util as _container from .bottle import MacosContainerBottle from .bottle_cleanup_plan import MacosContainerBottleCleanupPlan from .bottle_plan import MacosContainerBottlePlan class MacosContainerBottleBackend( BottleBackend["MacosContainerBottlePlan", "MacosContainerBottleCleanupPlan"] ): """Experimental Apple Container backend. Selected by `BOT_BOTTLE_BACKEND=macos-container` or `--backend=macos-container`.""" name = "macos-container" @classmethod def is_available(cls) -> bool: return _container.is_available() def _preflight(self) -> None: _resolve_plan.preflight() def _build_guest_env(self, resolved_env: ResolvedEnv) -> dict[str, str]: return _resolve_plan.build_guest_env(resolved_env) def _resolve_plan( self, spec: BottleSpec, *, slug: str, resolved_env: ResolvedEnv, agent_provision_plan: AgentProvisionPlan, egress_plan: EgressPlan, git_gate_plan: GitGatePlan, supervise_plan: SupervisePlan | None, stage_dir: Path, ) -> MacosContainerBottlePlan: return _resolve_plan.resolve_plan( spec, slug=slug, resolved_env=resolved_env, agent_provision_plan=agent_provision_plan, egress_plan=egress_plan, supervise_plan=supervise_plan, git_gate_plan=git_gate_plan, stage_dir=stage_dir, ) @contextmanager def launch( self, plan: MacosContainerBottlePlan ) -> Generator[MacosContainerBottle, None, None]: with _launch.launch(plan, provision=self.provision) as bottle: yield bottle def prepare_cleanup(self) -> MacosContainerBottleCleanupPlan: return _cleanup.prepare_cleanup() def cleanup(self, plan: MacosContainerBottleCleanupPlan) -> None: _cleanup.cleanup(plan) def enumerate_active(self) -> Sequence[ActiveAgent]: return _enumerate.enumerate_active() def supervise_mcp_url(self, plan: MacosContainerBottlePlan) -> str: return plan.agent_supervise_url