File size: 2,443 Bytes
5f25733 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 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}")
|