from __future__ import annotations from enum import Enum from typing import NoReturn from .generated.v2_all import ( DangerFullAccessSandboxPolicy, ReadOnlySandboxPolicy, SandboxMode, SandboxPolicy, WorkspaceWriteSandboxPolicy, ) class Sandbox(str, Enum): """Preset filesystem access levels for threads and turns. `read_only` allows file reads without writes. `workspace_write` is the normal default for projects with a recorded trust decision and allows writes inside the workspace and configured writable roots. `full_access` removes filesystem access restrictions. """ read_only = "read-only" workspace_write = "workspace-write" full_access = "full-access" def _require_sandbox(sandbox: Sandbox) -> None: if isinstance(sandbox, Sandbox): return options = ", ".join(f"Sandbox.{value.name}" for value in Sandbox) raise ValueError(f"sandbox must be one of: {options}") def _sandbox_mode(sandbox: Sandbox | None) -> SandboxMode | None: """Translate a public preset to the thread lifecycle wire mode.""" if sandbox is None: return None _require_sandbox(sandbox) match sandbox: case Sandbox.read_only: return SandboxMode.read_only case Sandbox.workspace_write: return SandboxMode.workspace_write case Sandbox.full_access: return SandboxMode.danger_full_access case _: return _assert_never_sandbox(sandbox) def _sandbox_policy(sandbox: Sandbox | None) -> SandboxPolicy | None: """Translate a public preset to the turn override wire policy.""" if sandbox is None: return None _require_sandbox(sandbox) match sandbox: case Sandbox.read_only: return SandboxPolicy( root=ReadOnlySandboxPolicy(type="readOnly"), ) case Sandbox.workspace_write: return SandboxPolicy( root=WorkspaceWriteSandboxPolicy(type="workspaceWrite"), ) case Sandbox.full_access: return SandboxPolicy( root=DangerFullAccessSandboxPolicy(type="dangerFullAccess"), ) case _: return _assert_never_sandbox(sandbox) def _assert_never_sandbox(sandbox: NoReturn) -> NoReturn: """Make sandbox mapping exhaustive for static type checkers.""" raise AssertionError(f"Unhandled sandbox: {sandbox!r}")