Skip to content

fix(sandbox): add workflow serialization support for Snapshot class#140

Merged
LukeSheard merged 1 commit intomainfrom
fix/snapshot-workflow-serialization
Apr 14, 2026
Merged

fix(sandbox): add workflow serialization support for Snapshot class#140
LukeSheard merged 1 commit intomainfrom
fix/snapshot-workflow-serialization

Conversation

@TooTallNate
Copy link
Copy Markdown
Member

Summary

  • Adds WORKFLOW_SERIALIZE / WORKFLOW_DESERIALIZE static methods to the Snapshot class, fixing serialization errors when a Snapshot instance is returned from a workflow step.
  • Uses the same lazy-client pattern as Sandbox and Command: only plain SnapshotMetadata is serialized (credentials are excluded), and an API client is lazily created via ensureClient() when needed after deserialization.
  • Includes 10 tests covering serialize/deserialize roundtrips, credential exclusion, and full dehydrate/hydrate through the workflow runtime pipeline.

Snapshot instances returned from workflow steps failed serialization
because the class lacked WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE methods.
Add these methods following the same lazy-client pattern used by Sandbox
and Command, ensuring credentials are never serialized.
Copilot AI review requested due to automatic review settings April 8, 2026 16:31
@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Apr 8, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
sandbox Ready Ready Preview, Comment, Open in v0 Apr 8, 2026 4:32pm
sandbox-cli Ready Ready Preview, Comment, Open in v0 Apr 8, 2026 4:32pm
sandbox-sdk Ready Ready Preview, Comment, Open in v0 Apr 8, 2026 4:32pm
sandbox-sdk-ai-example Ready Ready Preview, Comment, Open in v0 Apr 8, 2026 4:32pm
workflow-code-runner Ready Ready Preview, Comment, Open in v0 Apr 8, 2026 4:32pm

Request Review

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds workflow runtime serialization/deserialization support for Snapshot instances in @vercel/sandbox, aligning Snapshot with the existing Sandbox/Command lazy-client pattern so snapshots can safely cross workflow/step boundaries without serializing credentials.

Changes:

  • Added WORKFLOW_SERIALIZE / WORKFLOW_DESERIALIZE static methods to Snapshot, serializing only SnapshotMetadata and lazily recreating the API client via ensureClient() when needed.
  • Updated Snapshot instance methods to use the lazy client initialization path (so deserialized instances still work for API calls).
  • Added a dedicated Vitest suite covering roundtrips, credential exclusion, and workflow runtime pipeline hydration/dehydration.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
packages/vercel-sandbox/src/snapshot.ts Implements workflow serde hooks and lazy client initialization for deserialized Snapshot instances.
packages/vercel-sandbox/src/snapshot.serialize.test.ts Adds integration + unit tests for Snapshot serialization behavior and runtime step-boundary roundtrips.
packages/vercel-sandbox/src/index.ts Re-exports SerializedSnapshot type for consumers.
.changeset/snapshot-workflow-serialization.md Adds a patch changeset documenting the serialization fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@LukeSheard LukeSheard merged commit 3fbabb9 into main Apr 14, 2026
18 checks passed
@LukeSheard LukeSheard deleted the fix/snapshot-workflow-serialization branch April 14, 2026 17:02
@github-actions github-actions Bot mentioned this pull request Apr 14, 2026
Schniz added a commit that referenced this pull request Apr 14, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @vercel/sandbox@1.10.0

### Minor Changes

