Files
python-sdk/docs/reference.md
pptx704 be573d07a3 v0.1.1 (#7)
Co-authored-by: Tasnim Kabir Sadik <tksadik92@gmail.com>
Reviewed-on: #7
Co-authored-by: pptx704 <rafeed@omukk.dev>
Co-committed-by: pptx704 <rafeed@omukk.dev>
2026-05-01 23:06:54 +00:00

4275 lines
86 KiB
Markdown

<a id="wrenn"></a>
# wrenn
<a id="wrenn.client"></a>
# wrenn.client
<a id="wrenn.client.CapsulesResource"></a>
## CapsulesResource Objects
```python
class CapsulesResource()
```
Sync capsule control-plane operations.
<a id="wrenn.client.CapsulesResource.create"></a>
#### create
```python
def create(template: str | None = None,
vcpus: int | None = None,
memory_mb: int | None = None,
timeout_sec: int | None = None) -> CapsuleModel
```
Create a new capsule.
**Arguments**:
- `template` _str | None_ - Template name to boot from.
- `vcpus` _int | None_ - Number of virtual CPUs.
- `memory_mb` _int | None_ - Memory in MiB.
- `timeout_sec` _int | None_ - Inactivity TTL in seconds before
auto-pause. ``0`` disables auto-pause.
**Returns**:
- `CapsuleModel` - The newly created capsule.
<a id="wrenn.client.CapsulesResource.list"></a>
#### list
```python
def list() -> list[CapsuleModel]
```
List all capsules for the authenticated team.
**Returns**:
- `list[CapsuleModel]` - All capsules belonging to the team.
<a id="wrenn.client.CapsulesResource.get"></a>
#### get
```python
def get(id: str) -> CapsuleModel
```
Get a capsule by ID.
**Arguments**:
- `id` _str_ - Capsule ID.
**Returns**:
- `CapsuleModel` - Current state of the capsule.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.CapsulesResource.destroy"></a>
#### destroy
```python
def destroy(id: str) -> None
```
Destroy a capsule permanently.
**Arguments**:
- `id` _str_ - Capsule ID.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.CapsulesResource.pause"></a>
#### pause
```python
def pause(id: str) -> CapsuleModel
```
Pause a running capsule.
**Arguments**:
- `id` _str_ - Capsule ID.
**Returns**:
- `CapsuleModel` - Updated capsule state.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.CapsulesResource.resume"></a>
#### resume
```python
def resume(id: str) -> CapsuleModel
```
Resume a paused capsule.
**Arguments**:
- `id` _str_ - Capsule ID.
**Returns**:
- `CapsuleModel` - Updated capsule state.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.CapsulesResource.ping"></a>
#### ping
```python
def ping(id: str) -> None
```
Reset the inactivity timer for a capsule.
**Arguments**:
- `id` _str_ - Capsule ID.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.AsyncCapsulesResource"></a>
## AsyncCapsulesResource Objects
```python
class AsyncCapsulesResource()
```
Async capsule control-plane operations.
<a id="wrenn.client.AsyncCapsulesResource.create"></a>
#### create
```python
async def create(template: str | None = None,
vcpus: int | None = None,
memory_mb: int | None = None,
timeout_sec: int | None = None) -> CapsuleModel
```
Create a new capsule.
**Arguments**:
- `template` _str | None_ - Template name to boot from.
- `vcpus` _int | None_ - Number of virtual CPUs.
- `memory_mb` _int | None_ - Memory in MiB.
- `timeout_sec` _int | None_ - Inactivity TTL in seconds before
auto-pause. ``0`` disables auto-pause.
**Returns**:
- `CapsuleModel` - The newly created capsule.
<a id="wrenn.client.AsyncCapsulesResource.list"></a>
#### list
```python
async def list() -> list[CapsuleModel]
```
List all capsules for the authenticated team.
**Returns**:
- `list[CapsuleModel]` - All capsules belonging to the team.
<a id="wrenn.client.AsyncCapsulesResource.get"></a>
#### get
```python
async def get(id: str) -> CapsuleModel
```
Get a capsule by ID.
**Arguments**:
- `id` _str_ - Capsule ID.
**Returns**:
- `CapsuleModel` - Current state of the capsule.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.AsyncCapsulesResource.destroy"></a>
#### destroy
```python
async def destroy(id: str) -> None
```
Destroy a capsule permanently.
**Arguments**:
- `id` _str_ - Capsule ID.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.AsyncCapsulesResource.pause"></a>
#### pause
```python
async def pause(id: str) -> CapsuleModel
```
Pause a running capsule.
**Arguments**:
- `id` _str_ - Capsule ID.
**Returns**:
- `CapsuleModel` - Updated capsule state.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.AsyncCapsulesResource.resume"></a>
#### resume
```python
async def resume(id: str) -> CapsuleModel
```
Resume a paused capsule.
**Arguments**:
- `id` _str_ - Capsule ID.
**Returns**:
- `CapsuleModel` - Updated capsule state.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.AsyncCapsulesResource.ping"></a>
#### ping
```python
async def ping(id: str) -> None
```
Reset the inactivity timer for a capsule.
**Arguments**:
- `id` _str_ - Capsule ID.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.client.SnapshotsResource"></a>
## SnapshotsResource Objects
```python
class SnapshotsResource()
```
Sync snapshot operations.
<a id="wrenn.client.SnapshotsResource.create"></a>
#### create
```python
def create(capsule_id: str,
name: str | None = None,
overwrite: bool = False) -> Template
```
Create a snapshot template from a running capsule.
**Arguments**:
- `capsule_id` _str_ - ID of the capsule to snapshot.
- `name` _str | None_ - Name for the snapshot template. Auto-generated
if not provided.
- `overwrite` _bool_ - If ``True``, overwrite an existing template with
the same name. Defaults to ``False``.
**Returns**:
- `Template` - The created snapshot template.
<a id="wrenn.client.SnapshotsResource.list"></a>
#### list
```python
def list(type: str | None = None) -> list[Template]
```
List snapshot templates.
**Arguments**:
- `type` _str | None_ - Filter by template type. Returns all templates
if not provided.
**Returns**:
- `list[Template]` - Matching snapshot templates.
<a id="wrenn.client.SnapshotsResource.delete"></a>
#### delete
```python
def delete(name: str) -> None
```
Delete a snapshot template by name.
**Arguments**:
- `name` _str_ - Template name to delete.
**Raises**:
- `WrennNotFoundError` - If no template with the given name exists.
<a id="wrenn.client.AsyncSnapshotsResource"></a>
## AsyncSnapshotsResource Objects
```python
class AsyncSnapshotsResource()
```
Async snapshot operations.
<a id="wrenn.client.AsyncSnapshotsResource.create"></a>
#### create
```python
async def create(capsule_id: str,
name: str | None = None,
overwrite: bool = False) -> Template
```
Create a snapshot template from a running capsule.
**Arguments**:
- `capsule_id` _str_ - ID of the capsule to snapshot.
- `name` _str | None_ - Name for the snapshot template. Auto-generated
if not provided.
- `overwrite` _bool_ - If ``True``, overwrite an existing template with
the same name. Defaults to ``False``.
**Returns**:
- `Template` - The created snapshot template.
<a id="wrenn.client.AsyncSnapshotsResource.list"></a>
#### list
```python
async def list(type: str | None = None) -> list[Template]
```
List snapshot templates.
**Arguments**:
- `type` _str | None_ - Filter by template type. Returns all templates
if not provided.
**Returns**:
- `list[Template]` - Matching snapshot templates.
<a id="wrenn.client.AsyncSnapshotsResource.delete"></a>
#### delete
```python
async def delete(name: str) -> None
```
Delete a snapshot template by name.
**Arguments**:
- `name` _str_ - Template name to delete.
**Raises**:
- `WrennNotFoundError` - If no template with the given name exists.
<a id="wrenn.client.WrennClient"></a>
## WrennClient Objects
```python
class WrennClient()
```
Synchronous client for the Wrenn API.
Authenticates with an API key.
**Arguments**:
- `api_key` - API key (``wrn_...``). Falls back to ``WRENN_API_KEY`` env var.
- `base_url` - Wrenn API base URL.
<a id="wrenn.client.WrennClient.http"></a>
#### http
```python
@property
def http() -> httpx.Client
```
The underlying httpx.Client (for sub-objects that need direct access).
<a id="wrenn.client.WrennClient.close"></a>
#### close
```python
def close() -> None
```
Close the underlying HTTP connection pool.
<a id="wrenn.client.AsyncWrennClient"></a>
## AsyncWrennClient Objects
```python
class AsyncWrennClient()
```
Asynchronous client for the Wrenn API.
Authenticates with an API key.
**Arguments**:
- `api_key` - API key (``wrn_...``). Falls back to ``WRENN_API_KEY`` env var.
- `base_url` - Wrenn API base URL. Falls back to ``WRENN_BASE_URL`` env var.
<a id="wrenn.client.AsyncWrennClient.http"></a>
#### http
```python
@property
def http() -> httpx.AsyncClient
```
The underlying httpx.AsyncClient.
<a id="wrenn.client.AsyncWrennClient.aclose"></a>
#### aclose
```python
async def aclose() -> None
```
Close the underlying async HTTP connection pool.
<a id="wrenn.sandbox"></a>
# wrenn.sandbox
<a id="wrenn.commands"></a>
# wrenn.commands
<a id="wrenn.commands.CommandResult"></a>
## CommandResult Objects
```python
@dataclass
class CommandResult()
```
Result from a foreground command execution.
<a id="wrenn.commands.CommandHandle"></a>
## CommandHandle Objects
```python
@dataclass
class CommandHandle()
```
Handle for a background process.
<a id="wrenn.commands.ProcessInfo"></a>
## ProcessInfo Objects
```python
@dataclass
class ProcessInfo()
```
Information about a running process.
<a id="wrenn.commands.StreamEvent"></a>
## StreamEvent Objects
```python
class StreamEvent()
```
Base class for streaming exec events.
<a id="wrenn.commands.Commands"></a>
## Commands Objects
```python
class Commands()
```
Sync command execution interface. Accessed via ``capsule.commands``.
<a id="wrenn.commands.Commands.run"></a>
#### run
```python
def run(cmd: str,
*,
background: bool = False,
timeout: int | None = 30,
envs: dict[str, str] | None = None,
cwd: str | None = None,
tag: str | None = None) -> CommandResult | CommandHandle
```
Execute a shell command inside the capsule.
**Arguments**:
- `cmd` _str_ - Shell command string to execute.
- `background` _bool_ - If ``True``, launch the process in the
background and return a :class:`CommandHandle` immediately.
Defaults to ``False``.
- `timeout` _int | None_ - Seconds before the foreground command times
out. Ignored for background commands. Defaults to ``30``.
- `envs` _dict[str, str] | None_ - Additional environment variables
to set for the process.
- `cwd` _str | None_ - Working directory for the process.
- `tag` _str | None_ - Optional label attached to background processes
for later retrieval via :meth:`connect`.
**Returns**:
- `CommandResult` - stdout, stderr, exit code, and duration for
foreground commands (``background=False``).
- `CommandHandle` - PID and tag for background commands
(``background=True``).
<a id="wrenn.commands.Commands.list"></a>
#### list
```python
def list() -> list[ProcessInfo]
```
List all running background processes in the capsule.
**Returns**:
- `list[ProcessInfo]` - Running processes with their PID, tag, and
command information.
<a id="wrenn.commands.Commands.kill"></a>
#### kill
```python
def kill(pid: int) -> None
```
Send SIGKILL to a background process.
**Arguments**:
- `pid` _int_ - PID of the process to kill.
**Raises**:
- `WrennNotFoundError` - If no process with the given PID exists.
<a id="wrenn.commands.Commands.connect"></a>
#### connect
```python
def connect(pid: int) -> Iterator[StreamEvent]
```
Connect to a running background process and stream its output.
**Arguments**:
- `pid` _int_ - PID of the background process to attach to.
**Yields**:
- `StreamEvent` - Successive output events. Stops on
:class:`StreamExitEvent` or :class:`StreamErrorEvent`.
<a id="wrenn.commands.Commands.stream"></a>
#### stream
```python
def stream(cmd: str, args: list[str] | None = None) -> Iterator[StreamEvent]
```
Execute a command via WebSocket, streaming output as events.
**Arguments**:
- `cmd` _str_ - Command to execute.
- `args` _list[str] | None_ - Additional arguments for the command.
When omitted, *cmd* is interpreted as a shell command
string and executed via ``/bin/sh -c``.
**Yields**:
- `StreamEvent` - Successive events including :class:`StreamStartEvent`,
:class:`StreamStdoutEvent`, :class:`StreamStderrEvent`,
:class:`StreamExitEvent`, and :class:`StreamErrorEvent`.
<a id="wrenn.commands.AsyncCommands"></a>
## AsyncCommands Objects
```python
class AsyncCommands()
```
Async command execution interface. Accessed via ``capsule.commands``.
<a id="wrenn.commands.AsyncCommands.run"></a>
#### run
```python
async def run(cmd: str,
*,
background: bool = False,
timeout: int | None = 30,
envs: dict[str, str] | None = None,
cwd: str | None = None,
tag: str | None = None) -> CommandResult | CommandHandle
```
Execute a shell command inside the capsule.
**Arguments**:
- `cmd` _str_ - Shell command string to execute.
- `background` _bool_ - If ``True``, launch the process in the
background and return a :class:`CommandHandle` immediately.
Defaults to ``False``.
- `timeout` _int | None_ - Seconds before the foreground command times
out. Ignored for background commands. Defaults to ``30``.
- `envs` _dict[str, str] | None_ - Additional environment variables
to set for the process.
- `cwd` _str | None_ - Working directory for the process.
- `tag` _str | None_ - Optional label attached to background processes
for later retrieval via :meth:`connect`.
**Returns**:
- `CommandResult` - stdout, stderr, exit code, and duration for
foreground commands (``background=False``).
- `CommandHandle` - PID and tag for background commands
(``background=True``).
<a id="wrenn.commands.AsyncCommands.list"></a>
#### list
```python
async def list() -> list[ProcessInfo]
```
List all running background processes in the capsule.
**Returns**:
- `list[ProcessInfo]` - Running processes with their PID, tag, and
command information.
<a id="wrenn.commands.AsyncCommands.kill"></a>
#### kill
```python
async def kill(pid: int) -> None
```
Send SIGKILL to a background process.
**Arguments**:
- `pid` _int_ - PID of the process to kill.
**Raises**:
- `WrennNotFoundError` - If no process with the given PID exists.
<a id="wrenn.commands.AsyncCommands.connect"></a>
#### connect
```python
async def connect(pid: int) -> AsyncIterator[StreamEvent]
```
Connect to a running background process and stream its output.
**Arguments**:
- `pid` _int_ - PID of the background process to attach to.
**Yields**:
- `StreamEvent` - Successive output events. Stops on
:class:`StreamExitEvent` or :class:`StreamErrorEvent`.
<a id="wrenn.commands.AsyncCommands.stream"></a>
#### stream
```python
async def stream(cmd: str,
args: list[str] | None = None) -> AsyncIterator[StreamEvent]
```
Execute a command via WebSocket, streaming output as events.
**Arguments**:
- `cmd` _str_ - Command to execute.
- `args` _list[str] | None_ - Additional arguments for the command.
When omitted, *cmd* is interpreted as a shell command
string and executed via ``/bin/sh -c``.
**Yields**:
- `StreamEvent` - Successive events including :class:`StreamStartEvent`,
:class:`StreamStdoutEvent`, :class:`StreamStderrEvent`,
:class:`StreamExitEvent`, and :class:`StreamErrorEvent`.
<a id="wrenn.files"></a>
# wrenn.files
<a id="wrenn.files.Files"></a>
## Files Objects
```python
class Files()
```
Sync filesystem interface. Accessed via ``capsule.files``.
<a id="wrenn.files.Files.read"></a>
#### read
```python
def read(path: str) -> str
```
Read a file as a UTF-8 string.
**Arguments**:
- `path` _str_ - Absolute path to the file inside the capsule.
**Returns**:
- `str` - File contents decoded as UTF-8.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.Files.read_bytes"></a>
#### read\_bytes
```python
def read_bytes(path: str) -> bytes
```
Read a file as raw bytes.
**Arguments**:
- `path` _str_ - Absolute path to the file inside the capsule.
**Returns**:
- `bytes` - Raw file contents.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.Files.write"></a>
#### write
```python
def write(path: str, data: str | bytes) -> None
```
Write data to a file inside the capsule.
Creates parent directories if they do not exist.
**Arguments**:
- `path` _str_ - Absolute destination path inside the capsule.
- `data` _str | bytes_ - Content to write. Strings are UTF-8 encoded.
<a id="wrenn.files.Files.list"></a>
#### list
```python
def list(path: str, depth: int = 1) -> list[FileEntry]
```
List directory contents.
**Arguments**:
- `path` _str_ - Absolute path to the directory inside the capsule.
- `depth` _int_ - Recursion depth. ``1`` lists only immediate children.
Defaults to ``1``.
**Returns**:
- `list[FileEntry]` - Entries in the directory.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.Files.exists"></a>
#### exists
```python
def exists(path: str) -> bool
```
Check whether a path exists inside the capsule.
**Arguments**:
- `path` _str_ - Absolute path to check.
**Returns**:
- `bool` - ``True`` if the path exists.
<a id="wrenn.files.Files.make_dir"></a>
#### make\_dir
```python
def make_dir(path: str) -> FileEntry
```
Create a directory (with parents). Idempotent.
**Arguments**:
- `path` _str_ - Absolute path of the directory to create.
**Returns**:
- `FileEntry` - The created (or already-existing) directory entry.
<a id="wrenn.files.Files.remove"></a>
#### remove
```python
def remove(path: str) -> None
```
Remove a file or directory recursively.
**Arguments**:
- `path` _str_ - Absolute path to remove.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.Files.upload_stream"></a>
#### upload\_stream
```python
def upload_stream(path: str, stream: Iterator[bytes]) -> None
```
Stream a large file into the capsule.
Prefer this over :meth:`write` when the file is too large to hold in
memory.
**Arguments**:
- `path` _str_ - Absolute destination path inside the capsule.
- `stream` _Iterator[bytes]_ - Iterable of byte chunks to upload.
<a id="wrenn.files.Files.download_stream"></a>
#### download\_stream
```python
def download_stream(path: str) -> Iterator[bytes]
```
Stream a large file out of the capsule.
Prefer this over :meth:`read_bytes` when the file is too large to hold
in memory.
**Arguments**:
- `path` _str_ - Absolute path to the file inside the capsule.
**Yields**:
- `bytes` - Successive byte chunks of the file.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.AsyncFiles"></a>
## AsyncFiles Objects
```python
class AsyncFiles()
```
Async filesystem interface. Accessed via ``capsule.files``.
<a id="wrenn.files.AsyncFiles.read"></a>
#### read
```python
async def read(path: str) -> str
```
Read a file as a UTF-8 string.
**Arguments**:
- `path` _str_ - Absolute path to the file inside the capsule.
**Returns**:
- `str` - File contents decoded as UTF-8.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.AsyncFiles.read_bytes"></a>
#### read\_bytes
```python
async def read_bytes(path: str) -> bytes
```
Read a file as raw bytes.
**Arguments**:
- `path` _str_ - Absolute path to the file inside the capsule.
**Returns**:
- `bytes` - Raw file contents.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.AsyncFiles.write"></a>
#### write
```python
async def write(path: str, data: str | bytes) -> None
```
Write data to a file inside the capsule.
Creates parent directories if they do not exist.
**Arguments**:
- `path` _str_ - Absolute destination path inside the capsule.
- `data` _str | bytes_ - Content to write. Strings are UTF-8 encoded.
<a id="wrenn.files.AsyncFiles.list"></a>
#### list
```python
async def list(path: str, depth: int = 1) -> list[FileEntry]
```
List directory contents.
**Arguments**:
- `path` _str_ - Absolute path to the directory inside the capsule.
- `depth` _int_ - Recursion depth. ``1`` lists only immediate children.
Defaults to ``1``.
**Returns**:
- `list[FileEntry]` - Entries in the directory.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.AsyncFiles.exists"></a>
#### exists
```python
async def exists(path: str) -> bool
```
Check whether a path exists inside the capsule.
**Arguments**:
- `path` _str_ - Absolute path to check.
**Returns**:
- `bool` - ``True`` if the path exists.
<a id="wrenn.files.AsyncFiles.make_dir"></a>
#### make\_dir
```python
async def make_dir(path: str) -> FileEntry
```
Create a directory (with parents). Idempotent.
**Arguments**:
- `path` _str_ - Absolute path of the directory to create.
**Returns**:
- `FileEntry` - The created (or already-existing) directory entry.
<a id="wrenn.files.AsyncFiles.remove"></a>
#### remove
```python
async def remove(path: str) -> None
```
Remove a file or directory recursively.
**Arguments**:
- `path` _str_ - Absolute path to remove.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.files.AsyncFiles.upload_stream"></a>
#### upload\_stream
```python
async def upload_stream(path: str, stream: AsyncIterator[bytes]) -> None
```
Stream a large file into the capsule.
Prefer this over :meth:`write` when the file is too large to hold in
memory.
**Arguments**:
- `path` _str_ - Absolute destination path inside the capsule.
- `stream` _AsyncIterator[bytes]_ - Async iterable of byte chunks to
upload.
<a id="wrenn.files.AsyncFiles.download_stream"></a>
#### download\_stream
```python
async def download_stream(path: str) -> AsyncIterator[bytes]
```
Stream a large file out of the capsule.
Prefer this over :meth:`read_bytes` when the file is too large to hold
in memory.
**Arguments**:
- `path` _str_ - Absolute path to the file inside the capsule.
**Yields**:
- `bytes` - Successive byte chunks of the file.
**Raises**:
- `WrennNotFoundError` - If the path does not exist.
<a id="wrenn.code_interpreter.models"></a>
# wrenn.code\_interpreter.models
<a id="wrenn.code_interpreter.models.ExecutionError"></a>
## ExecutionError Objects
```python
@dataclass
class ExecutionError()
```
Error raised during code execution.
**Attributes**:
- `name` - Exception class name (e.g. ``"NameError"``).
- `value` - Exception message.
- `traceback` - Full traceback string.
<a id="wrenn.code_interpreter.models.Logs"></a>
## Logs Objects
```python
@dataclass
class Logs()
```
Captured stdout/stderr streams.
Each element in the list is one chunk of text as it arrived from
the kernel.
<a id="wrenn.code_interpreter.models.Result"></a>
## Result Objects
```python
@dataclass
class Result()
```
A single rich output from code execution.
Jupyter cells can produce multiple outputs — one ``execute_result``
(the expression value) and zero or more ``display_data`` messages
(from ``plt.show()``, ``display()``, etc.). Each becomes a
``Result``.
Known MIME types are unpacked into named attributes; anything else
lands in :pyattr:`extra`.
<a id="wrenn.code_interpreter.models.Result.text"></a>
#### text
``text/plain`` representation.
<a id="wrenn.code_interpreter.models.Result.html"></a>
#### html
``text/html`` representation.
<a id="wrenn.code_interpreter.models.Result.markdown"></a>
#### markdown
``text/markdown`` representation.
<a id="wrenn.code_interpreter.models.Result.svg"></a>
#### svg
``image/svg+xml`` representation.
<a id="wrenn.code_interpreter.models.Result.png"></a>
#### png
``image/png`` — base64-encoded.
<a id="wrenn.code_interpreter.models.Result.jpeg"></a>
#### jpeg
``image/jpeg`` — base64-encoded.
<a id="wrenn.code_interpreter.models.Result.pdf"></a>
#### pdf
``application/pdf`` — base64-encoded.
<a id="wrenn.code_interpreter.models.Result.latex"></a>
#### latex
``text/latex`` representation.
<a id="wrenn.code_interpreter.models.Result.json"></a>
#### json
``application/json`` representation.
<a id="wrenn.code_interpreter.models.Result.javascript"></a>
#### javascript
``application/javascript`` representation.
<a id="wrenn.code_interpreter.models.Result.extra"></a>
#### extra
MIME types not covered by the named fields above.
<a id="wrenn.code_interpreter.models.Result.is_main_result"></a>
#### is\_main\_result
``True`` when this came from an ``execute_result`` message
(i.e. the value of the last expression in the cell). ``False``
for ``display_data`` outputs.
<a id="wrenn.code_interpreter.models.Result.from_bundle"></a>
#### from\_bundle
```python
@classmethod
def from_bundle(cls,
bundle: dict[str, str],
*,
is_main_result: bool = False) -> Result
```
Build a ``Result`` from a Jupyter MIME bundle dict.
<a id="wrenn.code_interpreter.models.Result.formats"></a>
#### formats
```python
def formats() -> list[str]
```
Return names of non-``None`` MIME-type fields.
<a id="wrenn.code_interpreter.models.Execution"></a>
## Execution Objects
```python
@dataclass
class Execution()
```
Complete result of a ``run_code`` call.
**Attributes**:
- `results` - All rich outputs produced by the cell — charts, tables,
images, expression values, etc.
- `logs` - Captured stdout/stderr text.
- `error` - Populated when the cell raised an exception.
- `execution_count` - Jupyter execution counter (the ``[N]`` number).
<a id="wrenn.code_interpreter.models.Execution.text"></a>
#### text
```python
@property
def text() -> str | None
```
Convenience — ``text/plain`` of the main ``execute_result``,
or ``None`` if the cell had no expression value.
<a id="wrenn.code_interpreter.async_capsule"></a>
# wrenn.code\_interpreter.async\_capsule
<a id="wrenn.code_interpreter.async_capsule.AsyncCapsule"></a>
## AsyncCapsule Objects
```python
class AsyncCapsule(BaseAsyncCapsule)
```
Async code interpreter capsule with ``run_code`` support.
Uses ``code-runner-beta`` template by default::
from wrenn.code_interpreter import AsyncCapsule
capsule = await AsyncCapsule.create()
result = await capsule.run_code("print('hello')")
<a id="wrenn.code_interpreter.async_capsule.AsyncCapsule.create"></a>
#### create
```python
@classmethod
async def create(cls,
template: str | None = None,
vcpus: int | None = None,
memory_mb: int | None = None,
timeout: int | None = None,
*,
wait: bool = False,
api_key: str | None = None,
base_url: str | None = None) -> AsyncCapsule
```
Create a new async code interpreter capsule.
**Arguments**:
- `template` _str | None_ - Template to boot from. Defaults to
``"code-runner-beta"``.
- `vcpus` _int | None_ - Number of virtual CPUs.
- `memory_mb` _int | None_ - Memory in MiB.
- `timeout` _int | None_ - Inactivity TTL in seconds before auto-pause.
- `wait` _bool_ - Await until the capsule reaches ``running`` status.
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
**Returns**:
- `AsyncCapsule` - A new async code interpreter capsule instance.
<a id="wrenn.code_interpreter.async_capsule.AsyncCapsule.run_code"></a>
#### run\_code
```python
async def run_code(
code: str,
language: str = "python",
timeout: float = 30,
jupyter_timeout: float = 30,
on_result: Callable[[Result], Any] | None = None,
on_stdout: Callable[[str], Any] | None = None,
on_stderr: Callable[[str], Any] | None = None,
on_error: Callable[[ExecutionError], Any] | None = None) -> Execution
```
Execute code in a persistent Jupyter kernel (async).
**Arguments**:
- `code` - Code string to execute.
- `language` - Execution backend language. Currently only ``"python"``.
- `timeout` - Maximum seconds to wait for execution to complete.
- `jupyter_timeout` - Maximum seconds to wait for Jupyter to become
available.
- `on_result` - Called for each rich output (charts, images, expression
values).
- `on_stdout` - Called for each stdout chunk.
- `on_stderr` - Called for each stderr chunk.
- `on_error` - Called when the cell raises an exception.
**Returns**:
An :class:`Execution` with ``.results``, ``.logs``, ``.error``,
and a convenience ``.text`` property.
<a id="wrenn.code_interpreter"></a>
# wrenn.code\_interpreter
<a id="wrenn.code_interpreter.capsule"></a>
# wrenn.code\_interpreter.capsule
<a id="wrenn.code_interpreter.capsule.Capsule"></a>
## Capsule Objects
```python
class Capsule(BaseCapsule)
```
Code interpreter capsule with ``run_code`` support.
Uses ``code-runner-beta`` template by default::
from wrenn.code_interpreter import Capsule
capsule = Capsule()
result = capsule.run_code("print('hello')")
print(result.logs.stdout) # ["hello\n"]
<a id="wrenn.code_interpreter.capsule.Capsule.__init__"></a>
#### \_\_init\_\_
```python
def __init__(template: str | None = None,
vcpus: int | None = None,
memory_mb: int | None = None,
timeout: int | None = None,
*,
api_key: str | None = None,
base_url: str | None = None,
**kwargs) -> None
```
Create a code interpreter capsule.
**Arguments**:
- `template` _str | None_ - Template to boot from. Defaults to
``"code-runner-beta"``.
- `vcpus` _int | None_ - Number of virtual CPUs.
- `memory_mb` _int | None_ - Memory in MiB.
- `timeout` _int | None_ - Inactivity TTL in seconds before auto-pause.
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
<a id="wrenn.code_interpreter.capsule.Capsule.create"></a>
#### create
```python
@classmethod
def create(cls,
template: str | None = None,
vcpus: int | None = None,
memory_mb: int | None = None,
timeout: int | None = None,
*,
wait: bool = False,
api_key: str | None = None,
base_url: str | None = None) -> Capsule
```
Create a new code interpreter capsule.
**Arguments**:
- `template` _str | None_ - Template to boot from. Defaults to
``"code-runner-beta"``.
- `vcpus` _int | None_ - Number of virtual CPUs.
- `memory_mb` _int | None_ - Memory in MiB.
- `timeout` _int | None_ - Inactivity TTL in seconds before auto-pause.
- `wait` _bool_ - Block until the capsule reaches ``running`` status.
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
**Returns**:
- `Capsule` - A new code interpreter capsule instance.
<a id="wrenn.code_interpreter.capsule.Capsule.run_code"></a>
#### run\_code
```python
def run_code(
code: str,
language: str = "python",
timeout: float = 30,
jupyter_timeout: float = 30,
on_result: Callable[[Result], Any] | None = None,
on_stdout: Callable[[str], Any] | None = None,
on_stderr: Callable[[str], Any] | None = None,
on_error: Callable[[ExecutionError], Any] | None = None) -> Execution
```
Execute code in a persistent Jupyter kernel.
Variables, imports, and function definitions survive across calls.
**Arguments**:
- `code` - Code string to execute.
- `language` - Execution backend language. Currently only ``"python"``.
- `timeout` - Maximum seconds to wait for execution to complete.
- `jupyter_timeout` - Maximum seconds to wait for Jupyter to become
available.
- `on_result` - Called for each rich output (charts, images, expression
values).
- `on_stdout` - Called for each stdout chunk.
- `on_stderr` - Called for each stderr chunk.
- `on_error` - Called when the cell raises an exception.
**Returns**:
An :class:`Execution` with ``.results``, ``.logs``, ``.error``,
and a convenience ``.text`` property.
<a id="wrenn.exceptions"></a>
# wrenn.exceptions
<a id="wrenn.exceptions.WrennError"></a>
## WrennError Objects
```python
class WrennError(Exception)
```
Base exception for all Wrenn SDK errors.
All SDK exceptions inherit from this class, so you can catch
``WrennError`` to handle any API error generically.
**Attributes**:
- `code` _str_ - Machine-readable error code from the API
(e.g. ``"not_found"``).
- `message` _str_ - Human-readable error description.
- `status_code` _int_ - HTTP status code of the response.
<a id="wrenn.exceptions.WrennError.__init__"></a>
#### \_\_init\_\_
```python
def __init__(code: str, message: str, status_code: int) -> None
```
Initialize a WrennError.
**Arguments**:
- `code` _str_ - Machine-readable error code.
- `message` _str_ - Human-readable error description.
- `status_code` _int_ - HTTP status code of the response.
<a id="wrenn.exceptions.WrennValidationError"></a>
## WrennValidationError Objects
```python
class WrennValidationError(WrennError)
```
400 — Invalid request parameters.
<a id="wrenn.exceptions.WrennAuthenticationError"></a>
## WrennAuthenticationError Objects
```python
class WrennAuthenticationError(WrennError)
```
401 — Invalid or missing authentication.
<a id="wrenn.exceptions.WrennForbiddenError"></a>
## WrennForbiddenError Objects
```python
class WrennForbiddenError(WrennError)
```
403 — Authenticated but not authorized.
<a id="wrenn.exceptions.WrennNotFoundError"></a>
## WrennNotFoundError Objects
```python
class WrennNotFoundError(WrennError)
```
404 — Resource not found.
<a id="wrenn.exceptions.WrennConflictError"></a>
## WrennConflictError Objects
```python
class WrennConflictError(WrennError)
```
409 — State conflict (e.g. invalid_state).
<a id="wrenn.exceptions.WrennHostHasCapsulesError"></a>
## WrennHostHasCapsulesError Objects
```python
class WrennHostHasCapsulesError(WrennConflictError)
```
409 — Host still has running capsules.
**Attributes**:
- `capsule_ids` _list[str]_ - IDs of the capsules still running on the host.
<a id="wrenn.exceptions.WrennHostHasCapsulesError.__init__"></a>
#### \_\_init\_\_
```python
def __init__(code: str, message: str, status_code: int,
capsule_ids: list[str]) -> None
```
Initialize a WrennHostHasCapsulesError.
**Arguments**:
- `code` _str_ - Machine-readable error code.
- `message` _str_ - Human-readable error description.
- `status_code` _int_ - HTTP status code of the response.
- `capsule_ids` _list[str]_ - IDs of capsules still on the host.
<a id="wrenn.exceptions.WrennHostUnavailableError"></a>
## WrennHostUnavailableError Objects
```python
class WrennHostUnavailableError(WrennError)
```
503 — No suitable host available.
<a id="wrenn.exceptions.WrennAgentError"></a>
## WrennAgentError Objects
```python
class WrennAgentError(WrennError)
```
502 — Host agent returned an error.
<a id="wrenn.exceptions.WrennInternalError"></a>
## WrennInternalError Objects
```python
class WrennInternalError(WrennError)
```
500 — Unexpected server error.
<a id="wrenn.async_capsule"></a>
# wrenn.async\_capsule
<a id="wrenn.async_capsule.AsyncCapsule"></a>
## AsyncCapsule Objects
```python
class AsyncCapsule()
```
Async Wrenn capsule with e2b-compatible interface.
Create via classmethod::
capsule = await AsyncCapsule.create(template="minimal")
Use as async context manager::
async with await AsyncCapsule.create() as capsule:
await capsule.commands.run("echo hello")
<a id="wrenn.async_capsule.AsyncCapsule.capsule_id"></a>
#### capsule\_id
```python
@property
def capsule_id() -> str
```
The capsule's unique identifier.
**Returns**:
- `str` - Capsule ID assigned by the Wrenn API.
<a id="wrenn.async_capsule.AsyncCapsule.info"></a>
#### info
```python
@property
def info() -> CapsuleModel | None
```
Cached capsule metadata from the last API call.
**Returns**:
CapsuleModel | None: The last-fetched capsule model, or ``None``
if the capsule was connected without an initial fetch.
<a id="wrenn.async_capsule.AsyncCapsule.create"></a>
#### create
```python
@classmethod
async def create(cls,
template: str | None = None,
vcpus: int | None = None,
memory_mb: int | None = None,
timeout: int | None = None,
*,
wait: bool = False,
api_key: str | None = None,
base_url: str | None = None) -> AsyncCapsule
```
Create a new capsule.
**Arguments**:
- `template` _str | None_ - Template name to boot from.
- `vcpus` _int | None_ - Number of virtual CPUs.
- `memory_mb` _int | None_ - Memory in MiB.
- `timeout` _int | None_ - Inactivity TTL in seconds before auto-pause.
- `wait` _bool_ - Await until the capsule reaches ``running`` status.
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
**Returns**:
- `AsyncCapsule` - A new capsule instance.
<a id="wrenn.async_capsule.AsyncCapsule.connect"></a>
#### connect
```python
@classmethod
async def connect(cls,
capsule_id: str,
*,
api_key: str | None = None,
base_url: str | None = None) -> AsyncCapsule
```
Connect to an existing capsule, resuming it if paused.
**Arguments**:
- `capsule_id` _str_ - ID of the capsule to connect to.
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
**Returns**:
- `AsyncCapsule` - A capsule instance bound to the existing capsule.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.async_capsule.AsyncCapsule.ping"></a>
#### ping
```python
async def ping() -> None
```
Reset the capsule inactivity timer.
Call this to prevent the capsule from being auto-paused when the
inactivity TTL is set.
<a id="wrenn.async_capsule.AsyncCapsule.wait_ready"></a>
#### wait\_ready
```python
async def wait_ready(timeout: float = 30, interval: float = 0.5) -> None
```
Await until the capsule status is ``running``.
**Arguments**:
- `timeout` _float_ - Maximum seconds to wait. Defaults to ``30``.
- `interval` _float_ - Polling interval in seconds. Defaults to ``0.5``.
**Raises**:
- `TimeoutError` - If the capsule does not reach ``running`` state
within ``timeout`` seconds.
- `RuntimeError` - If the capsule enters an error, stopped, or paused
state while waiting.
<a id="wrenn.async_capsule.AsyncCapsule.is_running"></a>
#### is\_running
```python
async def is_running() -> bool
```
Check whether the capsule is currently running.
Makes a live API call to fetch current status.
**Returns**:
- `bool` - ``True`` if the capsule status is ``running``.
<a id="wrenn.async_capsule.AsyncCapsule.list"></a>
#### list
```python
@classmethod
async def list(cls,
*,
api_key: str | None = None,
base_url: str | None = None) -> list[CapsuleModel]
```
List all capsules belonging to the team.
**Arguments**:
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
**Returns**:
- `list[CapsuleModel]` - All capsules for the authenticated team.
<a id="wrenn.async_capsule.AsyncCapsule.pty"></a>
#### pty
```python
@asynccontextmanager
async def pty(cmd: str = "/bin/bash",
args: list[str] | None = None,
cols: int = 80,
rows: int = 24,
envs: dict[str, str] | None = None,
cwd: str | None = None) -> AsyncIterator[AsyncPtySession]
```
Open an async interactive PTY session backed by a WebSocket.
Use as an async context manager and async iterate over
:class:`PtyEvent` objects::
async with capsule.pty() as term:
await term.write(b"echo hello\n")
async for event in term:
if event.type == "output":
print(event.data.decode())
**Arguments**:
- `cmd` _str_ - Command to run inside the PTY. Defaults to
``"/bin/bash"``.
- `args` _list[str] | None_ - Additional arguments for ``cmd``.
- `cols` _int_ - Initial terminal column count. Defaults to ``80``.
- `rows` _int_ - Initial terminal row count. Defaults to ``24``.
- `envs` _dict[str, str] | None_ - Additional environment variables
to inject into the process.
- `cwd` _str | None_ - Working directory for the process.
**Yields**:
- `AsyncPtySession` - An interactive async PTY session.
<a id="wrenn.async_capsule.AsyncCapsule.pty_connect"></a>
#### pty\_connect
```python
@asynccontextmanager
async def pty_connect(tag: str) -> AsyncIterator[AsyncPtySession]
```
Reconnect to an existing PTY session by tag.
**Arguments**:
- `tag` _str_ - Session tag returned in the ``started`` PTY event.
**Yields**:
- `AsyncPtySession` - The reconnected async PTY session.
<a id="wrenn.async_capsule.AsyncCapsule.get_url"></a>
#### get\_url
```python
def get_url(port: int) -> str
```
Get the proxy URL for a port exposed inside this capsule.
**Arguments**:
- `port` _int_ - Port number to proxy.
**Returns**:
- `str` - A ``wss://`` (or ``ws://``) URL that proxies to the given
port inside the capsule.
<a id="wrenn.async_capsule.AsyncCapsule.create_snapshot"></a>
#### create\_snapshot
```python
async def create_snapshot(name: str | None = None,
overwrite: bool = False) -> Template
```
Create a snapshot template from this capsule's current state.
**Arguments**:
- `name` _str | None_ - Name for the snapshot template. Auto-generated
if not provided.
- `overwrite` _bool_ - If ``True``, overwrite an existing template with
the same name. Defaults to ``False``.
**Returns**:
- `Template` - The created snapshot template.
<a id="wrenn.pty"></a>
# wrenn.pty
<a id="wrenn.pty.PtySession"></a>
## PtySession Objects
```python
class PtySession()
```
Interactive PTY session backed by a WebSocket.
Use as a context manager and iterate over events::
with sb.pty(cmd="/bin/bash") as term:
term.write(b"ls -la\n")
for event in term:
if event.type == "output":
sys.stdout.buffer.write(event.data)
elif event.type == "exit":
break
<a id="wrenn.pty.PtySession.tag"></a>
#### tag
```python
@property
def tag() -> str | None
```
Session tag. Available after the ``started`` event.
<a id="wrenn.pty.PtySession.pid"></a>
#### pid
```python
@property
def pid() -> int | None
```
Process PID. Available after the ``started`` event.
<a id="wrenn.pty.PtySession.write"></a>
#### write
```python
def write(data: bytes) -> None
```
Send raw bytes to the PTY stdin.
**Arguments**:
- `data` - Raw bytes to send. Base64-encoded internally.
<a id="wrenn.pty.PtySession.resize"></a>
#### resize
```python
def resize(cols: int, rows: int) -> None
```
Resize the PTY terminal.
**Arguments**:
- `cols` - New column count. Must be > 0.
- `rows` - New row count. Must be > 0.
**Raises**:
- `ValueError` - If cols or rows is 0.
<a id="wrenn.pty.PtySession.kill"></a>
#### kill
```python
def kill() -> None
```
Send SIGKILL to the PTY process.
<a id="wrenn.pty.AsyncPtySession"></a>
## AsyncPtySession Objects
```python
class AsyncPtySession()
```
Async interactive PTY session backed by a WebSocket.
Use as an async context manager and async iterate over events::
async with sb.pty(cmd="/bin/bash") as term:
await term.write(b"ls -la\n")
async for event in term:
if event.type == "output":
sys.stdout.buffer.write(event.data)
elif event.type == "exit":
break
<a id="wrenn.pty.AsyncPtySession.tag"></a>
#### tag
```python
@property
def tag() -> str | None
```
Session tag. Available after the ``started`` event.
<a id="wrenn.pty.AsyncPtySession.pid"></a>
#### pid
```python
@property
def pid() -> int | None
```
Process PID. Available after the ``started`` event.
<a id="wrenn.pty.AsyncPtySession.write"></a>
#### write
```python
async def write(data: bytes) -> None
```
Send raw bytes to the PTY stdin.
**Arguments**:
- `data` - Raw bytes to send. Base64-encoded internally.
<a id="wrenn.pty.AsyncPtySession.resize"></a>
#### resize
```python
async def resize(cols: int, rows: int) -> None
```
Resize the PTY terminal.
**Arguments**:
- `cols` - New column count. Must be > 0.
- `rows` - New row count. Must be > 0.
**Raises**:
- `ValueError` - If cols or rows is 0.
<a id="wrenn.pty.AsyncPtySession.kill"></a>
#### kill
```python
async def kill() -> None
```
Send SIGKILL to the PTY process.
<a id="wrenn.models._generated"></a>
# wrenn.models.\_generated
<a id="wrenn.models._generated.Peaks"></a>
## Peaks Objects
```python
class Peaks(BaseModel)
```
Maximum values over the last 30 days.
<a id="wrenn.models._generated.Series"></a>
## Series Objects
```python
class Series(BaseModel)
```
Parallel arrays for chart rendering.
<a id="wrenn.models._generated.Encoding"></a>
## Encoding Objects
```python
class Encoding(StrEnum)
```
Output encoding. "base64" when stdout/stderr contain binary data.
<a id="wrenn.models._generated.Type2"></a>
## Type2 Objects
```python
class Type2(StrEnum)
```
Host type. Regular hosts are shared; BYOC hosts belong to a team.
<a id="wrenn.models"></a>
# wrenn.models
<a id="wrenn.capsule"></a>
# wrenn.capsule
<a id="wrenn.capsule.Capsule"></a>
## Capsule Objects
```python
class Capsule()
```
A Wrenn capsule (sandbox) with e2b-compatible interface.
Create directly::
capsule = Capsule(api_key="wrn_...")
capsule = Capsule(template="minimal") # reads WRENN_API_KEY env
Or via classmethod::
capsule = Capsule.create(template="minimal")
Use as context manager for automatic cleanup::
with Capsule() as capsule:
capsule.commands.run("echo hello")
<a id="wrenn.capsule.Capsule.__init__"></a>
#### \_\_init\_\_
```python
def __init__(template: str | None = None,
vcpus: int | None = None,
memory_mb: int | None = None,
timeout: int | None = None,
*,
wait: bool = False,
api_key: str | None = None,
base_url: str | None = None,
_capsule_id: str | None = None,
_client: WrennClient | None = None,
_info: CapsuleModel | None = None) -> None
```
Create and start a new capsule.
**Arguments**:
- `template` _str | None_ - Template name to boot from. Defaults to
the server-side default (``"minimal"``).
- `vcpus` _int | None_ - Number of virtual CPUs. Defaults to the
server-side default.
- `memory_mb` _int | None_ - Memory in MiB. Defaults to the
server-side default.
- `timeout` _int | None_ - Inactivity TTL in seconds before the capsule
is auto-paused. ``0`` disables auto-pause.
- `wait` _bool_ - If ``True``, block until the capsule status is
``running`` before returning.
- `api_key` _str | None_ - Wrenn API key (``wrn_...``). Falls back to
the ``WRENN_API_KEY`` environment variable.
- `base_url` _str | None_ - Wrenn API base URL. Falls back to
``WRENN_BASE_URL`` or the default production endpoint.
<a id="wrenn.capsule.Capsule.capsule_id"></a>
#### capsule\_id
```python
@property
def capsule_id() -> str
```
The capsule's unique identifier.
**Returns**:
- `str` - Capsule ID assigned by the Wrenn API.
<a id="wrenn.capsule.Capsule.info"></a>
#### info
```python
@property
def info() -> CapsuleModel | None
```
Cached capsule metadata from the last API call.
**Returns**:
CapsuleModel | None: The last-fetched capsule model, or ``None``
if the capsule was connected without an initial fetch.
<a id="wrenn.capsule.Capsule.create"></a>
#### create
```python
@classmethod
def create(cls,
template: str | None = None,
vcpus: int | None = None,
memory_mb: int | None = None,
timeout: int | None = None,
*,
wait: bool = False,
api_key: str | None = None,
base_url: str | None = None) -> Capsule
```
Create a new capsule.
Equivalent to calling ``Capsule(...)`` directly.
**Arguments**:
- `template` _str | None_ - Template name to boot from.
- `vcpus` _int | None_ - Number of virtual CPUs.
- `memory_mb` _int | None_ - Memory in MiB.
- `timeout` _int | None_ - Inactivity TTL in seconds before auto-pause.
- `wait` _bool_ - Block until the capsule reaches ``running`` status.
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
**Returns**:
- `Capsule` - A new capsule instance.
<a id="wrenn.capsule.Capsule.connect"></a>
#### connect
```python
@classmethod
def connect(cls,
capsule_id: str,
*,
api_key: str | None = None,
base_url: str | None = None) -> Capsule
```
Connect to an existing capsule, resuming it if paused.
**Arguments**:
- `capsule_id` _str_ - ID of the capsule to connect to.
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
**Returns**:
- `Capsule` - A capsule instance bound to the existing capsule.
**Raises**:
- `WrennNotFoundError` - If no capsule with the given ID exists.
<a id="wrenn.capsule.Capsule.ping"></a>
#### ping
```python
def ping() -> None
```
Reset the capsule inactivity timer.
Call this to prevent the capsule from being auto-paused when the
inactivity TTL is set.
<a id="wrenn.capsule.Capsule.wait_ready"></a>
#### wait\_ready
```python
def wait_ready(timeout: float = 30, interval: float = 0.5) -> None
```
Block until the capsule status is ``running``.
**Arguments**:
- `timeout` _float_ - Maximum seconds to wait. Defaults to ``30``.
- `interval` _float_ - Polling interval in seconds. Defaults to ``0.5``.
**Raises**:
- `TimeoutError` - If the capsule does not reach ``running`` state
within ``timeout`` seconds.
- `RuntimeError` - If the capsule enters an error, stopped, or paused
state while waiting.
<a id="wrenn.capsule.Capsule.is_running"></a>
#### is\_running
```python
def is_running() -> bool
```
Check whether the capsule is currently running.
Makes a live API call to fetch current status.
**Returns**:
- `bool` - ``True`` if the capsule status is ``running``.
<a id="wrenn.capsule.Capsule.list"></a>
#### list
```python
@classmethod
def list(cls,
*,
api_key: str | None = None,
base_url: str | None = None) -> list[CapsuleModel]
```
List all capsules belonging to the team.
**Arguments**:
- `api_key` _str | None_ - Wrenn API key. Falls back to
``WRENN_API_KEY`` env var.
- `base_url` _str | None_ - API base URL override.
**Returns**:
- `list[CapsuleModel]` - All capsules for the authenticated team.
<a id="wrenn.capsule.Capsule.pty"></a>
#### pty
```python
@contextmanager
def pty(cmd: str = "/bin/bash",
args: list[str] | None = None,
cols: int = 80,
rows: int = 24,
envs: dict[str, str] | None = None,
cwd: str | None = None) -> Iterator[PtySession]
```
Open an interactive PTY session backed by a WebSocket.
Use as a context manager and iterate over :class:`PtyEvent` objects::
with capsule.pty() as term:
term.write(b"echo hello\n")
for event in term:
if event.type == "output":
print(event.data.decode())
**Arguments**:
- `cmd` _str_ - Command to run inside the PTY. Defaults to
``"/bin/bash"``.
- `args` _list[str] | None_ - Additional arguments for ``cmd``.
- `cols` _int_ - Initial terminal column count. Defaults to ``80``.
- `rows` _int_ - Initial terminal row count. Defaults to ``24``.
- `envs` _dict[str, str] | None_ - Additional environment variables to
inject into the process.
- `cwd` _str | None_ - Working directory for the process.
**Yields**:
- `PtySession` - An interactive PTY session.
<a id="wrenn.capsule.Capsule.pty_connect"></a>
#### pty\_connect
```python
@contextmanager
def pty_connect(tag: str) -> Iterator[PtySession]
```
Reconnect to an existing PTY session by tag.
**Arguments**:
- `tag` _str_ - Session tag returned in the ``started`` PTY event.
**Yields**:
- `PtySession` - The reconnected PTY session.
<a id="wrenn.capsule.Capsule.get_url"></a>
#### get\_url
```python
def get_url(port: int) -> str
```
Get the proxy URL for a port exposed inside this capsule.
**Arguments**:
- `port` _int_ - Port number to proxy.
**Returns**:
- `str` - A ``wss://`` (or ``ws://``) URL that proxies to the given
port inside the capsule.
<a id="wrenn.capsule.Capsule.create_snapshot"></a>
#### create\_snapshot
```python
def create_snapshot(name: str | None = None,
overwrite: bool = False) -> Template
```
Create a snapshot template from this capsule's current state.
**Arguments**:
- `name` _str | None_ - Name for the snapshot template. Auto-generated
if not provided.
- `overwrite` _bool_ - If ``True``, overwrite an existing template with
the same name. Defaults to ``False``.
**Returns**:
- `Template` - The created snapshot template.
<a id="wrenn._config"></a>
# wrenn.\_config
<a id="wrenn._config.ConnectionConfig"></a>
## ConnectionConfig Objects
```python
@dataclass(frozen=True)
class ConnectionConfig()
```
Resolved credentials and base URL for Wrenn API calls.
<a id="wrenn._git._auth"></a>
# wrenn.\_git.\_auth
<a id="wrenn._git._auth.embed_credentials"></a>
#### embed\_credentials
```python
def embed_credentials(url: str, username: str, password: str) -> str
```
Embed HTTP(S) credentials into a git URL.
**Arguments**:
- `url` - Git repository URL.
- `username` - Username for authentication.
- `password` - Password or personal access token.
**Returns**:
URL with ``username:password@`` embedded in the netloc.
**Raises**:
- `ValueError` - If the URL scheme is not ``http`` or ``https``.
<a id="wrenn._git._auth.strip_credentials"></a>
#### strip\_credentials
```python
def strip_credentials(url: str) -> str
```
Remove embedded credentials from a git URL.
**Arguments**:
- `url` - Git repository URL, possibly with credentials.
**Returns**:
URL with credentials removed. Non-HTTP(S) URLs are returned
unchanged.
<a id="wrenn._git._auth.is_auth_error"></a>
#### is\_auth\_error
```python
def is_auth_error(stderr: str) -> bool
```
Check whether git stderr indicates an authentication failure.
**Arguments**:
- `stderr` - Combined stderr output from a git command.
**Returns**:
``True`` if any known auth-failure pattern is found.
<a id="wrenn._git._auth.build_credential_approve_cmd"></a>
#### build\_credential\_approve\_cmd
```python
def build_credential_approve_cmd(username: str,
password: str,
host: str = "github.com",
protocol: str = "https") -> str
```
Build a shell command that pipes credentials into ``git credential approve``.
**Arguments**:
- `username` - Git username.
- `password` - Password or personal access token.
- `host` - Target host. Defaults to ``"github.com"``.
- `protocol` - Protocol. Defaults to ``"https"``.
**Returns**:
A shell command string safe to pass to ``commands.run()``.
<a id="wrenn._git._cmd"></a>
# wrenn.\_git.\_cmd
Pure functions that build git argument lists and parse git output.
No I/O, no network, no imports from ``wrenn``. Every ``build_*`` function
returns a ``list[str]`` suitable for ``shlex.join()``. Every ``parse_*``
function takes raw stdout and returns a typed structure.
<a id="wrenn._git._cmd.FileStatus"></a>
## FileStatus Objects
```python
@dataclass
class FileStatus()
```
A single entry from ``git status --porcelain=v1``.
**Attributes**:
- `path` _str_ - File path relative to the repository root.
- `index_status` _str_ - Index (staged) status character.
- `work_tree_status` _str_ - Working-tree status character.
- `renamed_from` _str | None_ - Original path when status is a rename.
<a id="wrenn._git._cmd.FileStatus.staged"></a>
#### staged
```python
@property
def staged() -> bool
```
Whether the change is staged in the index.
<a id="wrenn._git._cmd.FileStatus.status"></a>
#### status
```python
@property
def status() -> str
```
Normalized human-readable status label.
<a id="wrenn._git._cmd.GitStatus"></a>
## GitStatus Objects
```python
@dataclass
class GitStatus()
```
Parsed output of ``git status --porcelain=v1 --branch``.
**Attributes**:
- `branch` _str | None_ - Current branch name, or ``None`` if detached.
- `upstream` _str | None_ - Upstream tracking branch.
- `ahead` _int_ - Commits ahead of upstream.
- `behind` _int_ - Commits behind upstream.
- `detached` _bool_ - Whether HEAD is detached.
- `files` _list[FileStatus]_ - Per-file status entries.
<a id="wrenn._git._cmd.GitStatus.is_clean"></a>
#### is\_clean
```python
@property
def is_clean() -> bool
```
``True`` when there are no changed or untracked files.
<a id="wrenn._git._cmd.GitStatus.has_staged"></a>
#### has\_staged
```python
@property
def has_staged() -> bool
```
``True`` when at least one file has staged changes.
<a id="wrenn._git._cmd.GitStatus.has_untracked"></a>
#### has\_untracked
```python
@property
def has_untracked() -> bool
```
``True`` when at least one file is untracked.
<a id="wrenn._git._cmd.GitStatus.has_conflicts"></a>
#### has\_conflicts
```python
@property
def has_conflicts() -> bool
```
``True`` when at least one file has merge conflicts.
<a id="wrenn._git._cmd.GitBranch"></a>
## GitBranch Objects
```python
@dataclass
class GitBranch()
```
A single branch entry.
**Attributes**:
- `name` _str_ - Branch name (short ref).
- `is_current` _bool_ - Whether this is the checked-out branch.
<a id="wrenn._git._cmd.build_clone"></a>
#### build\_clone
```python
def build_clone(url: str,
dest: str | None = None,
*,
branch: str | None = None,
depth: int | None = None) -> list[str]
```
Build ``git clone`` arguments.
<a id="wrenn._git._cmd.build_init"></a>
#### build\_init
```python
def build_init(path: str = ".",
*,
bare: bool = False,
initial_branch: str | None = None) -> list[str]
```
Build ``git init`` arguments.
<a id="wrenn._git._cmd.build_add"></a>
#### build\_add
```python
def build_add(paths: list[str] | None = None,
*,
all: bool = False) -> list[str]
```
Build ``git add`` arguments.
<a id="wrenn._git._cmd.build_commit"></a>
#### build\_commit
```python
def build_commit(message: str,
*,
allow_empty: bool = False,
author_name: str | None = None,
author_email: str | None = None) -> list[str]
```
Build ``git commit`` arguments.
<a id="wrenn._git._cmd.build_push"></a>
#### build\_push
```python
def build_push(remote: str = "origin",
branch: str | None = None,
*,
force: bool = False,
set_upstream: bool = False) -> list[str]
```
Build ``git push`` arguments.
<a id="wrenn._git._cmd.build_pull"></a>
#### build\_pull
```python
def build_pull(remote: str = "origin",
branch: str | None = None,
*,
rebase: bool = False,
ff_only: bool = False) -> list[str]
```
Build ``git pull`` arguments.
<a id="wrenn._git._cmd.build_status"></a>
#### build\_status
```python
def build_status() -> list[str]
```
Build ``git status`` arguments for porcelain parsing.
<a id="wrenn._git._cmd.build_branches"></a>
#### build\_branches
```python
def build_branches() -> list[str]
```
Build ``git branch`` arguments for structured parsing.
<a id="wrenn._git._cmd.build_create_branch"></a>
#### build\_create\_branch
```python
def build_create_branch(name: str,
*,
start_point: str | None = None) -> list[str]
```
Build ``git checkout -b`` arguments.
<a id="wrenn._git._cmd.build_checkout"></a>
#### build\_checkout
```python
def build_checkout(name: str) -> list[str]
```
Build ``git checkout`` arguments.
<a id="wrenn._git._cmd.build_delete_branch"></a>
#### build\_delete\_branch
```python
def build_delete_branch(name: str, *, force: bool = False) -> list[str]
```
Build ``git branch -d/-D`` arguments.
<a id="wrenn._git._cmd.build_remote_add"></a>
#### build\_remote\_add
```python
def build_remote_add(name: str, url: str, *, fetch: bool = False) -> list[str]
```
Build ``git remote add`` arguments.
<a id="wrenn._git._cmd.build_remote_get_url"></a>
#### build\_remote\_get\_url
```python
def build_remote_get_url(name: str = "origin") -> list[str]
```
Build ``git remote get-url`` arguments.
<a id="wrenn._git._cmd.build_remote_set_url"></a>
#### build\_remote\_set\_url
```python
def build_remote_set_url(name: str, url: str) -> list[str]
```
Build ``git remote set-url`` arguments.
<a id="wrenn._git._cmd.build_reset"></a>
#### build\_reset
```python
def build_reset(*,
mode: str | None = None,
ref: str | None = None,
paths: list[str] | None = None) -> list[str]
```
Build ``git reset`` arguments.
**Arguments**:
- `mode` - Reset mode (``soft``, ``mixed``, ``hard``, ``merge``, ``keep``).
- `ref` - Commit, branch, or ref to reset to.
- `paths` - Paths to reset (mutually exclusive with ``mode``).
<a id="wrenn._git._cmd.build_restore"></a>
#### build\_restore
```python
def build_restore(paths: list[str],
*,
staged: bool = False,
worktree: bool = False,
source: str | None = None) -> list[str]
```
Build ``git restore`` arguments.
**Arguments**:
- `paths` - Paths to restore.
- `staged` - Restore the index (unstage).
- `worktree` - Restore working-tree files.
- `source` - Commit or ref to restore from.
<a id="wrenn._git._cmd.build_config_set"></a>
#### build\_config\_set
```python
def build_config_set(key: str,
value: str,
*,
scope: str = "local",
repo_path: str | None = None) -> list[str]
```
Build ``git config`` set arguments.
<a id="wrenn._git._cmd.build_config_get"></a>
#### build\_config\_get
```python
def build_config_get(key: str,
*,
scope: str = "local",
repo_path: str | None = None) -> list[str]
```
Build ``git config --get`` arguments.
<a id="wrenn._git._cmd.build_has_upstream"></a>
#### build\_has\_upstream
```python
def build_has_upstream() -> list[str]
```
Build arguments to check if current branch has upstream tracking.
<a id="wrenn._git._cmd.parse_status"></a>
#### parse\_status
```python
def parse_status(stdout: str) -> GitStatus
```
Parse ``git status --porcelain=v1 --branch`` output.
**Arguments**:
- `stdout` - Raw stdout from the git status command.
**Returns**:
Parsed :class:`GitStatus`.
<a id="wrenn._git._cmd.parse_branches"></a>
#### parse\_branches
```python
def parse_branches(stdout: str) -> list[GitBranch]
```
Parse ``git branch --format=%(refname:short)\t%(HEAD)`` output.
**Arguments**:
- `stdout` - Raw stdout from the git branch command.
**Returns**:
List of :class:`GitBranch`.
<a id="wrenn._git.exceptions"></a>
# wrenn.\_git.exceptions
<a id="wrenn._git.exceptions.GitError"></a>
## GitError Objects
```python
class GitError(Exception)
```
Base exception for all git operations inside a capsule.
Not a subclass of :class:`WrennError` because git errors originate
from a process exit code, not an HTTP response.
**Attributes**:
- `message` _str_ - Human-readable error description.
- `stderr` _str_ - Raw stderr output from the git process.
- `exit_code` _int_ - Process exit code.
<a id="wrenn._git.exceptions.GitCommandError"></a>
## GitCommandError Objects
```python
class GitCommandError(GitError)
```
A git command exited with a non-zero exit code.
<a id="wrenn._git.exceptions.GitAuthError"></a>
## GitAuthError Objects
```python
class GitAuthError(GitError)
```
Authentication failed when communicating with a remote.
<a id="wrenn._git"></a>
# wrenn.\_git
Git operations inside a Wrenn capsule.
Provides :class:`Git` (sync) and :class:`AsyncGit` (async) interfaces
accessed via ``capsule.git``. All operations execute the real ``git``
binary inside the capsule through :class:`~wrenn.commands.Commands`.
<a id="wrenn._git.Git"></a>
## Git Objects
```python
class Git()
```
Sync git interface. Accessed via ``capsule.git``.
Executes the real ``git`` binary inside the capsule through
:meth:`Commands.run`. Methods raise :class:`GitCommandError` (or
:class:`GitAuthError`) on non-zero exit codes.
<a id="wrenn._git.Git.clone"></a>
#### clone
```python
def clone(url: str,
dest: str | None = None,
*,
branch: str | None = None,
depth: int | None = None,
username: str | None = None,
password: str | None = None,
dangerously_store_credentials: bool = False,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 300) -> CommandResult
```
Clone a remote repository into the capsule.
**Arguments**:
- `url` - Remote repository URL.
- `dest` - Destination path. Defaults to the repository name
derived from the URL.
- `branch` - Branch or tag to check out.
- `depth` - Create a shallow clone with this many commits.
- `username` - Username for HTTP(S) authentication.
- `password` - Password or token for HTTP(S) authentication.
- `dangerously_store_credentials` - If ``True``, leave credentials
embedded in the remote URL after cloning.
- `cwd` - Working directory for the command.
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds. Defaults to ``300``.
**Returns**:
Command result with stdout, stderr, exit_code, and duration.
**Raises**:
- `GitAuthError` - If the remote rejected authentication.
- `GitCommandError` - If clone failed for another reason.
- `ValueError` - If *password* is provided without *username*.
<a id="wrenn._git.Git.init"></a>
#### init
```python
def init(path: str = ".",
*,
bare: bool = False,
initial_branch: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Initialize a new git repository.
**Arguments**:
- `path` - Destination path for the repository.
- `bare` - Create a bare repository.
- `initial_branch` - Name for the initial branch (e.g. ``"main"``).
- `cwd` - Working directory for the command.
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If init failed.
<a id="wrenn._git.Git.add"></a>
#### add
```python
def add(paths: list[str] | None = None,
*,
all: bool = False,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Stage files for commit.
**Arguments**:
- `paths` - Specific files to stage. If ``None``, stages the
current directory (or all with ``all=True``).
- `all` - Stage all changes including untracked files.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If add failed.
<a id="wrenn._git.Git.commit"></a>
#### commit
```python
def commit(message: str,
*,
allow_empty: bool = False,
author_name: str | None = None,
author_email: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Create a commit.
**Arguments**:
- `message` - Commit message.
- `allow_empty` - Allow creating a commit with no changes.
- `author_name` - Override the commit author name.
- `author_email` - Override the commit author email.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If commit failed.
<a id="wrenn._git.Git.push"></a>
#### push
```python
def push(remote: str = "origin",
branch: str | None = None,
*,
force: bool = False,
set_upstream: bool = False,
username: str | None = None,
password: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 60) -> CommandResult
```
Push commits to a remote.
**Arguments**:
- `remote` - Remote name. Defaults to ``"origin"``.
- `branch` - Branch to push. Defaults to the current branch.
- `force` - Force-push.
- `set_upstream` - Set upstream tracking reference.
- `username` - Username for HTTP(S) authentication.
- `password` - Password or token for HTTP(S) authentication.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitAuthError` - If authentication failed.
- `GitCommandError` - If push failed.
<a id="wrenn._git.Git.pull"></a>
#### pull
```python
def pull(remote: str = "origin",
branch: str | None = None,
*,
rebase: bool = False,
ff_only: bool = False,
username: str | None = None,
password: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 60) -> CommandResult
```
Pull changes from a remote.
**Arguments**:
- `remote` - Remote name. Defaults to ``"origin"``.
- `branch` - Branch to pull.
- `rebase` - Rebase instead of merge.
- `ff_only` - Only allow fast-forward merges.
- `username` - Username for HTTP(S) authentication.
- `password` - Password or token for HTTP(S) authentication.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitAuthError` - If authentication failed.
- `GitCommandError` - If pull failed.
<a id="wrenn._git.Git.status"></a>
#### status
```python
def status(*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> GitStatus
```
Get repository status.
**Arguments**:
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Parsed :class:`GitStatus` with branch info and file changes.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.branches"></a>
#### branches
```python
def branches(*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> list[GitBranch]
```
List local branches.
**Arguments**:
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
List of :class:`GitBranch`.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.create_branch"></a>
#### create\_branch
```python
def create_branch(name: str,
*,
start_point: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Create and check out a new branch.
**Arguments**:
- `name` - Branch name.
- `start_point` - Commit or ref to branch from.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.checkout_branch"></a>
#### checkout\_branch
```python
def checkout_branch(name: str,
*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Check out an existing branch.
**Arguments**:
- `name` - Branch name.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.delete_branch"></a>
#### delete\_branch
```python
def delete_branch(name: str,
*,
force: bool = False,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Delete a branch.
**Arguments**:
- `name` - Branch name.
- `force` - Force-delete with ``-D``.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.remote_add"></a>
#### remote\_add
```python
def remote_add(name: str,
url: str,
*,
fetch: bool = False,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Add a remote.
**Arguments**:
- `name` - Remote name (e.g. ``"origin"``).
- `url` - Remote URL.
- `fetch` - Fetch after adding.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.remote_get"></a>
#### remote\_get
```python
def remote_get(name: str = "origin",
*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> str | None
```
Get the URL of a remote.
Returns ``None`` if the remote does not exist rather than raising.
**Arguments**:
- `name` - Remote name. Defaults to ``"origin"``.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Remote URL or ``None``.
<a id="wrenn._git.Git.reset"></a>
#### reset
```python
def reset(*,
mode: str | None = None,
ref: str | None = None,
paths: list[str] | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Reset the current HEAD.
**Arguments**:
- `mode` - Reset mode (``soft``, ``mixed``, ``hard``, ``merge``,
``keep``).
- `ref` - Commit, branch, or ref to reset to.
- `paths` - Paths to reset.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.restore"></a>
#### restore
```python
def restore(paths: list[str],
*,
staged: bool = False,
worktree: bool = False,
source: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Restore working-tree files or unstage changes.
**Arguments**:
- `paths` - Paths to restore.
- `staged` - Restore the index (unstage).
- `worktree` - Restore working-tree files.
- `source` - Commit or ref to restore from.
- `cwd` - Working directory (repository root).
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.set_config"></a>
#### set\_config
```python
def set_config(key: str,
value: str,
*,
scope: str = "local",
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Set a git config value.
**Arguments**:
- `key` - Config key (e.g. ``"user.name"``).
- `value` - Config value.
- `scope` - Config scope: ``"local"``, ``"global"``, or
``"system"``.
- `cwd` - Working directory (repository root). Required when
scope is ``"local"``.
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Command result.
**Raises**:
- `GitCommandError` - If the command failed.
<a id="wrenn._git.Git.get_config"></a>
#### get\_config
```python
def get_config(key: str,
*,
scope: str = "local",
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> str | None
```
Get a git config value.
Returns ``None`` if the key is not set rather than raising.
**Arguments**:
- `key` - Config key (e.g. ``"user.name"``).
- `scope` - Config scope: ``"local"``, ``"global"``, or
``"system"``.
- `cwd` - Working directory (repository root). Required when
scope is ``"local"``.
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Returns**:
Config value or ``None``.
<a id="wrenn._git.Git.configure_user"></a>
#### configure\_user
```python
def configure_user(name: str,
email: str,
*,
scope: str = "global",
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> None
```
Configure git user name and email.
**Arguments**:
- `name` - Git user name.
- `email` - Git user email.
- `scope` - Config scope. Defaults to ``"global"``.
- `cwd` - Working directory (repository root). Required when
scope is ``"local"``.
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Raises**:
- `ValueError` - If *name* or *email* is empty.
- `GitCommandError` - If a config command failed.
<a id="wrenn._git.Git.dangerously_authenticate"></a>
#### dangerously\_authenticate
```python
def dangerously_authenticate(username: str,
password: str,
host: str = "github.com",
protocol: str = "https",
*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> None
```
Persist git credentials via the credential store.
.. warning::
Credentials are written in plain text to the capsule
filesystem and are accessible to any process running inside
the capsule. Prefer per-operation ``username``/``password``
parameters on :meth:`clone`, :meth:`push`, and :meth:`pull`
instead.
**Arguments**:
- `username` - Git username.
- `password` - Password or personal access token.
- `host` - Target host. Defaults to ``"github.com"``.
- `protocol` - Protocol. Defaults to ``"https"``.
- `cwd` - Working directory.
- `envs` - Extra environment variables.
- `timeout` - Command timeout in seconds.
**Raises**:
- `ValueError` - If *username* or *password* is empty.
- `GitCommandError` - If a command failed.
<a id="wrenn._git.AsyncGit"></a>
## AsyncGit Objects
```python
class AsyncGit()
```
Async git interface. Accessed via ``capsule.git``.
Async mirror of :class:`Git`. See that class for full method
documentation.
<a id="wrenn._git.AsyncGit.clone"></a>
#### clone
```python
async def clone(url: str,
dest: str | None = None,
*,
branch: str | None = None,
depth: int | None = None,
username: str | None = None,
password: str | None = None,
dangerously_store_credentials: bool = False,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 300) -> CommandResult
```
Clone a remote repository into the capsule.
<a id="wrenn._git.AsyncGit.init"></a>
#### init
```python
async def init(path: str = ".",
*,
bare: bool = False,
initial_branch: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Initialize a new git repository.
<a id="wrenn._git.AsyncGit.add"></a>
#### add
```python
async def add(paths: list[str] | None = None,
*,
all: bool = False,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Stage files for commit.
<a id="wrenn._git.AsyncGit.commit"></a>
#### commit
```python
async def commit(message: str,
*,
allow_empty: bool = False,
author_name: str | None = None,
author_email: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Create a commit.
<a id="wrenn._git.AsyncGit.push"></a>
#### push
```python
async def push(remote: str = "origin",
branch: str | None = None,
*,
force: bool = False,
set_upstream: bool = False,
username: str | None = None,
password: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 60) -> CommandResult
```
Push commits to a remote.
<a id="wrenn._git.AsyncGit.pull"></a>
#### pull
```python
async def pull(remote: str = "origin",
branch: str | None = None,
*,
rebase: bool = False,
ff_only: bool = False,
username: str | None = None,
password: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 60) -> CommandResult
```
Pull changes from a remote.
<a id="wrenn._git.AsyncGit.status"></a>
#### status
```python
async def status(*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> GitStatus
```
Get repository status.
<a id="wrenn._git.AsyncGit.branches"></a>
#### branches
```python
async def branches(*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> list[GitBranch]
```
List local branches.
<a id="wrenn._git.AsyncGit.create_branch"></a>
#### create\_branch
```python
async def create_branch(name: str,
*,
start_point: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Create and check out a new branch.
<a id="wrenn._git.AsyncGit.checkout_branch"></a>
#### checkout\_branch
```python
async def checkout_branch(name: str,
*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Check out an existing branch.
<a id="wrenn._git.AsyncGit.delete_branch"></a>
#### delete\_branch
```python
async def delete_branch(name: str,
*,
force: bool = False,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Delete a branch.
<a id="wrenn._git.AsyncGit.remote_add"></a>
#### remote\_add
```python
async def remote_add(name: str,
url: str,
*,
fetch: bool = False,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Add a remote.
<a id="wrenn._git.AsyncGit.remote_get"></a>
#### remote\_get
```python
async def remote_get(name: str = "origin",
*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> str | None
```
Get the URL of a remote. Returns ``None`` if not found.
<a id="wrenn._git.AsyncGit.reset"></a>
#### reset
```python
async def reset(*,
mode: str | None = None,
ref: str | None = None,
paths: list[str] | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Reset the current HEAD.
<a id="wrenn._git.AsyncGit.restore"></a>
#### restore
```python
async def restore(paths: list[str],
*,
staged: bool = False,
worktree: bool = False,
source: str | None = None,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Restore working-tree files or unstage changes.
<a id="wrenn._git.AsyncGit.set_config"></a>
#### set\_config
```python
async def set_config(key: str,
value: str,
*,
scope: str = "local",
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> CommandResult
```
Set a git config value.
<a id="wrenn._git.AsyncGit.get_config"></a>
#### get\_config
```python
async def get_config(key: str,
*,
scope: str = "local",
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> str | None
```
Get a git config value. Returns ``None`` if not set.
<a id="wrenn._git.AsyncGit.configure_user"></a>
#### configure\_user
```python
async def configure_user(name: str,
email: str,
*,
scope: str = "global",
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> None
```
Configure git user name and email.
<a id="wrenn._git.AsyncGit.dangerously_authenticate"></a>
#### dangerously\_authenticate
```python
async def dangerously_authenticate(username: str,
password: str,
host: str = "github.com",
protocol: str = "https",
*,
cwd: str | None = None,
envs: dict[str, str] | None = None,
timeout: int | None = 30) -> None
```
Persist git credentials via the credential store.
.. warning::
Credentials are written in plain text to the capsule
filesystem. Prefer per-operation ``username``/``password``
parameters instead.