Skip to content

v0.8.0: Merge pull request #138 from pandemicsyn/changeset-release/main

Choose a tag to compare

@github-actions github-actions released this 07 Nov 19:12
48c262d

Beachside v0.8.0

@beachside/adapter

Minor Changes

  • #148 29f6896 Thanks @pandemicsyn! - Add snapshotSuite to @beachside/adapter/testing: a shared snapshot conformance check (exact preserve plan, capture matches plan, saved reference reopens, restore into a new sandbox with the captured files, listing or an UNSUPPORTED list, and deletion) that adapter authors run against their fixtures through the public client.

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

  • #136 4a074ab Thanks @pandemicsyn! - Add Preserve constants (Preserve.FILESYSTEM, Preserve.FILESYSTEM_AND_MEMORY) for choosing what snapshots and suspension keep. E2B accepts snapshots: { preserve } for filesystem-only captures, and lifecycle.suspension.preserve is now an exact choice: Preserve.FILESYSTEM pauses without memory, and resumes from disk only, so resume() reports fresh execution. Previously a filesystem setting on E2B still kept memory. E2B snapshots listed without Beachside history now report unknown preservation instead of assuming memory. snapshots.list(), volumes.list() and images.list() now default to a page of 50 when called without a limit.

beachside

Minor Changes

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

  • #136 4a074ab Thanks @pandemicsyn! - Add Preserve constants (Preserve.FILESYSTEM, Preserve.FILESYSTEM_AND_MEMORY) for choosing what snapshots and suspension keep. E2B accepts snapshots: { preserve } for filesystem-only captures, and lifecycle.suspension.preserve is now an exact choice: Preserve.FILESYSTEM pauses without memory, and resumes from disk only, so resume() reports fresh execution. Previously a filesystem setting on E2B still kept memory. E2B snapshots listed without Beachside history now report unknown preservation instead of assuming memory. snapshots.list(), volumes.list() and images.list() now default to a page of 50 when called without a limit.

Patch Changes

@beachside/daytona

Minor Changes

  • #148 29f6896 Thanks @pandemicsyn! - Accept snapshots: { preserve } on the Daytona adapter. Preserve.FILESYSTEM_AND_MEMORY takes hot snapshots of running Linux VMs (includeMemory: true): the VM keeps running and a restored VM resumes the captured processes. Containers and stopped VMs reject before any change. Omitted or Preserve.FILESYSTEM keeps today's cold capture.

  • #134 3b62728 Thanks @pandemicsyn! - Daytona Linux VM sandboxes now support snapshot() (cold, filesystem-only capture, restored as a new Linux VM) and suspend()/resume() through native pause, which keeps files, memory and running processes. Containers are unchanged. lifecycle.suspension.preserve: "filesystem+memory" no longer rejects at connect: it pauses Linux VMs and rejects containers before any change, while "filesystem" stops Linux VMs instead of pausing them. inspect().idleStop reports Daytona's native Linux VM auto-pause.

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

Patch Changes

@beachside/e2b

Minor Changes

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

  • #136 4a074ab Thanks @pandemicsyn! - Add Preserve constants (Preserve.FILESYSTEM, Preserve.FILESYSTEM_AND_MEMORY) for choosing what snapshots and suspension keep. E2B accepts snapshots: { preserve } for filesystem-only captures, and lifecycle.suspension.preserve is now an exact choice: Preserve.FILESYSTEM pauses without memory, and resumes from disk only, so resume() reports fresh execution. Previously a filesystem setting on E2B still kept memory. E2B snapshots listed without Beachside history now report unknown preservation instead of assuming memory. snapshots.list(), volumes.list() and images.list() now default to a page of 50 when called without a limit.

Patch Changes

@beachside/boxd

Minor Changes

  • #142 228abf4 Thanks @pandemicsyn! - boxd accepts snapshots: { preserve } and lifecycle: { suspension: { preserve } } in setup. boxd snapshots and pauses always keep memory, so Preserve.FILESYSTEM_AND_MEMORY is accepted and Preserve.FILESYSTEM fails with UNSUPPORTED at connect, before any provider call.

  • #131 3064a65 Thanks @pandemicsyn! - boxd now supports snapshots: box.snapshot() captures memory and disk with a brief pause while the machine keeps running, snapshot.restore() resumes the captured processes in a new machine, and snapshots can be inspected, listed and deleted. Each capture gets its own boxd snapshot name and the reference pins the captured version, so a snapshot saved again outside Beachside fails with CONFLICT instead of restoring or deleting a different version. Machines with mounted disks cannot be captured, and restores keep the captured size and attach no disks.

  • #139 72898a9 Thanks @pandemicsyn! - Stream command output on boxd. box.processes.start({ output: { mode: "stream" } }) now delivers stdout and stderr as the command writes them, as text or exact bytes (format: "bytes"), and box.exec(input, { onOutput }) streams while returning the usual bounded capture. terminate() cancels the native exec call, which kills the command's process group. Incremental stdin, terminals, other signals, status checks and process reopening are not supported.

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