- Expose Filesystem api from Sandbox
([#112](#112))

### Patch Changes

- Reuse Undici `Agent` across instances
([#143](#143))

- Smarter fallback team selection for scope inference: tries
`defaultTeamId` first, then the best hobby-plan OWNER team (personal
team or most recently updated). Filters fallback candidates by
`billing.plan === 'hobby'` to avoid selecting pro/enterprise teams.
Skips teams that return 403 and shows a helpful error when no team
allows sandbox creation.
([#120](#120))

- Add workflow serialization support for the `Snapshot` class via
`WORKFLOW_SERIALIZE` / `WORKFLOW_DESERIALIZE`, fixing serialization
errors when a `Snapshot` instance is returned from a workflow step.
([#140](#140))

## sandbox@2.5.10

### Patch Changes

- Smarter fallback team selection for scope inference: tries
`defaultTeamId` first, then the best hobby-plan OWNER team (personal
team or most recently updated). Filters fallback candidates by
`billing.plan === 'hobby'` to avoid selecting pro/enterprise teams.
Skips teams that return 403 and shows a helpful error when no team
allows sandbox creation.
([#120](#120))

- Updated dependencies
\[[`9dc0ac96d1d531b5a44786c92d6ddc2ce4890791`](9dc0ac9),
[`494c2ddae5899b7f793cbd906a2a62260bd08885`](494c2dd),
[`3fbabb95946771e41d8b17b7f8cb8d2972beba25`](3fbabb9),
[`42515e1ede4468fad204e5332ade0ee5d8dce3e5`](42515e1)]:
    -   @vercel/sandbox@1.10.0

## sandbox-filesystem-snapshots@0.0.15

### Patch Changes

- Updated dependencies
\[[`9dc0ac96d1d531b5a44786c92d6ddc2ce4890791`](9dc0ac9),
[`494c2ddae5899b7f793cbd906a2a62260bd08885`](494c2dd),
[`3fbabb95946771e41d8b17b7f8cb8d2972beba25`](3fbabb9),
[`42515e1ede4468fad204e5332ade0ee5d8dce3e5`](42515e1)]:
    -   @vercel/sandbox@1.10.0

## workflow-code-runner@0.1.4

### Patch Changes

- Updated dependencies
\[[`9dc0ac96d1d531b5a44786c92d6ddc2ce4890791`](9dc0ac9),
[`494c2ddae5899b7f793cbd906a2a62260bd08885`](494c2dd),
[`3fbabb95946771e41d8b17b7f8cb8d2972beba25`](3fbabb9),
[`42515e1ede4468fad204e5332ade0ee5d8dce3e5`](42515e1)]:
    -   @vercel/sandbox@1.10.0

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Gal Schlezinger <gal@spitfire.co.il>
marc-vercel pushed a commit that referenced this pull request Apr 17, 2026
…140)

## Summary

- Adds `WORKFLOW_SERIALIZE` / `WORKFLOW_DESERIALIZE` static methods to
the `Snapshot` class, fixing serialization errors when a `Snapshot`
instance is returned from a workflow step.
- Uses the same lazy-client pattern as `Sandbox` and `Command`: only
plain `SnapshotMetadata` is serialized (credentials are excluded), and
an API client is lazily created via `ensureClient()` when needed after
deserialization.
- Includes 10 tests covering serialize/deserialize roundtrips,
credential exclusion, and full `dehydrate`/`hydrate` through the
workflow runtime pipeline.
marc-vercel pushed a commit that referenced this pull request Apr 17, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.

- Expose Filesystem api from Sandbox
([#112](#112))

- Reuse Undici `Agent` across instances
([#143](#143))

- Smarter fallback team selection for scope inference: tries
`defaultTeamId` first, then the best hobby-plan OWNER team (personal
team or most recently updated). Filters fallback candidates by
`billing.plan === 'hobby'` to avoid selecting pro/enterprise teams.
Skips teams that return 403 and shows a helpful error when no team
allows sandbox creation.
([#120](#120))

- Add workflow serialization support for the `Snapshot` class via
`WORKFLOW_SERIALIZE` / `WORKFLOW_DESERIALIZE`, fixing serialization
errors when a `Snapshot` instance is returned from a workflow step.
([#140](#140))

- Smarter fallback team selection for scope inference: tries
`defaultTeamId` first, then the best hobby-plan OWNER team (personal
team or most recently updated). Filters fallback candidates by
`billing.plan === 'hobby'` to avoid selecting pro/enterprise teams.
Skips teams that return 403 and shows a helpful error when no team
allows sandbox creation.
([#120](#120))

- Updated dependencies
\[[`9dc0ac96d1d531b5a44786c92d6ddc2ce4890791`](9dc0ac9),
[`494c2ddae5899b7f793cbd906a2a62260bd08885`](494c2dd),
[`3fbabb95946771e41d8b17b7f8cb8d2972beba25`](3fbabb9),
[`42515e1ede4468fad204e5332ade0ee5d8dce3e5`](42515e1)]:
    -   @vercel/sandbox@1.10.0

- Updated dependencies
\[[`9dc0ac96d1d531b5a44786c92d6ddc2ce4890791`](9dc0ac9),
[`494c2ddae5899b7f793cbd906a2a62260bd08885`](494c2dd),
[`3fbabb95946771e41d8b17b7f8cb8d2972beba25`](3fbabb9),
[`42515e1ede4468fad204e5332ade0ee5d8dce3e5`](42515e1)]:
    -   @vercel/sandbox@1.10.0

- Updated dependencies
\[[`9dc0ac96d1d531b5a44786c92d6ddc2ce4890791`](9dc0ac9),
[`494c2ddae5899b7f793cbd906a2a62260bd08885`](494c2dd),
[`3fbabb95946771e41d8b17b7f8cb8d2972beba25`](3fbabb9),
[`42515e1ede4468fad204e5332ade0ee5d8dce3e5`](42515e1)]:
    -   @vercel/sandbox@1.10.0

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Gal Schlezinger <gal@spitfire.co.il>
marc-vercel added a commit that referenced this pull request Apr 20, 2026
…156)

Rebase from main the latest commits.

```
 ┌─────┬─────────┬────────────────────────────────────────────────────────────────────────────┐
  │  #  │ Commit  │                                   Title                                    │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 1   │ ac34694 │ chore(sandbox): fix the CLI tests (#139)                                   │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 2   │ 9dc0ac9 │ perf(sdk): re-use Undici Agent across instances (#143)                     │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 3   │ 3fbabb9 │ fix(sandbox): add workflow serialization support for Snapshot class (#140) │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 4   │ 42515e1 │ Add node:fs implementation on Sandbox (#112)                               │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 5   │ 494c2dd │ fix: smarter fallback team selection for scope inference (#120)            │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 6   │ 468731a │ chore: fix manually written changeset definition (#148)                    │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 7   │ ad18eca │ Version Packages (#144)                                                    │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 8   │ 747a689 │ feat(docs): add clarification for vCPUs on enterprise (#149)               │
  ├─────┼─────────┼────────────────────────────────────────────────────────────────────────────┤
  │ 9   │ a6394a4 │ [packages/sandbox] improve timeout values and hour format (#150)           │
  └─────┴─────────┴────────────────────────────────────────────────────────────────────────────┘
```

---------

Co-authored-by: Tom Lienard <tom.lienrd@gmail.com>
Co-authored-by: Nathan Rajlich <n@n8.io>
Co-authored-by: LukePS <LukeSheard@users.noreply.github.com>
Co-authored-by: Gregor Martynus <39992+gr2m@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Gal Schlezinger <gal@spitfire.co.il>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Andy <76787794+AndyW22@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants