From d132f63d05f1c189cb71bd43b56a013e337d1541 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Thu, 13 Aug 2026 16:54:59 -0700 Subject: [PATCH] feat(devboxes): use optimistic create endpoint --- src/resources/devboxes/devboxes.ts | 8 ++++++- tests/api-resources/devboxes/devboxes.test.ts | 22 ++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/resources/devboxes/devboxes.ts b/src/resources/devboxes/devboxes.ts index d81f2f84b..7e32a1e41 100644 --- a/src/resources/devboxes/devboxes.ts +++ b/src/resources/devboxes/devboxes.ts @@ -131,7 +131,13 @@ export class Devboxes extends APIResource { options?: LongPollRequestOptions, ): Promise { const { longPoll, polling, ...requestOptions } = options ?? {}; - const devbox = await this.create(body, requestOptions); + const devbox = (await this._client.post('/v1/devboxes/create_and_await_running', { + body: body ?? {}, + ...requestOptions, + })) as DevboxView; + if (devbox.status === 'running') { + return devbox; + } return this.awaitRunning(devbox.id, { ...requestOptions, longPoll, polling }); } /** diff --git a/tests/api-resources/devboxes/devboxes.test.ts b/tests/api-resources/devboxes/devboxes.test.ts index 9f547d3bf..1ad1d9ee3 100644 --- a/tests/api-resources/devboxes/devboxes.test.ts +++ b/tests/api-resources/devboxes/devboxes.test.ts @@ -716,7 +716,7 @@ describe('resource devboxes', () => { expect(mockPost).toHaveBeenCalledTimes(2); // Check create call - expect(mockPost).toHaveBeenNthCalledWith(1, '/v1/devboxes', { + expect(mockPost).toHaveBeenNthCalledWith(1, '/v1/devboxes/create_and_await_running', { body: { name: 'test-devbox' }, }); @@ -731,16 +731,28 @@ describe('resource devboxes', () => { mockPost.mockRestore(); }); + test('createAndAwaitRunning: returns an optimistic running response without polling', async () => { + const mockPost = jest.spyOn(client.devboxes['_client'], 'post'); + mockPost.mockResolvedValueOnce({ id: 'new-devbox-id', status: 'running' }); + + const result = await client.devboxes.createAndAwaitRunning({ name: 'test-devbox' }); + + expect(result).toEqual({ id: 'new-devbox-id', status: 'running' }); + expect(mockPost).toHaveBeenCalledTimes(1); + expect(mockPost).toHaveBeenCalledWith('/v1/devboxes/create_and_await_running', { + body: { name: 'test-devbox' }, + }); + }); + test('createAndAwaitRunning: handles creation failure', async () => { const mockPost = jest.spyOn(client.devboxes['_client'], 'post'); - const createError = new Error('Creation failed'); - mockPost.mockRejectedValueOnce(createError); + const createError = new APIError(400, undefined, 'Creation failed', {}); + mockPost.mockRejectedValue(createError); await expect(client.devboxes.createAndAwaitRunning()).rejects.toThrow('Creation failed'); - expect(mockPost).toHaveBeenCalledTimes(1); - expect(mockPost).toHaveBeenCalledWith('/v1/devboxes', { body: {} }); + expect(mockPost).toHaveBeenCalledWith('/v1/devboxes/create_and_await_running', { body: {} }); mockPost.mockRestore(); });