From 126791a504a9c13692364795a611e61f18714e96 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 25 Feb 2026 16:17:02 +0100 Subject: [PATCH 1/2] fix: add implicit limit to sandbox list --- .changeset/plenty-onions-do.md | 5 ++++ packages/cli/src/commands/sandbox/list.ts | 33 ++++++++++++++++++----- 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 .changeset/plenty-onions-do.md diff --git a/.changeset/plenty-onions-do.md b/.changeset/plenty-onions-do.md new file mode 100644 index 0000000000..1ed31d5fdf --- /dev/null +++ b/.changeset/plenty-onions-do.md @@ -0,0 +1,5 @@ +--- +'@e2b/cli': patch +--- + +Add implicit limit for sandbox list query to CLI diff --git a/packages/cli/src/commands/sandbox/list.ts b/packages/cli/src/commands/sandbox/list.ts index 1e9c47419e..a16f900d34 100644 --- a/packages/cli/src/commands/sandbox/list.ts +++ b/packages/cli/src/commands/sandbox/list.ts @@ -5,6 +5,9 @@ import { components, Sandbox, SandboxInfo } from 'e2b' import { ensureAPIKey } from 'src/api' import { parseMetadata } from './utils' +const DEFAULT_LIMIT = 1000 +const PAGE_LIMIT = 100 + function getStateTitle(state?: components['schemas']['SandboxState'][]) { if (state?.length === 1) { if (state?.includes('running')) return 'Running sandboxes' @@ -24,7 +27,7 @@ export const listCommand = new commander.Command('list') .option('-m, --metadata ', 'filter by metadata, eg. key1=value1') .option( '-l, --limit ', - 'limit the number of sandboxes returned', + `limit the number of sandboxes returned (default: ${DEFAULT_LIMIT}, 0 for no limit)`, (value) => parseInt(value) ) .option('-f, --format ', 'output format, eg. json, pretty') @@ -32,14 +35,21 @@ export const listCommand = new commander.Command('list') try { const state = options.state || ['running'] const format = options.format || 'pretty' - const sandboxes = await listSandboxes({ - limit: options.limit, + const limit = + options.limit === 0 ? undefined : (options.limit ?? DEFAULT_LIMIT) + const { sandboxes, hasMore } = await listSandboxes({ + limit, state, metadataRaw: options.metadata, }) if (format === 'pretty') { renderTable(sandboxes, state) + if (hasMore) { + console.log( + `Showing first ${limit} sandboxes. Use --limit to change.` + ) + } } else if (format === 'json') { console.log(JSON.stringify(sandboxes, null, 2)) } else { @@ -130,17 +140,22 @@ type ListSandboxesOptions = { metadataRaw?: string } +type ListSandboxesResult = { + sandboxes: SandboxInfo[] + hasMore: boolean +} + export async function listSandboxes({ limit, state, metadataRaw, -}: ListSandboxesOptions = {}): Promise { +}: ListSandboxesOptions = {}): Promise { const apiKey = ensureAPIKey() const metadata = parseMetadata(metadataRaw) let pageLimit = limit - if (!limit || limit > 100) { - pageLimit = 100 + if (!limit || limit > PAGE_LIMIT) { + pageLimit = PAGE_LIMIT } let remainingLimit = limit @@ -160,5 +175,9 @@ export async function listSandboxes({ } } - return sandboxes + return { + sandboxes: limit ? sandboxes.slice(0, limit) : sandboxes, + // We can't change the page size during iteration, so we may have to check if we have more sandboxes than the limit + hasMore: iterator.hasNext || (limit ? sandboxes.length > limit : false), + } } From 406b52bd464c69467b08c50e56dd2cf6e1e2c7f8 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 25 Feb 2026 16:36:31 +0100 Subject: [PATCH 2/2] fix: issue with remaining limit being 0 --- packages/cli/src/commands/sandbox/list.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/cli/src/commands/sandbox/list.ts b/packages/cli/src/commands/sandbox/list.ts index a16f900d34..6e779f3ca7 100644 --- a/packages/cli/src/commands/sandbox/list.ts +++ b/packages/cli/src/commands/sandbox/list.ts @@ -158,7 +158,6 @@ export async function listSandboxes({ pageLimit = PAGE_LIMIT } - let remainingLimit = limit const sandboxes: SandboxInfo[] = [] const iterator = Sandbox.list({ apiKey: apiKey, @@ -166,13 +165,9 @@ export async function listSandboxes({ query: { state, metadata }, }) - while (iterator.hasNext && (!remainingLimit || remainingLimit > 0)) { + while (iterator.hasNext && (!limit || sandboxes.length < limit)) { const batch = await iterator.nextItems() sandboxes.push(...batch) - - if (limit && remainingLimit) { - remainingLimit -= batch.length - } } return {