Patch Changes

@beachside/boat

Minor Changes

  • #147 0aa1ccf Thanks @pandemicsyn! - Boat snapshots: box.snapshot() saves the disk of a running or archived sandbox as a Boat named snapshot under a unique beachside-snapshot-* name, and client.snapshots inspects, lists, restores and deletes them. References pin the captured artifact, so a name saved again outside Beachside rejects with CONFLICT instead of restoring or deleting the new contents. Restores boot a fresh machine of the captured type. Setup accepts snapshots: { preserve } and lifecycle: { suspension: { preserve } }: Boat keeps the disk only, so Preserve.FILESYSTEM is accepted and Preserve.FILESYSTEM_AND_MEMORY fails with UNSUPPORTED at connect, before any provider call.

  • #144 a2556c0 Thanks @pandemicsyn! - Stream command output on Boat. box.processes.start({ output: { mode: "stream" } }) starts the command detached, without Boat's 600-second limit, and delivers stdout and stderr as UTF-8 text as Boat sends it, reattaching from byte offsets when Boat ends a connection after 10 minutes. terminate() stops the command. Byte output, callback exec, piped stdin, terminals and reopening are not supported.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

Patch Changes

@beachside/runloop

Minor Changes

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

  • #145 6e83f0b Thanks @pandemicsyn! - Stream command output on Runloop. box.processes.start({ output: { mode: "stream" } }) delivers stdout and stderr as UTF-8 text from Runloop's server-sent log streams, reopening them from byte offsets, and terminate() kills the execution. Byte output, callback exec, piped stdin, terminals and reopening are not supported. Not yet tested against the live service.

  • #148 29f6896 Thanks @pandemicsyn! - Accept the snapshots: { preserve } setup option on the Vercel and Runloop adapters, so the same setting works on every adapter with snapshots. Preserve.FILESYSTEM matches their filesystem-only snapshots; Preserve.FILESYSTEM_AND_MEMORY rejects at connect with UNSUPPORTED before any provider call.

Patch Changes

@beachside/modal

Minor Changes

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #143 f1d5c3f Thanks @pandemicsyn! - Accept the snapshots: { preserve } setup option on the Modal adapter. Preserve.FILESYSTEM matches Modal's filesystem snapshots; Preserve.FILESYSTEM_AND_MEMORY rejects at connect with UNSUPPORTED before any Modal call.

  • #132 2349b4d Thanks @pandemicsyn! - Add filesystem snapshots to the experimental Modal adapter. box.snapshot() captures the sandbox root filesystem as a Modal image with Modal's default 30-day retention, snapshot.restore() creates a new blocked-network sandbox from it, and snapshots.get(), inspect() and delete() work on saved references. Memory snapshots, directory snapshots and snapshots.list() are not supported: Modal has no snapshot listing API, so keep the returned references.

  • #141 82b2eaf Thanks @pandemicsyn! - Stream command output on Modal. box.processes.start({ output: { mode: "stream" } }) delivers stdout and stderr as the command writes them, as text or exact bytes, accepts piped stdin, and supports signal("SIGTERM" | "SIGKILL") and terminate(). box.exec(input, { onOutput }) now works on Modal too. Signals reach the launched process through a PID recorded in /tmp, so the image needs /bin/sh, cat and kill. Terminals, status checks and process reopening are not supported.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

  • #148 29f6896 Thanks @pandemicsyn! - Add snapshots: { retentionSeconds } to the Vercel and Modal adapters to set how long snapshots are kept (0 keeps them until deleted). Vercel sends native expiration, counted from last use, and accepts it in disposable mode only. Modal sends ttlMs, counted from capture. snapshot({ retention: { minimumSeconds } }) is checked against the configured value.

Patch Changes

@beachside/vercel

