Skip to content

zidane/contexts/daytona

A sandbox provider backed by Daytona.

import { … } from 'zidane/contexts/daytona'src/contexts/daytona.ts

Use createDaytonaProvider for a remote sandbox on Daytona. It returns a SandboxProvider that you wrap with createSandboxContext, needs the optional @daytona/sdk package, and reads DAYTONA_API_KEY when you pass no key. The other exports convert Daytona responses, build create parameters, wait for a new sandbox to answer and run the setup script before the first turn. See Execution contexts.

TypeScript
import { createSandboxContext } from 'zidane/contexts/sandbox'
import { createDaytonaProvider } from 'zidane/contexts/daytona'

const context = createSandboxContext(createDaytonaProvider({ cwd: '/home/daytona/project' }))
const handle = await context.spawn()
const result = await context.exec(handle, 'ls')
console.log(result.stdout)
await context.destroy(handle)

Functions#

createDaytonaProviderFunction#

Builds a SandboxProvider backed by Daytona. Requires the optional peer dependency @daytona/sdk.

TypeScript
function createDaytonaProvider(options?: DaytonaProviderOptions): SandboxProvider
Parameters
NameTypeDefaultDescription
options?DaytonaProviderOptions{}

API key, URL, target, snapshot, resources, environment and lifecycle settings.

Example
import { createDaytonaProvider } from 'zidane/contexts/daytona'
import { createSandboxContext } from 'zidane/contexts/sandbox'

const execution = createSandboxContext(
  createDaytonaProvider({ apiKey: process.env.DAYTONA_API_KEY, onDestroy: 'stop' }),
)

src/contexts/daytona.ts:289

normalizeDaytonaExecResultFunction#

Converts a Daytona execute response to an ExecResult. Falls back across the response fields for stdout and defaults the exit code to 0.

TypeScript
function normalizeDaytonaExecResult(response: DaytonaExecuteResponse): ExecResult
Parameters
NameTypeDescription
responseDaytonaExecuteResponse

Response of the Daytona process execute call.

src/contexts/daytona-sdk.ts:143

resolveDaytonaCreateParamsFunction#

Builds the parameters for creating a Daytona sandbox. Per-spawn sandboxConfig values win over the provider options, connection keys are dropped, and environment variables are merged. Returns undefined when nothing is set.

TypeScript
function resolveDaytonaCreateParams(
  sandboxConfig: Record<string, unknown>,
  options: DaytonaProviderOptions,
  envVars: Record<string, string> | undefined,
): DaytonaCreateParams | undefined
Parameters
NameTypeDescription
sandboxConfigRecord<string, unknown>

Per-spawn SpawnConfig.sandbox values.

optionsDaytonaProviderOptions

Provider options that supply defaults.

envVarsRecord<string, string> | undefined

Provider-level environment variables.

DaytonaCreateParams | undefined

src/contexts/daytona.ts:163

resolveDaytonaEnvFunction#

Merges the provider-level environment with the per-spawn environment, per-spawn winning on key conflicts. Returns undefined when the result is empty.

TypeScript
function resolveDaytonaEnv(
  optionEnv: Record<string, string> | undefined,
  perSpawnEnv: Record<string, string> | undefined,
): Record<string, string> | undefined
Parameters
NameTypeDescription
optionEnvRecord<string, string> | undefined

Environment from the provider options.

perSpawnEnvRecord<string, string> | undefined

Environment from the spawn config.

Record<string, string> | undefined

src/contexts/daytona-sdk.ts:130

runDaytonaPregameFunction#

Uploads a setup script to /tmp and runs it in the sandbox. Throws on a non-zero exit so the caller can tear the sandbox down.

TypeScript
function runDaytonaPregame(
  sandbox: DaytonaSandbox,
  logger: Logger,
  opts: { content: string; cwd?: string; envVars?: Record<string, string>; name: string },
): Promise<void>
Parameters
NameTypeDescription
sandboxDaytonaSandbox

Sandbox to run the script in.

loggerLogger

Logger for progress and failure lines.

opts{ content: string; cwd?: string; envVars?: Record<string, string>; name: string }

Script name, content, and optional cwd and envVars for the run.

Promise<void>

