Skip to content

Commit 049b89c

Browse files
fix(tunnels): allow tunnel removal (#8257)
1 parent 695a7d2 commit 049b89c

10 files changed

Lines changed: 21 additions & 45 deletions

File tree

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 117
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-3d441e9c2074aef7bd1e87b2ebfbe5c25e340084dbdfeed8a2e4dc9384561e3b.yml
3-
openapi_spec_hash: 250bfdf2c2270ade53c058419e23c5dc
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-64b2ded3d3cc58131c7ebf36c411f43c3d8dabae0b5b1edd65dd7dab307c54a1.yml
3+
openapi_spec_hash: 80fabb5e89a61299203113505a894dc2
44
config_hash: de99cfce88e2d1f02246dc6c2f43bc6c

api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ Methods:
139139
- <code title="post /v1/devboxes/{id}/keep_alive">client.devboxes.<a href="./src/resources/devboxes/devboxes.ts">keepAlive</a>(id) -> unknown</code>
140140
- <code title="get /v1/devboxes/disk_snapshots">client.devboxes.<a href="./src/resources/devboxes/devboxes.ts">listDiskSnapshots</a>({ ...params }) -> DevboxSnapshotViewsDiskSnapshotsCursorIDPage</code>
141141
- <code title="post /v1/devboxes/{id}/read_file_contents">client.devboxes.<a href="./src/resources/devboxes/devboxes.ts">readFileContents</a>(id, { ...params }) -> string</code>
142-
- <code title="post /v1/devboxes/{id}/remove_tunnel">client.devboxes.<a href="./src/resources/devboxes/devboxes.ts">removeTunnel</a>(id, { ...params }) -> unknown</code>
142+
- <code title="post /v1/devboxes/{id}/remove_tunnel">client.devboxes.<a href="./src/resources/devboxes/devboxes.ts">removeTunnel</a>(id) -> unknown</code>
143143
- <code title="post /v1/devboxes/{id}/resume">client.devboxes.<a href="./src/resources/devboxes/devboxes.ts">resume</a>(id) -> DevboxView</code>
144144
- <code title="get /v1/devboxes/{id}/usage">client.devboxes.<a href="./src/resources/devboxes/devboxes.ts">retrieveResourceUsage</a>(id) -> DevboxResourceUsageView</code>
145145
- <code title="post /v1/devboxes/{id}/shutdown">client.devboxes.<a href="./src/resources/devboxes/devboxes.ts">shutdown</a>(id, { ...params }) -> DevboxView</code>

src/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ import {
191191
DevboxListView,
192192
DevboxReadFileContentsParams,
193193
DevboxReadFileContentsResponse,
194-
DevboxRemoveTunnelParams,
195194
DevboxRemoveTunnelResponse,
196195
DevboxResourceUsageView,
197196
DevboxSendStdInRequest,
@@ -626,7 +625,6 @@ export declare namespace Runloop {
626625
type DevboxExecuteSyncParams as DevboxExecuteSyncParams,
627626
type DevboxListDiskSnapshotsParams as DevboxListDiskSnapshotsParams,
628627
type DevboxReadFileContentsParams as DevboxReadFileContentsParams,
629-
type DevboxRemoveTunnelParams as DevboxRemoveTunnelParams,
630628
type DevboxShutdownParams as DevboxShutdownParams,
631629
type DevboxSnapshotDiskParams as DevboxSnapshotDiskParams,
632630
type DevboxSnapshotDiskAsyncParams as DevboxSnapshotDiskAsyncParams,

src/resources/devboxes/devboxes.ts

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -400,17 +400,10 @@ export class Devboxes extends APIResource {
400400
}
401401

402402
/**
403-
* @deprecated Only works with legacy tunnels created via {@link createTunnel}.
404-
* V2 tunnels (from {@link enableTunnel}) remain active until devbox shutdown and cannot be removed.
405-
*
406-
* Remove a legacy tunnel from the devbox.
403+
* Remove an existing V2 tunnel from the Devbox.
407404
*/
408-
removeTunnel(
409-
id: string,
410-
body: DevboxRemoveTunnelParams,
411-
options?: Core.RequestOptions,
412-
): Core.APIPromise<unknown> {
413-
return this._client.post(`/v1/devboxes/${id}/remove_tunnel`, { body, ...options });
405+
removeTunnel(id: string, options?: Core.RequestOptions): Core.APIPromise<unknown> {
406+
return this._client.post(`/v1/devboxes/${id}/remove_tunnel`, options);
414407
}
415408

416409
/**
@@ -1396,13 +1389,6 @@ export interface DevboxReadFileContentsParams {
13961389
file_path: string;
13971390
}
13981391

1399-
export interface DevboxRemoveTunnelParams {
1400-
/**
1401-
* Devbox port that tunnel will expose.
1402-
*/
1403-
port: number;
1404-
}
1405-
14061392
export interface DevboxShutdownParams {
14071393
/**
14081394
* If true, force shutdown even if snapshots are in progress. Defaults to false.
@@ -1527,7 +1513,6 @@ export declare namespace Devboxes {
15271513
type DevboxExecuteSyncParams as DevboxExecuteSyncParams,
15281514
type DevboxListDiskSnapshotsParams as DevboxListDiskSnapshotsParams,
15291515
type DevboxReadFileContentsParams as DevboxReadFileContentsParams,
1530-
type DevboxRemoveTunnelParams as DevboxRemoveTunnelParams,
15311516
type DevboxShutdownParams as DevboxShutdownParams,
15321517
type DevboxSnapshotDiskParams as DevboxSnapshotDiskParams,
15331518
type DevboxSnapshotDiskAsyncParams as DevboxSnapshotDiskAsyncParams,

src/resources/devboxes/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export {
4343
type DevboxExecuteSyncParams,
4444
type DevboxListDiskSnapshotsParams,
4545
type DevboxReadFileContentsParams,
46-
type DevboxRemoveTunnelParams,
4746
type DevboxShutdownParams,
4847
type DevboxSnapshotDiskParams,
4948
type DevboxSnapshotDiskAsyncParams,

src/resources/devboxes/tools.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,10 @@ export class DevboxTools {
164164
remove_tunnel: createTool({
165165
name: 'remove_tunnel',
166166
description: 'Delete a tunnel',
167-
parameters: z.object({
168-
port: z.number().describe('The port of the tunnel to delete'),
169-
}),
170-
execute: async (params) => {
167+
parameters: z.object({}),
168+
execute: async () => {
171169
try {
172-
await this.devboxes.removeTunnel(devboxId, { port: params.port }, options);
170+
await this.devboxes.removeTunnel(devboxId, options);
173171
return 'Tunnel deleted successfully';
174172
} catch (error) {
175173
return `Failed to delete tunnel: ${error}`;

src/resources/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ export {
9292
type DevboxExecuteSyncParams,
9393
type DevboxListDiskSnapshotsParams,
9494
type DevboxReadFileContentsParams,
95-
type DevboxRemoveTunnelParams,
9695
type DevboxShutdownParams,
9796
type DevboxSnapshotDiskParams,
9897
type DevboxSnapshotDiskAsyncParams,

src/sdk/devbox.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import type {
77
DevboxAsyncExecutionDetailView,
88
DevboxSnapshotDiskParams,
99
DevboxEnableTunnelParams,
10-
DevboxRemoveTunnelParams,
1110
DevboxReadFileContentsParams,
1211
DevboxWriteFileContentsParams,
1312
DevboxDownloadFileParams,
@@ -139,15 +138,14 @@ export class DevboxNetOps {
139138
* @example
140139
* ```typescript
141140
* // Deprecated - only for legacy tunnels
142-
* await devbox.net.removeTunnel({ port: 8080 });
141+
* await devbox.net.removeTunnel();
143142
* ```
144143
*
145-
* @param {DevboxRemoveTunnelParams} params - Tunnel removal parameters including port
146144
* @param {Core.RequestOptions} [options] - Request options
147145
* @returns {Promise<DevboxRemoveTunnelResponse>} Tunnel removal result
148146
*/
149-
async removeTunnel(params: DevboxRemoveTunnelParams, options?: Core.RequestOptions) {
150-
return this.client.devboxes.removeTunnel(this.devboxId, params, options);
147+
async removeTunnel(options?: Core.RequestOptions) {
148+
return this.client.devboxes.removeTunnel(this.devboxId, options);
151149
}
152150
}
153151

tests/api-resources/devboxes/devboxes.test.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,8 @@ describe('resource devboxes', () => {
362362
const response = await client.devboxes.readFileContents('id', { file_path: 'file_path' });
363363
});
364364

365-
test('removeTunnel: only required params', async () => {
366-
const responsePromise = client.devboxes.removeTunnel('id', { port: 0 });
365+
test('removeTunnel', async () => {
366+
const responsePromise = client.devboxes.removeTunnel('id');
367367
const rawResponse = await responsePromise.asResponse();
368368
expect(rawResponse).toBeInstanceOf(Response);
369369
const response = await responsePromise;
@@ -373,8 +373,11 @@ describe('resource devboxes', () => {
373373
expect(dataAndResponse.response).toBe(rawResponse);
374374
});
375375

376-
test('removeTunnel: required and optional params', async () => {
377-
const response = await client.devboxes.removeTunnel('id', { port: 0 });
376+
test('removeTunnel: request options instead of params are passed correctly', async () => {
377+
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
378+
await expect(client.devboxes.removeTunnel('id', { path: '/_stainless_unknown_path' })).rejects.toThrow(
379+
Runloop.NotFoundError,
380+
);
378381
});
379382

380383
test('resume', async () => {

tests/objects/devbox.test.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -381,13 +381,9 @@ describe('Devbox (New API)', () => {
381381
it('should remove legacy tunnel', async () => {
382382
mockClient.devboxes.removeTunnel.mockResolvedValue(undefined);
383383

384-
const result = await devbox.net.removeTunnel({ port: 8080 });
384+
const result = await devbox.net.removeTunnel();
385385

386-
expect(mockClient.devboxes.removeTunnel).toHaveBeenCalledWith(
387-
'devbox-123',
388-
{ port: 8080 },
389-
undefined,
390-
);
386+
expect(mockClient.devboxes.removeTunnel).toHaveBeenCalledWith('devbox-123', undefined);
391387
expect(result).toBeUndefined();
392388
});
393389
});

0 commit comments

Comments
 (0)