Minor Changes

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

  • #148 29f6896 Thanks @pandemicsyn! - Add snapshots: { retentionSeconds } to the Vercel and Modal adapters to set how long snapshots are kept (0 keeps them until deleted). Vercel sends native expiration, counted from last use, and accepts it in disposable mode only. Modal sends ttlMs, counted from capture. snapshot({ retention: { minimumSeconds } }) is checked against the configured value.

  • #148 29f6896 Thanks @pandemicsyn! - Accept the snapshots: { preserve } setup option on the Vercel and Runloop adapters, so the same setting works on every adapter with snapshots. Preserve.FILESYSTEM matches their filesystem-only snapshots; Preserve.FILESYSTEM_AND_MEMORY rejects at connect with UNSUPPORTED before any provider call.

Patch Changes

@beachside/cli

Minor Changes

  • #135 16bf303 Thanks @pandemicsyn! - Add beachside adapter add, adapter ls and adapter rm to install, list and remove the adapters the CLI loads from ~/.config/beachside/adapters. Official adapters are pinned to the CLI's version and every install is checked for its adapter export; reruns with nothing to change skip npm.

  • #151 ba3630a Thanks @pandemicsyn! - Add create --retry <duration> and run --retry <duration>: keep retrying, with growing waits, while the provider refuses a create before any effect (rate limit, capacity, unavailable). Unknown outcomes are never retried.

  • #137 5fe4c39 Thanks @pandemicsyn! - Copy directories with beachside cp -r in both directions, and send a local working tree into a sandbox with beachside push <sandbox>[:/dir] [path] or beachside run --push <path>. In a git work tree, push sends tracked and unignored files only (--include-ignored sends everything); --exclude <glob> skips paths. Transfers move one tar archive and unpack it with one command, so they keep modes and symlinks, need tar in the sandbox, and work on every provider with exec and file access. Copying out never writes through symlinks or outside the destination.

  • #149 0e6341c Thanks @pandemicsyn! - Add beachside snapshot create|ls|inspect|rm|forget and create --snapshot / run --snapshot to capture a sandbox and start new sandboxes from it.

  • #133 8e93c63 Thanks @pandemicsyn! - beachside exec, sh and run now print output as it arrives on providers that stream process bytes (Daytona, E2B and Vercel). The CLI enforces --timeout for streaming commands and asks the provider to terminate them on timeout or Ctrl-C. Other providers, --json and the new --no-stream flag keep the buffered output.

  • #152 f9a0bb7 Thanks @pandemicsyn! - sandboxes.list() items now carry labels (the labels set at create, without adapter markers; null where the provider keeps none) and createdAt (the provider's creation time, or null). Daytona, E2B, Vercel and Modal report labels; Daytona, E2B (start time), Vercel, boxd and Runloop report creation time. Adapters add them with the new listedLabels and listedTime helpers. The CLI's ls --remote shows both, and the new beachside gc --label k=v [--older-than 2h] [--dry-run] destroys provider-listed sandboxes whose labels match, such as those a killed CI job left behind, and drops their store records. Durations also accept days, like 1d.

  • #146 e513d9a Thanks @pandemicsyn! - Set the sandbox lifetime the same way everywhere. Every adapter now takes lifecycle: { lifetimeSeconds } in setup, defaulting to 900 seconds; E2B, Vercel and Modal timeoutSeconds, Daytona ttlMinutes and boxd's top-level lifetimeSeconds still work but are deprecated. create({ lifecycle: { lifetimeSeconds } }) overrides it for one sandbox, and capabilities().lifetime reports the accepted range. The CLI adds create --ttl and run --ttl.

  • #156 47f5b61 Thanks @pandemicsyn! - Rename the project to Beachside. Packages are beachside and @beachside/*; the exports are Beachside, BeachsideClient, DirectBeachsideClient and BeachsideError; list coverage "sandbar-managed" is now "managed"; telemetry spans and attributes use beachside.*. The CLI command is beachside, with settings in ~/.config/beachside/beachside.json and BEACHSIDE_* environment variables. Labels, metadata and names written onto provider resources now use the beachside prefix, so resources created by earlier releases are no longer recognized.

  • #150 e566711 Thanks @pandemicsyn! - snapshot.restore() takes the create options env, labels and lifecycle: { lifetimeSeconds }. Adapters declare which they apply in snapshotRestore.options (shown in capabilities().snapshots.restore); anything else rejects before allocation. The CLI now accepts --env, --label and --ttl with --snapshot.

Patch Changes