From f8e124e14c4c41983b5305d2ad1cbbece9984d67 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 20:45:25 +0000 Subject: [PATCH 1/5] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index b4d46dd..2337b13 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 36 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-e82c289d3d3aabd936a476cf81630587ffe46ab9e9bdebced4b31b8c2f9bc08f.yml -openapi_spec_hash: 473121b283812a3dfd866afe9b61dc7d +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-a4908a77d1ee379f0f3e36f2d2941f074e7ecbce0392d6f9c0c4f089cbb96244.yml +openapi_spec_hash: d010b0015cd09212d7440a8ad90d04e1 config_hash: 1b24ea9fa13645b16b74aa794dbc8190 From 518d4d6b04dfe3e25540fd8fed4857e84bac8d12 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 00:00:25 +0000 Subject: [PATCH 2/5] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2337b13..fd010ad 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 36 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-a4908a77d1ee379f0f3e36f2d2941f074e7ecbce0392d6f9c0c4f089cbb96244.yml -openapi_spec_hash: d010b0015cd09212d7440a8ad90d04e1 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-e80dfc4671603a503dc62812916b0d467e344106a1c4412ee1442914504fc94d.yml +openapi_spec_hash: 71dfbc1021a33dd7fc9d82844965b1b3 config_hash: 1b24ea9fa13645b16b74aa794dbc8190 From 036d917c294fb56c387abcb05ea1dc66db1c83f2 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 00:02:09 +0000 Subject: [PATCH 3/5] feat(api): manual updates --- .stats.yml | 6 +- api.md | 19 +++++- src/resources/sessions/index.ts | 2 +- src/resources/sessions/recording.ts | 38 +---------- src/resources/sessions/recording/downloads.ts | 66 +++++++++++++++++++ src/resources/sessions/recording/index.ts | 9 +++ src/resources/sessions/recording/recording.ts | 52 +++++++++++++++ src/resources/sessions/sessions.ts | 4 +- .../sessions/recording/downloads.test.ts | 53 +++++++++++++++ .../{ => recording}/recording.test.ts | 0 10 files changed, 203 insertions(+), 46 deletions(-) create mode 100644 src/resources/sessions/recording/downloads.ts create mode 100644 src/resources/sessions/recording/index.ts create mode 100644 src/resources/sessions/recording/recording.ts create mode 100644 tests/api-resources/sessions/recording/downloads.test.ts rename tests/api-resources/sessions/{ => recording}/recording.test.ts (100%) diff --git a/.stats.yml b/.stats.yml index fd010ad..1ac83c1 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 36 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-e80dfc4671603a503dc62812916b0d467e344106a1c4412ee1442914504fc94d.yml +configured_endpoints: 38 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-98cc68ad9afa71355baf2b31f305a5e2f3a315fd311c96659405eff96b8f2b1e.yml openapi_spec_hash: 71dfbc1021a33dd7fc9d82844965b1b3 -config_hash: 1b24ea9fa13645b16b74aa794dbc8190 +config_hash: 6209a285dd5980f5c418fe6575723aef diff --git a/api.md b/api.md index bd75c9d..0d7919e 100644 --- a/api.md +++ b/api.md @@ -112,12 +112,25 @@ Methods: Types: -- SessionRecording -- RecordingRetrieveResponse +- SessionRecording +- RecordingRetrieveResponse Methods: -- client.sessions.recording.retrieve(id) -> RecordingRetrieveResponse +- client.sessions.recording.retrieve(id) -> RecordingRetrieveResponse + +### Downloads + +Types: + +- RecordingDownload +- DownloadCreateResponse +- DownloadListResponse + +Methods: + +- client.sessions.recording.downloads.create(id) -> DownloadCreateResponse +- client.sessions.recording.downloads.list(id) -> DownloadListResponse ## Uploads diff --git a/src/resources/sessions/index.ts b/src/resources/sessions/index.ts index b3c2a80..83b9c59 100644 --- a/src/resources/sessions/index.ts +++ b/src/resources/sessions/index.ts @@ -2,7 +2,7 @@ export { Downloads } from './downloads'; export { Logs, type SessionLog, type LogListResponse } from './logs'; -export { Recording, type SessionRecording, type RecordingRetrieveResponse } from './recording'; +export { Recording, type SessionRecording, type RecordingRetrieveResponse } from './recording/index'; export { Replays, type ReplayRetrieveResponse } from './replays'; export { Sessions, diff --git a/src/resources/sessions/recording.ts b/src/resources/sessions/recording.ts index 62f91ca..5943a71 100644 --- a/src/resources/sessions/recording.ts +++ b/src/resources/sessions/recording.ts @@ -1,39 +1,3 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import { APIResource } from '../../resource'; -import * as Core from '../../core'; - -export class Recording extends APIResource { - /** - * Session Recording - */ - retrieve(id: string, options?: Core.RequestOptions): Core.APIPromise { - return this._client.get(`/v1/sessions/${id}/recording`, options); - } -} - -export interface SessionRecording { - /** - * See - * [rrweb documentation](https://github.com/rrweb-io/rrweb/blob/master/docs/recipes/dive-into-event.md). - */ - data: { [key: string]: unknown }; - - sessionId: string; - - /** - * milliseconds that have elapsed since the UNIX epoch - */ - timestamp: number; - - type: number; -} - -export type RecordingRetrieveResponse = Array; - -export declare namespace Recording { - export { - type SessionRecording as SessionRecording, - type RecordingRetrieveResponse as RecordingRetrieveResponse, - }; -} +export * from './recording/index'; diff --git a/src/resources/sessions/recording/downloads.ts b/src/resources/sessions/recording/downloads.ts new file mode 100644 index 0000000..b4dd834 --- /dev/null +++ b/src/resources/sessions/recording/downloads.ts @@ -0,0 +1,66 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../resource'; +import * as Core from '../../../core'; + +export class Downloads extends APIResource { + /** + * Requests one downloadable MP4 per recorded page of a session. Assembly runs + * asynchronously and every page returns as `PENDING`. Re-posting re-enqueues all + * pages and retries any that failed. Poll the GET endpoint for per-page status + * and, on standard (non-BYOS) projects, download URLs. + */ + create(id: string, options?: Core.RequestOptions): Core.APIPromise { + return this._client.post(`/v1/sessions/${id}/recording/downloads`, options); + } + + /** + * Returns the per-page download status for a session, with a short-lived signed + * URL for each completed page on standard (non-BYOS) projects. + */ + list(id: string, options?: Core.RequestOptions): Core.APIPromise { + return this._client.get(`/v1/sessions/${id}/recording/downloads`, options); + } +} + +export interface RecordingDownload { + /** + * Recorded page (tab) within the session, e.g. "0", "1". + */ + pageId: string; + + /** + * Per-page MP4 assembly state. `NOT_REQUESTED`: no download has been requested for + * the session yet. `PENDING`: assembly is enqueued or in progress. `COMPLETED`: + * the MP4 is ready. `FAILED`: assembly failed; POST again to retry. + */ + status: 'NOT_REQUESTED' | 'PENDING' | 'COMPLETED' | 'FAILED'; + + /** + * When the MP4 was created. Present only when COMPLETED on a standard (non-BYOS) + * project. + */ + completedAt?: string; + + /** + * Short-lived signed CDN URL, re-minted each GET. Present only when COMPLETED on a + * standard (non-BYOS) project. + */ + downloadUrl?: string; +} + +export interface DownloadCreateResponse { + downloads: Array; +} + +export interface DownloadListResponse { + downloads: Array; +} + +export declare namespace Downloads { + export { + type RecordingDownload as RecordingDownload, + type DownloadCreateResponse as DownloadCreateResponse, + type DownloadListResponse as DownloadListResponse, + }; +} diff --git a/src/resources/sessions/recording/index.ts b/src/resources/sessions/recording/index.ts new file mode 100644 index 0000000..cfb53d4 --- /dev/null +++ b/src/resources/sessions/recording/index.ts @@ -0,0 +1,9 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export { + Downloads, + type RecordingDownload, + type DownloadCreateResponse, + type DownloadListResponse, +} from './downloads'; +export { Recording, type SessionRecording, type RecordingRetrieveResponse } from './recording'; diff --git a/src/resources/sessions/recording/recording.ts b/src/resources/sessions/recording/recording.ts new file mode 100644 index 0000000..cb5dde2 --- /dev/null +++ b/src/resources/sessions/recording/recording.ts @@ -0,0 +1,52 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../resource'; +import * as Core from '../../../core'; +import * as DownloadsAPI from './downloads'; +import { DownloadCreateResponse, DownloadListResponse, Downloads, RecordingDownload } from './downloads'; + +export class Recording extends APIResource { + downloads: DownloadsAPI.Downloads = new DownloadsAPI.Downloads(this._client); + + /** + * Session Recording + */ + retrieve(id: string, options?: Core.RequestOptions): Core.APIPromise { + return this._client.get(`/v1/sessions/${id}/recording`, options); + } +} + +export interface SessionRecording { + /** + * See + * [rrweb documentation](https://github.com/rrweb-io/rrweb/blob/master/docs/recipes/dive-into-event.md). + */ + data: { [key: string]: unknown }; + + sessionId: string; + + /** + * milliseconds that have elapsed since the UNIX epoch + */ + timestamp: number; + + type: number; +} + +export type RecordingRetrieveResponse = Array; + +Recording.Downloads = Downloads; + +export declare namespace Recording { + export { + type SessionRecording as SessionRecording, + type RecordingRetrieveResponse as RecordingRetrieveResponse, + }; + + export { + Downloads as Downloads, + type RecordingDownload as RecordingDownload, + type DownloadCreateResponse as DownloadCreateResponse, + type DownloadListResponse as DownloadListResponse, + }; +} diff --git a/src/resources/sessions/sessions.ts b/src/resources/sessions/sessions.ts index 64aec7b..3a9e979 100644 --- a/src/resources/sessions/sessions.ts +++ b/src/resources/sessions/sessions.ts @@ -7,12 +7,12 @@ import * as DownloadsAPI from './downloads'; import { Downloads } from './downloads'; import * as LogsAPI from './logs'; import { LogListResponse, Logs, SessionLog } from './logs'; -import * as RecordingAPI from './recording'; -import { Recording, RecordingRetrieveResponse, SessionRecording } from './recording'; import * as ReplaysAPI from './replays'; import { ReplayRetrieveResponse, Replays } from './replays'; import * as UploadsAPI from './uploads'; import { UploadCreateParams, UploadCreateResponse, Uploads } from './uploads'; +import * as RecordingAPI from './recording/recording'; +import { Recording, RecordingRetrieveResponse, SessionRecording } from './recording/recording'; export class Sessions extends APIResource { downloads: DownloadsAPI.Downloads = new DownloadsAPI.Downloads(this._client); diff --git a/tests/api-resources/sessions/recording/downloads.test.ts b/tests/api-resources/sessions/recording/downloads.test.ts new file mode 100644 index 0000000..e2120e3 --- /dev/null +++ b/tests/api-resources/sessions/recording/downloads.test.ts @@ -0,0 +1,53 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import Browserbase from '@browserbasehq/sdk'; +import { Response } from 'node-fetch'; + +const client = new Browserbase({ + apiKey: 'My API Key', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource downloads', () => { + test('create', async () => { + const responsePromise = client.sessions.recording.downloads.create( + '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + ); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('create: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.sessions.recording.downloads.create('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { + path: '/_stainless_unknown_path', + }), + ).rejects.toThrow(Browserbase.NotFoundError); + }); + + test('list', async () => { + const responsePromise = client.sessions.recording.downloads.list('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('list: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.sessions.recording.downloads.list('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { + path: '/_stainless_unknown_path', + }), + ).rejects.toThrow(Browserbase.NotFoundError); + }); +}); diff --git a/tests/api-resources/sessions/recording.test.ts b/tests/api-resources/sessions/recording/recording.test.ts similarity index 100% rename from tests/api-resources/sessions/recording.test.ts rename to tests/api-resources/sessions/recording/recording.test.ts From b7e29f535e29912594b30e7b64dc532113919a96 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 00:02:27 +0000 Subject: [PATCH 4/5] release: 2.16.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- src/version.ts | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 96a8c91..7731f20 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.15.0" + ".": "2.16.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index a8d8d44..90b28d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 2.16.0 (2026-07-14) + +Full Changelog: [v2.15.0...v2.16.0](https://github.com/browserbase/sdk-node/compare/v2.15.0...v2.16.0) + +### Features + +* **api:** manual updates ([036d917](https://github.com/browserbase/sdk-node/commit/036d917c294fb56c387abcb05ea1dc66db1c83f2)) + ## 2.15.0 (2026-07-02) Full Changelog: [v2.14.1...v2.15.0](https://github.com/browserbase/sdk-node/compare/v2.14.1...v2.15.0) diff --git a/package-lock.json b/package-lock.json index d5d0060..494fec1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@browserbasehq/sdk", - "version": "2.15.0", + "version": "2.16.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@browserbasehq/sdk", - "version": "2.15.0", + "version": "2.16.0", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", diff --git a/package.json b/package.json index b3d0ff2..7733df7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@browserbasehq/sdk", - "version": "2.15.0", + "version": "2.16.0", "description": "The official Node.js library for the Browserbase API", "author": "Browserbase ", "license": "Apache-2.0", diff --git a/src/version.ts b/src/version.ts index ba989f0..f9cc5c1 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '2.15.0'; // x-release-please-version +export const VERSION = '2.16.0'; // x-release-please-version From dca345b82298c7c2450aef454371741fdd929fa4 Mon Sep 17 00:00:00 2001 From: dom Date: Mon, 13 Jul 2026 17:35:01 -0700 Subject: [PATCH 5/5] fix shim test --- tests/api-resources/sessions/recording/downloads.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/api-resources/sessions/recording/downloads.test.ts b/tests/api-resources/sessions/recording/downloads.test.ts index e2120e3..988f4c7 100644 --- a/tests/api-resources/sessions/recording/downloads.test.ts +++ b/tests/api-resources/sessions/recording/downloads.test.ts @@ -1,7 +1,7 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import Browserbase from '@browserbasehq/sdk'; -import { Response } from 'node-fetch'; +import { Response } from '@browserbasehq/sdk/_shims/index'; const client = new Browserbase({ apiKey: 'My API Key',