fix(sandbox): add workflow serialization support for Snapshot class#140
Merged
LukeSheard merged 1 commit intomainfrom Apr 14, 2026
Merged
fix(sandbox): add workflow serialization support for Snapshot class#140LukeSheard merged 1 commit intomainfrom
LukeSheard merged 1 commit intomainfrom
Conversation
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.
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
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_DESERIALIZEstatic methods toSnapshot, serializing onlySnapshotMetadataand lazily recreating the API client viaensureClient()when needed. - Updated
Snapshotinstance 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
approved these changes
Apr 14, 2026
Merged
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZEstatic methods to theSnapshotclass, fixing serialization errors when aSnapshotinstance is returned from a workflow step.SandboxandCommand: only plainSnapshotMetadatais serialized (credentials are excluded), and an API client is lazily created viaensureClient()when needed after deserialization.dehydrate/hydratethrough the workflow runtime pipeline.