src/contexts/daytona.ts:242

waitForDaytonaReadyFunction#

Waits until a Daytona sandbox runs commands. Polls a trivial command and throws when the deadline passes, after running cleanupOnTimeout.

TypeScript
function waitForDaytonaReady(
  sandbox: DaytonaSandbox,
  logger: Logger,
  opts: DaytonaReadinessOptions,
): Promise<void>
Parameters
NameTypeDescription
sandboxDaytonaSandbox

Sandbox to probe.

loggerLogger

Logger for progress lines.

optsDaytonaReadinessOptions

Deadline and probe settings.

Promise<void>

src/contexts/daytona.ts:204

Interfaces#

DaytonaProviderOptionsInterface#

Options for createDaytonaProvider.

TypeScript
interface DaytonaProviderOptions
DaytonaProviderOptions properties
NameTypeDescription
apiKey?string

Daytona API key. Falls back to the DAYTONA_API_KEY env var when omitted.

apiUrl?string

Daytona API URL. Falls back to DAYTONA_API_URL, then Daytona's hosted default.

cwd?string

Default working directory, applied when a spawn doesn't set SpawnConfig.cwd.

env?Record<string, string>

Environment variables baked into the sandbox and re-sent on every command.

image?unknown

Daytona image/declarative builder input used when creating a fresh sandbox.

language?string

Runtime used for Daytona's code tooling. Shell execution works either way.

logger?Logger

Logger for provider-level lifecycle lines.

onDestroy?DaytonaOnDestroy

What to do with an owned sandbox on destroy:

  • 'delete' / 'kill' (default) — call sandbox.delete().
  • 'stop' / 'pause' — call sandbox.stop() so Daytona preserves state according to the runner's stop semantics.
  • 'archive' — stop, then archive for longer-term persistence.
  • 'leave' — make no API call.
ownAttached?boolean

Take ownership of an attached (sandboxId) sandbox's lifecycle, so destroy() applies onDestroy to it (stop / archive / delete) instead of leaving it running.

The intended caller is a durable host that owns the sandbox across invocations: mint it once, journal its id, re-attach via sandboxId on every replay/resume, and clean it up at the end of the logical run. Without this an attached sandbox can never be stopped/deleted through the provider — a leak for host-owned sandboxes. No effect when creating a fresh sandbox (those are always owned). Spawn-time failures (readiness timeout, pregame error) still never delete a pre-existing attached sandbox — only sandboxes this provider created are auto-cleaned on spawn failure.

Default: false.

pregame?{ content: string; name: string }

Setup script to upload and run once the sandbox is ready.

readinessTimeoutSeconds?number

Total deadline, in seconds, for the post-create readiness probe. Defaults to 60.

resources?DaytonaResources

Daytona sandbox resources.

sandboxId?string

Attach to a pre-existing sandbox by id or name instead of creating a fresh one. By default the provider treats attached sandboxes as externally owned and leaves them running on destroy/failure (set ownAttached to take over the lifecycle).

snapshot?string

Daytona snapshot used when creating a fresh sandbox. An attached sandbox built from a different snapshot is deleted and recreated from this one.

target?string

Daytona target / region. Falls back to DAYTONA_TARGET, then the org default.

src/contexts/daytona.ts:39

DaytonaReadinessOptionsInterface#

Options for waitForDaytonaReady.

TypeScript
interface DaytonaReadinessOptions
DaytonaReadinessOptions properties
NameTypeDescription
cleanupOnTimeout?() => Promise<void>

Optional cleanup for owned sandboxes that never become ready.

now?() => number

Clock source — injectable for deterministic tests.

sleep?(ms: number) => Promise<void>

Sleep between probes — injectable for deterministic tests.

timeoutSecondsnumber

Total deadline in seconds. <= 0 disables the probe entirely.

src/contexts/daytona.ts:108

Types#

DaytonaOnDestroyType#

What to do with an owned Daytona sandbox on destroy: delete, kill, stop, pause, archive or leave. See DaytonaProviderOptions.onDestroy.

TypeScript
type DaytonaOnDestroy = 'delete' | 'kill' | 'stop' | 'pause' | 'archive' | 'leave'

src/contexts/daytona.ts:36