From 37d3e277f98b068f23c5fc85e7b26269c254827c Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 23:07:50 +0000 Subject: [PATCH 01/12] docs(openapi): describe unified concurrency limit, deprecate max_pooled_sessions (CUS-275) --- .stats.yml | 4 ++-- src/resources/organization/limits.ts | 27 +++++++++++++------------ src/resources/projects/limits.ts | 30 +++++++++++++++++----------- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/.stats.yml b/.stats.yml index 3f7dec3b..c7028199 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 125 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-ba32039d3975da7aa6d28e5184f0a44c9fbfe36ab7dbc71985d14e2ecc0867b9.yml -openapi_spec_hash: a9f32fc90c2add2ae85af828c298e35b +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-db45aab5b114bc0848eab997c85bfc02a653be9f929f8d090ec24187462733ee.yml +openapi_spec_hash: 82f4282312699f8d54bec207e981efe8 config_hash: 06186eb40e0058a2a87ac251fc07415d diff --git a/src/resources/organization/limits.ts b/src/resources/organization/limits.ts index 53f2f5c0..f0948cbd 100644 --- a/src/resources/organization/limits.ts +++ b/src/resources/organization/limits.ts @@ -9,8 +9,9 @@ import { RequestOptions } from '../../internal/request-options'; */ export class Limits extends APIResource { /** - * Get the organization's concurrent session ceiling and the default per-project - * concurrency cap applied to projects without an explicit override. + * Get the organization's concurrency limit — the maximum browsers running at once + * across on-demand sessions and browser pool reservations — and the default + * per-project concurrency cap applied to projects without an explicit override. */ retrieve(options?: RequestOptions): APIPromise { return this._client.get('/org/limits', options); @@ -19,8 +20,7 @@ export class Limits extends APIResource { /** * Set the default per-project concurrency cap applied to projects without an * explicit override. Set the value to 0 to remove the default; omit to leave it - * unchanged. The default cannot exceed the organization's concurrent session - * ceiling. + * unchanged. The default cannot exceed the organization's concurrency limit. */ update(body: LimitUpdateParams, options?: RequestOptions): APIPromise { return this._client.patch('/org/limits', { body, ...options }); @@ -29,7 +29,7 @@ export class Limits extends APIResource { export interface OrgLimits { /** - * Default maximum concurrent browser sessions applied to every project that has no + * Default maximum concurrent browsers applied to every project that has no * explicit per-project override. Null means no org-level default, so such projects * are uncapped (only the org-wide limit applies). Applies to existing and newly * created projects. @@ -37,8 +37,9 @@ export interface OrgLimits { default_project_max_concurrent_sessions?: number | null; /** - * The organization's effective concurrent browser session ceiling, from its plan - * or an override. Read-only and shared across all projects in the org; a + * The organization's effective concurrency limit — the maximum browsers running at + * once, covering both on-demand sessions and browser pool reservations — from its + * plan or an override. Read-only and shared across all projects in the org; a * per-project default cannot exceed it. */ max_concurrent_sessions?: number; @@ -46,18 +47,18 @@ export interface OrgLimits { export interface UpdateOrgLimitsRequest { /** - * Default maximum concurrent browser sessions for projects without an explicit - * override. Set to 0 to remove the default; omit to leave unchanged. Cannot exceed - * the organization's concurrent session ceiling. + * Default maximum concurrent browsers for projects without an explicit override. + * Set to 0 to remove the default; omit to leave unchanged. Cannot exceed the + * organization's concurrency limit. */ default_project_max_concurrent_sessions?: number | null; } export interface LimitUpdateParams { /** - * Default maximum concurrent browser sessions for projects without an explicit - * override. Set to 0 to remove the default; omit to leave unchanged. Cannot exceed - * the organization's concurrent session ceiling. + * Default maximum concurrent browsers for projects without an explicit override. + * Set to 0 to remove the default; omit to leave unchanged. Cannot exceed the + * organization's concurrency limit. */ default_project_max_concurrent_sessions?: number | null; } diff --git a/src/resources/projects/limits.ts b/src/resources/projects/limits.ts index 52ec16ac..d1a3e53c 100644 --- a/src/resources/projects/limits.ts +++ b/src/resources/projects/limits.ts @@ -49,14 +49,16 @@ export interface ProjectLimits { max_concurrent_invocations?: number | null; /** - * Maximum concurrent browser sessions for this project. Null means no - * project-level cap. + * Maximum concurrent browsers for this project, covering both on-demand sessions + * (`browsers.create()`) and browser pool reservations. Null means no project-level + * cap. */ max_concurrent_sessions?: number | null; /** - * Maximum pooled sessions capacity for this project. Null means no project-level - * cap. + * @deprecated Deprecated: pooled browsers now count toward + * `max_concurrent_sessions`. Always null once the unified concurrency limit is + * enabled for your organization. */ max_pooled_sessions?: number | null; } @@ -69,14 +71,16 @@ export interface UpdateProjectLimitsRequest { max_concurrent_invocations?: number | null; /** - * Maximum concurrent browser sessions for this project. Set to 0 to remove the - * cap; omit to leave unchanged. + * Maximum concurrent browsers for this project, covering both on-demand sessions + * and browser pool reservations. Set to 0 to remove the cap; omit to leave + * unchanged. */ max_concurrent_sessions?: number | null; /** - * Maximum pooled sessions capacity for this project. Set to 0 to remove the cap; - * omit to leave unchanged. + * @deprecated Deprecated: pooled browsers now count toward + * `max_concurrent_sessions`. Requests that set this field are rejected with a 400 + * once the unified concurrency limit is enabled for your organization. */ max_pooled_sessions?: number | null; } @@ -89,14 +93,16 @@ export interface LimitUpdateParams { max_concurrent_invocations?: number | null; /** - * Maximum concurrent browser sessions for this project. Set to 0 to remove the - * cap; omit to leave unchanged. + * Maximum concurrent browsers for this project, covering both on-demand sessions + * and browser pool reservations. Set to 0 to remove the cap; omit to leave + * unchanged. */ max_concurrent_sessions?: number | null; /** - * Maximum pooled sessions capacity for this project. Set to 0 to remove the cap; - * omit to leave unchanged. + * @deprecated Deprecated: pooled browsers now count toward + * `max_concurrent_sessions`. Requests that set this field are rejected with a 400 + * once the unified concurrency limit is enabled for your organization. */ max_pooled_sessions?: number | null; } From 2fe41244b7e184914c6858a9533132d65b4380ba Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 13:46:00 +0000 Subject: [PATCH 02/12] feat: Add name-only rename for profiles and proxies --- .stats.yml | 8 +- api.md | 3 + src/client.ts | 7 +- src/resources/index.ts | 9 +- src/resources/profiles.ts | 78 +++++++++- src/resources/proxies.ts | 213 +++++++++++++++++++++++++++ tests/api-resources/profiles.test.ts | 17 +++ tests/api-resources/proxies.test.ts | 17 +++ 8 files changed, 344 insertions(+), 8 deletions(-) diff --git a/.stats.yml b/.stats.yml index c7028199..09109a9b 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 125 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-db45aab5b114bc0848eab997c85bfc02a653be9f929f8d090ec24187462733ee.yml -openapi_spec_hash: 82f4282312699f8d54bec207e981efe8 -config_hash: 06186eb40e0058a2a87ac251fc07415d +configured_endpoints: 127 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-bc33d13e669972493e9ab0da82a71999822dc049eb14b113f446753c917ffcdb.yml +openapi_spec_hash: 133a2e0d0cdc4023f98b3c2e589cf5d8 +config_hash: 77ee715aa17061166f9a02b264a21b8d diff --git a/api.md b/api.md index d729ebd3..f7950f3e 100644 --- a/api.md +++ b/api.md @@ -252,6 +252,7 @@ Methods: - client.profiles.create({ ...params }) -> Profile - client.profiles.retrieve(idOrName) -> Profile +- client.profiles.update(idOrName, { ...params }) -> Profile - client.profiles.list({ ...params }) -> ProfilesOffsetPagination - client.profiles.delete(idOrName) -> void - client.profiles.download(idOrName) -> Response @@ -289,6 +290,7 @@ Types: - ProxyCreateResponse - ProxyRetrieveResponse +- ProxyUpdateResponse - ProxyListResponse - ProxyCheckResponse @@ -296,6 +298,7 @@ Methods: - client.proxies.create({ ...params }) -> ProxyCreateResponse - client.proxies.retrieve(id) -> ProxyRetrieveResponse +- client.proxies.update(id, { ...params }) -> ProxyUpdateResponse - client.proxies.list({ ...params }) -> ProxyListResponsesOffsetPagination - client.proxies.delete(id) -> void - client.proxies.check(id, { ...params }) -> ProxyCheckResponse diff --git a/src/client.ts b/src/client.ts index db4f3c37..7dd7a576 100644 --- a/src/client.ts +++ b/src/client.ts @@ -123,7 +123,7 @@ import { InvocationUpdateResponse, Invocations, } from './resources/invocations'; -import { ProfileCreateParams, ProfileListParams, Profiles } from './resources/profiles'; +import { ProfileCreateParams, ProfileListParams, ProfileUpdateParams, Profiles } from './resources/profiles'; import { Proxies, ProxyCheckParams, @@ -134,6 +134,8 @@ import { ProxyListResponse, ProxyListResponsesOffsetPagination, ProxyRetrieveResponse, + ProxyUpdateParams, + ProxyUpdateResponse, } from './resources/proxies'; import { Auth } from './resources/auth/auth'; import { @@ -1122,6 +1124,7 @@ export declare namespace Kernel { export { Profiles as Profiles, type ProfileCreateParams as ProfileCreateParams, + type ProfileUpdateParams as ProfileUpdateParams, type ProfileListParams as ProfileListParams, }; @@ -1131,10 +1134,12 @@ export declare namespace Kernel { Proxies as Proxies, type ProxyCreateResponse as ProxyCreateResponse, type ProxyRetrieveResponse as ProxyRetrieveResponse, + type ProxyUpdateResponse as ProxyUpdateResponse, type ProxyListResponse as ProxyListResponse, type ProxyCheckResponse as ProxyCheckResponse, type ProxyListResponsesOffsetPagination as ProxyListResponsesOffsetPagination, type ProxyCreateParams as ProxyCreateParams, + type ProxyUpdateParams as ProxyUpdateParams, type ProxyListParams as ProxyListParams, type ProxyCheckParams as ProxyCheckParams, }; diff --git a/src/resources/index.ts b/src/resources/index.ts index a7fdf353..797de87a 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -120,7 +120,12 @@ export { type InvocationListResponsesOffsetPagination, } from './invocations'; export { Organization } from './organization/organization'; -export { Profiles, type ProfileCreateParams, type ProfileListParams } from './profiles'; +export { + Profiles, + type ProfileCreateParams, + type ProfileUpdateParams, + type ProfileListParams, +} from './profiles'; export { Projects, type CreateProjectRequest, @@ -135,9 +140,11 @@ export { Proxies, type ProxyCreateResponse, type ProxyRetrieveResponse, + type ProxyUpdateResponse, type ProxyListResponse, type ProxyCheckResponse, type ProxyCreateParams, + type ProxyUpdateParams, type ProxyListParams, type ProxyCheckParams, type ProxyListResponsesOffsetPagination, diff --git a/src/resources/profiles.ts b/src/resources/profiles.ts index aa78a014..29708d84 100644 --- a/src/resources/profiles.ts +++ b/src/resources/profiles.ts @@ -16,6 +16,11 @@ export class Profiles extends APIResource { /** * Create a browser profile that can be used to load state into future browser * sessions. + * + * @example + * ```ts + * const profile = await client.profiles.create(); + * ``` */ create(body: ProfileCreateParams, options?: RequestOptions): APIPromise { return this._client.post('/profiles', { body, ...options }); @@ -23,13 +28,52 @@ export class Profiles extends APIResource { /** * Retrieve details for a single profile by its ID or name. + * + * @example + * ```ts + * const profile = await client.profiles.retrieve( + * 'id_or_name', + * ); + * ``` */ retrieve(idOrName: string, options?: RequestOptions): APIPromise { return this._client.get(path`/profiles/${idOrName}`, options); } + /** + * Update a profile's name. Names must be unique within the logical project; during + * the default-project migration, unscoped profiles and profiles in the org default + * project are treated as the same project. Duplicate-name conflicts are checked + * before update but are best-effort because there is no backing unique index. + * Renaming a profile while a browser session references it by name may prevent + * that session's changes from saving; prefer renaming when the profile is not in + * use. + * + * @example + * ```ts + * const profile = await client.profiles.update('id_or_name', { + * name: 'my-renamed-profile', + * }); + * ``` + */ + update( + idOrName: string, + body: ProfileUpdateParams, + options?: RequestOptions, + ): APIPromise { + return this._client.patch(path`/profiles/${idOrName}`, { body, ...options }); + } + /** * List profiles with optional filtering and pagination. + * + * @example + * ```ts + * // Automatically fetches more pages as needed. + * for await (const profile of client.profiles.list()) { + * // ... + * } + * ``` */ list( query: ProfileListParams | null | undefined = {}, @@ -40,6 +84,11 @@ export class Profiles extends APIResource { /** * Delete a profile by its ID or by its name. + * + * @example + * ```ts + * await client.profiles.delete('id_or_name'); + * ``` */ delete(idOrName: string, options?: RequestOptions): APIPromise { return this._client.delete(path`/profiles/${idOrName}`, { @@ -50,6 +99,16 @@ export class Profiles extends APIResource { /** * Returns a zstd-compressed tar file of the full user-data directory. + * + * @example + * ```ts + * const response = await client.profiles.download( + * 'id_or_name', + * ); + * + * const content = await response.blob(); + * console.log(content); + * ``` */ download(idOrName: string, options?: RequestOptions): APIPromise { return this._client.get(path`/profiles/${idOrName}/download`, { @@ -62,11 +121,22 @@ export class Profiles extends APIResource { export interface ProfileCreateParams { /** - * Optional name of the profile. Must be unique within the project. + * Optional name of the profile. Must be unique within the logical project; during + * the default-project migration, unscoped profiles and profiles in the org default + * project are treated as the same project. */ name?: string; } +export interface ProfileUpdateParams { + /** + * New profile name. Must be unique within the logical project; during the + * default-project migration, unscoped profiles and profiles in the org default + * project are treated as the same project. + */ + name: string; +} + export interface ProfileListParams extends OffsetPaginationParams { /** * Search profiles by name or ID. @@ -75,7 +145,11 @@ export interface ProfileListParams extends OffsetPaginationParams { } export declare namespace Profiles { - export { type ProfileCreateParams as ProfileCreateParams, type ProfileListParams as ProfileListParams }; + export { + type ProfileCreateParams as ProfileCreateParams, + type ProfileUpdateParams as ProfileUpdateParams, + type ProfileListParams as ProfileListParams, + }; } export { type ProfilesOffsetPagination }; diff --git a/src/resources/proxies.ts b/src/resources/proxies.ts index 3dda98f5..a9295fae 100644 --- a/src/resources/proxies.ts +++ b/src/resources/proxies.ts @@ -13,6 +13,13 @@ import { path } from '../internal/utils/path'; export class Proxies extends APIResource { /** * Create a new proxy configuration in the resolved project. + * + * @example + * ```ts + * const proxy = await client.proxies.create({ + * type: 'datacenter', + * }); + * ``` */ create(body: ProxyCreateParams, options?: RequestOptions): APIPromise { return this._client.post('/proxies', { body, ...options }); @@ -20,13 +27,43 @@ export class Proxies extends APIResource { /** * Retrieve a proxy in the resolved project by ID. + * + * @example + * ```ts + * const proxy = await client.proxies.retrieve('id'); + * ``` */ retrieve(id: string, options?: RequestOptions): APIPromise { return this._client.get(path`/proxies/${id}`, options); } + /** + * Update a proxy's name. Proxy names are not unique and are not ID-or-name + * addressable on this endpoint; duplicate names are allowed. Name-based + * session-create lookups can remain ambiguous until callers resolve proxies by ID + * or the API adds a stronger uniqueness contract. + * + * @example + * ```ts + * const proxy = await client.proxies.update('id', { + * name: 'my-renamed-proxy', + * }); + * ``` + */ + update(id: string, body: ProxyUpdateParams, options?: RequestOptions): APIPromise { + return this._client.patch(path`/proxies/${id}`, { body, ...options }); + } + /** * List proxies in the resolved project. + * + * @example + * ```ts + * // Automatically fetches more pages as needed. + * for await (const proxyListResponse of client.proxies.list()) { + * // ... + * } + * ``` */ list( query: ProxyListParams | null | undefined = {}, @@ -37,6 +74,11 @@ export class Proxies extends APIResource { /** * Soft delete a proxy. Sessions referencing it are not modified. + * + * @example + * ```ts + * await client.proxies.delete('id'); + * ``` */ delete(id: string, options?: RequestOptions): APIPromise { return this._client.delete(path`/proxies/${id}`, { @@ -52,6 +94,11 @@ export class Proxies extends APIResource { * exit IP. For residential and mobile proxies, the exit node varies between * requests, so this validates proxy configuration and connectivity rather than * guaranteeing site-specific reachability. + * + * @example + * ```ts + * const response = await client.proxies.check('id'); + * ``` */ check( id: string, @@ -376,6 +423,162 @@ export namespace ProxyRetrieveResponse { } } +/** + * Configuration for routing traffic through a proxy. + */ +export interface ProxyUpdateResponse { + /** + * Proxy type to use. In terms of quality for avoiding bot-detection, from best to + * worst: `mobile` > `residential` > `isp` > `datacenter`. + */ + type: 'datacenter' | 'isp' | 'residential' | 'mobile' | 'custom'; + + id?: string; + + /** + * Hostnames that should bypass the parent proxy and connect directly. + */ + bypass_hosts?: Array; + + /** + * Configuration specific to the selected proxy `type`. + */ + config?: + | ProxyUpdateResponse.DatacenterProxyConfig + | ProxyUpdateResponse.IspProxyConfig + | ProxyUpdateResponse.ResidentialProxyConfig + | ProxyUpdateResponse.MobileProxyConfig + | ProxyUpdateResponse.CustomProxyConfig; + + /** + * IP address that the proxy uses when making requests. + */ + ip_address?: string; + + /** + * Timestamp of the last health check performed on this proxy. + */ + last_checked?: string; + + /** + * Readable name of the proxy. + */ + name?: string; + + /** + * Protocol to use for the proxy connection. + */ + protocol?: 'http' | 'https'; + + /** + * Current health status of the proxy. + */ + status?: 'available' | 'unavailable'; +} + +export namespace ProxyUpdateResponse { + /** + * Configuration for a datacenter proxy. + */ + export interface DatacenterProxyConfig { + /** + * ISO 3166 country code. Defaults to US if not provided. + */ + country?: string; + } + + /** + * Configuration for an ISP proxy. + */ + export interface IspProxyConfig { + /** + * ISO 3166 country code. Defaults to US if not provided. + */ + country?: string; + } + + /** + * Configuration for residential proxies. + */ + export interface ResidentialProxyConfig { + /** + * Autonomous system number. See https://bgp.potaroo.net/cidr/autnums.html + */ + asn?: string; + + /** + * City name (no spaces, e.g. `sanfrancisco`). If provided, `country` must also be + * provided. + */ + city?: string; + + /** + * ISO 3166 country code. + */ + country?: string; + + /** + * @deprecated Operating system of the residential device. + */ + os?: 'windows' | 'macos' | 'android'; + + /** + * Two-letter state code. + */ + state?: string; + + /** + * US ZIP code. + */ + zip?: string; + } + + /** + * Configuration for mobile proxies. + */ + export interface MobileProxyConfig { + /** + * Provider city alias. Mobile carrier routing can make observed geo vary. + */ + city?: string; + + /** + * ISO 3166 country code + */ + country?: string; + + /** + * US-only state code. Mobile carrier routing can make observed geo vary. + */ + state?: string; + } + + /** + * Configuration for a custom proxy (e.g., private proxy server). + */ + export interface CustomProxyConfig { + /** + * Proxy host address or IP. + */ + host: string; + + /** + * Proxy port. + */ + port: number; + + /** + * Whether the proxy has a password. + */ + has_password?: boolean; + + /** + * Username for proxy authentication. + */ + username?: string; + } +} + /** * Configuration for routing traffic through a proxy. */ @@ -824,6 +1027,14 @@ export namespace ProxyCreateParams { } } +export interface ProxyUpdateParams { + /** + * New proxy name. Proxy names are trimmed and length-checked only; duplicates are + * allowed because proxies are updated by ID, not by name. + */ + name: string; +} + export interface ProxyListParams extends OffsetPaginationParams { /** * Search proxies by name, host, IP address, or ID. @@ -853,10 +1064,12 @@ export declare namespace Proxies { export { type ProxyCreateResponse as ProxyCreateResponse, type ProxyRetrieveResponse as ProxyRetrieveResponse, + type ProxyUpdateResponse as ProxyUpdateResponse, type ProxyListResponse as ProxyListResponse, type ProxyCheckResponse as ProxyCheckResponse, type ProxyListResponsesOffsetPagination as ProxyListResponsesOffsetPagination, type ProxyCreateParams as ProxyCreateParams, + type ProxyUpdateParams as ProxyUpdateParams, type ProxyListParams as ProxyListParams, type ProxyCheckParams as ProxyCheckParams, }; diff --git a/tests/api-resources/profiles.test.ts b/tests/api-resources/profiles.test.ts index 0bbb5574..2cfe7ecc 100644 --- a/tests/api-resources/profiles.test.ts +++ b/tests/api-resources/profiles.test.ts @@ -32,6 +32,23 @@ describe('resource profiles', () => { expect(dataAndResponse.response).toBe(rawResponse); }); + // Mock server tests are disabled + test.skip('update: only required params', async () => { + const responsePromise = client.profiles.update('id_or_name', { name: 'my-renamed-profile' }); + 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); + }); + + // Mock server tests are disabled + test.skip('update: required and optional params', async () => { + const response = await client.profiles.update('id_or_name', { name: 'my-renamed-profile' }); + }); + // Mock server tests are disabled test.skip('list', async () => { const responsePromise = client.profiles.list(); diff --git a/tests/api-resources/proxies.test.ts b/tests/api-resources/proxies.test.ts index e64b2747..00eff027 100644 --- a/tests/api-resources/proxies.test.ts +++ b/tests/api-resources/proxies.test.ts @@ -43,6 +43,23 @@ describe('resource proxies', () => { expect(dataAndResponse.response).toBe(rawResponse); }); + // Mock server tests are disabled + test.skip('update: only required params', async () => { + const responsePromise = client.proxies.update('id', { name: 'my-renamed-proxy' }); + 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); + }); + + // Mock server tests are disabled + test.skip('update: required and optional params', async () => { + const response = await client.proxies.update('id', { name: 'my-renamed-proxy' }); + }); + // Mock server tests are disabled test.skip('list', async () => { const responsePromise = client.proxies.list(); From 670f7c32c4c63064198a53bab24117354a26832d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:19:19 +0000 Subject: [PATCH 03/12] feat: Document name uniqueness and query match semantics --- .stats.yml | 4 +-- src/resources/api-keys.ts | 5 ++-- src/resources/auth/connections.ts | 40 ++++++++++++++++++++------- src/resources/browser-pools.ts | 3 +- src/resources/credential-providers.ts | 3 +- src/resources/credentials.ts | 3 +- src/resources/extensions.ts | 3 +- src/resources/profiles.ts | 2 +- src/resources/proxies.ts | 3 +- 9 files changed, 46 insertions(+), 20 deletions(-) diff --git a/.stats.yml b/.stats.yml index 09109a9b..b058b75d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 127 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-bc33d13e669972493e9ab0da82a71999822dc049eb14b113f446753c917ffcdb.yml -openapi_spec_hash: 133a2e0d0cdc4023f98b3c2e589cf5d8 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-6c7cbaefd8a84ec26a1677681f37041323290080dac3fd1a409bb7cd01dd2ae3.yml +openapi_spec_hash: 75085a25c8a5cdb5417f0dbfad0ed6b6 config_hash: 77ee715aa17061166f9a02b264a21b8d diff --git a/src/resources/api-keys.ts b/src/resources/api-keys.ts index a82e2c32..96b17f31 100644 --- a/src/resources/api-keys.ts +++ b/src/resources/api-keys.ts @@ -141,7 +141,8 @@ export interface APIKey { masked_key: string; /** - * API key name + * Label for the API key. API keys are not addressable by name; use the ID or key + * identifier for stable references. */ name: string; @@ -188,7 +189,7 @@ export interface CreatedAPIKey extends APIKey { export interface APIKeyCreateParams { /** - * API key name (1-255 characters) + * Label for the API key (1-255 characters). API keys are not addressable by name. */ name: string; diff --git a/src/resources/auth/connections.ts b/src/resources/auth/connections.ts index 67d067b7..9e5f8a49 100644 --- a/src/resources/auth/connections.ts +++ b/src/resources/auth/connections.ts @@ -729,7 +729,9 @@ export interface ManagedAuthCreateRequest { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ proxy?: ManagedAuthCreateRequest.Proxy; @@ -778,7 +780,9 @@ export namespace ManagedAuthCreateRequest { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ export interface Proxy { /** @@ -917,7 +921,9 @@ export interface ManagedAuthUpdateRequest { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ proxy?: ManagedAuthUpdateRequest.Proxy; @@ -964,7 +970,9 @@ export namespace ManagedAuthUpdateRequest { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ export interface Proxy { /** @@ -1320,7 +1328,9 @@ export interface ConnectionCreateParams { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ proxy?: ConnectionCreateParams.Proxy; @@ -1369,7 +1379,9 @@ export namespace ConnectionCreateParams { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ export interface Proxy { /** @@ -1430,7 +1442,9 @@ export interface ConnectionUpdateParams { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ proxy?: ConnectionUpdateParams.Proxy; @@ -1477,7 +1491,9 @@ export namespace ConnectionUpdateParams { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ export interface Proxy { /** @@ -1512,7 +1528,9 @@ export interface ConnectionListParams extends OffsetPaginationParams { export interface ConnectionLoginParams { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ proxy?: ConnectionLoginParams.Proxy; @@ -1526,7 +1544,9 @@ export interface ConnectionLoginParams { export namespace ConnectionLoginParams { /** * Proxy selection. Provide either id or name. The proxy must be in the same - * project as the resource referencing it. + * project as the resource referencing it. When selecting by name, the name must + * match exactly one active proxy in the project. Ambiguous names return a 400; use + * id for stable references. */ export interface Proxy { /** diff --git a/src/resources/browser-pools.ts b/src/resources/browser-pools.ts index a810bc8f..0b0bc160 100644 --- a/src/resources/browser-pools.ts +++ b/src/resources/browser-pools.ts @@ -737,7 +737,8 @@ export namespace BrowserPoolUpdateParams { export interface BrowserPoolListParams extends OffsetPaginationParams { /** - * Search browser pools by name or ID. + * Case-insensitive substring match against browser pool name. IDs match by exact + * value. */ query?: string; } diff --git a/src/resources/credential-providers.ts b/src/resources/credential-providers.ts index 601cf269..d85d198e 100644 --- a/src/resources/credential-providers.ts +++ b/src/resources/credential-providers.ts @@ -346,7 +346,8 @@ export interface CredentialProviderUpdateParams { export interface CredentialProviderListParams extends OffsetPaginationParams { /** - * Search credential providers by name or ID. + * Case-insensitive substring match against credential provider name. IDs match by + * exact value. */ query?: string; } diff --git a/src/resources/credentials.ts b/src/resources/credentials.ts index 09aba3a2..da4992a1 100644 --- a/src/resources/credentials.ts +++ b/src/resources/credentials.ts @@ -326,7 +326,8 @@ export interface CredentialListParams extends OffsetPaginationParams { domain?: string; /** - * Search credentials by name, domain, or ID. + * Case-insensitive substring match against credential name or domain. IDs match by + * exact value. */ query?: string; } diff --git a/src/resources/extensions.ts b/src/resources/extensions.ts index 809c2a3e..e5d0dbd0 100644 --- a/src/resources/extensions.ts +++ b/src/resources/extensions.ts @@ -250,7 +250,8 @@ export interface ExtensionUploadResponse { export interface ExtensionListParams extends OffsetPaginationParams { /** - * Search extensions by name or ID. + * Case-insensitive substring match against extension name. IDs match by exact + * value. */ query?: string; } diff --git a/src/resources/profiles.ts b/src/resources/profiles.ts index 29708d84..8b50420c 100644 --- a/src/resources/profiles.ts +++ b/src/resources/profiles.ts @@ -139,7 +139,7 @@ export interface ProfileUpdateParams { export interface ProfileListParams extends OffsetPaginationParams { /** - * Search profiles by name or ID. + * Case-insensitive substring match against profile name or ID. */ query?: string; } diff --git a/src/resources/proxies.ts b/src/resources/proxies.ts index a9295fae..b3cbefbb 100644 --- a/src/resources/proxies.ts +++ b/src/resources/proxies.ts @@ -1037,7 +1037,8 @@ export interface ProxyUpdateParams { export interface ProxyListParams extends OffsetPaginationParams { /** - * Search proxies by name, host, IP address, or ID. + * Case-insensitive substring match against proxy name, host, or IP address. IDs + * match by exact value. */ query?: string; } From dd94a6824da367c28f29a41a50ff220a7bbd0015 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:37:24 +0000 Subject: [PATCH 04/12] feat: Add exact-match name filter to list endpoints --- .stats.yml | 4 ++-- src/resources/api-keys.ts | 8 ++++++++ src/resources/browser-pools.ts | 8 ++++++++ src/resources/extensions.ts | 8 ++++++++ src/resources/profiles.ts | 8 ++++++++ src/resources/projects/projects.ts | 6 ++++++ src/resources/proxies.ts | 7 +++++++ tests/api-resources/api-keys.test.ts | 1 + tests/api-resources/browser-pools.test.ts | 1 + tests/api-resources/extensions.test.ts | 1 + tests/api-resources/profiles.test.ts | 1 + tests/api-resources/projects/projects.test.ts | 1 + tests/api-resources/proxies.test.ts | 1 + 13 files changed, 53 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index b058b75d..f7ef7fe6 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 127 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-6c7cbaefd8a84ec26a1677681f37041323290080dac3fd1a409bb7cd01dd2ae3.yml -openapi_spec_hash: 75085a25c8a5cdb5417f0dbfad0ed6b6 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-b20fcf2fc1cdb91b51ffd354adcd12d63b950ea98b69e13bee6a78a58498c2cd.yml +openapi_spec_hash: bc8b527a963dd2c2d74b6f9e6ca56652 config_hash: 77ee715aa17061166f9a02b264a21b8d diff --git a/src/resources/api-keys.ts b/src/resources/api-keys.ts index 96b17f31..7901f3cc 100644 --- a/src/resources/api-keys.ts +++ b/src/resources/api-keys.ts @@ -226,6 +226,14 @@ export interface APIKeyListParams extends OffsetPaginationParams { */ include_deleted?: boolean; + /** + * Exact-match filter on API key name using the database collation. In production, + * matching is case- and accent-insensitive. Names are not required to be unique, + * so multiple keys may match. When status=all or include_deleted=true is set, + * soft-deleted keys with the same name may also match. + */ + name?: string; + /** * Case-insensitive substring match against API key name, creator, and project. API * key identifiers and masked keys match by exact value or prefix. diff --git a/src/resources/browser-pools.ts b/src/resources/browser-pools.ts index 0b0bc160..e84ce49d 100644 --- a/src/resources/browser-pools.ts +++ b/src/resources/browser-pools.ts @@ -736,6 +736,14 @@ export namespace BrowserPoolUpdateParams { } export interface BrowserPoolListParams extends OffsetPaginationParams { + /** + * Exact-match filter on browser pool name using the database collation. In + * production, matching is case- and accent-insensitive. During the default-project + * migration, unscoped requests prefer a concrete default-project browser pool over + * a legacy unscoped browser pool with the same name. + */ + name?: string; + /** * Case-insensitive substring match against browser pool name. IDs match by exact * value. diff --git a/src/resources/extensions.ts b/src/resources/extensions.ts index e5d0dbd0..0d306ce1 100644 --- a/src/resources/extensions.ts +++ b/src/resources/extensions.ts @@ -249,6 +249,14 @@ export interface ExtensionUploadResponse { } export interface ExtensionListParams extends OffsetPaginationParams { + /** + * Exact-match filter on extension name using the database collation. In + * production, matching is case- and accent-insensitive. During the default-project + * migration, unscoped requests prefer a concrete default-project extension over a + * legacy unscoped extension with the same name. + */ + name?: string; + /** * Case-insensitive substring match against extension name. IDs match by exact * value. diff --git a/src/resources/profiles.ts b/src/resources/profiles.ts index 8b50420c..52546235 100644 --- a/src/resources/profiles.ts +++ b/src/resources/profiles.ts @@ -138,6 +138,14 @@ export interface ProfileUpdateParams { } export interface ProfileListParams extends OffsetPaginationParams { + /** + * Exact-match filter on profile name using the database collation. In production, + * matching is case- and accent-insensitive. During the default-project migration, + * unscoped requests prefer a concrete default-project profile over a legacy + * unscoped profile with the same name. + */ + name?: string; + /** * Case-insensitive substring match against profile name or ID. */ diff --git a/src/resources/projects/projects.ts b/src/resources/projects/projects.ts index e20a1c2e..9fbc1f49 100644 --- a/src/resources/projects/projects.ts +++ b/src/resources/projects/projects.ts @@ -155,6 +155,12 @@ export interface ProjectUpdateParams { } export interface ProjectListParams extends OffsetPaginationParams { + /** + * Exact-match filter on project name using the database collation. In production, + * matching is case- and accent-insensitive. + */ + name?: string; + /** * Case-insensitive substring match against project name */ diff --git a/src/resources/proxies.ts b/src/resources/proxies.ts index b3cbefbb..28c592cc 100644 --- a/src/resources/proxies.ts +++ b/src/resources/proxies.ts @@ -1036,6 +1036,13 @@ export interface ProxyUpdateParams { } export interface ProxyListParams extends OffsetPaginationParams { + /** + * Exact-match filter on proxy name using the database collation. In production, + * matching is case- and accent-insensitive. Names are not required to be unique, + * so multiple proxies may match. + */ + name?: string; + /** * Case-insensitive substring match against proxy name, host, or IP address. IDs * match by exact value. diff --git a/tests/api-resources/api-keys.test.ts b/tests/api-resources/api-keys.test.ts index b179ccfb..6456eace 100644 --- a/tests/api-resources/api-keys.test.ts +++ b/tests/api-resources/api-keys.test.ts @@ -86,6 +86,7 @@ describe('resource apiKeys', () => { { include_deleted: true, limit: 100, + name: 'name', offset: 0, query: 'query', sort_by: 'created_at', diff --git a/tests/api-resources/browser-pools.test.ts b/tests/api-resources/browser-pools.test.ts index bb7370a6..e061f651 100644 --- a/tests/api-resources/browser-pools.test.ts +++ b/tests/api-resources/browser-pools.test.ts @@ -87,6 +87,7 @@ describe('resource browserPools', () => { client.browserPools.list( { limit: 1, + name: 'name', offset: 0, query: 'query', }, diff --git a/tests/api-resources/extensions.test.ts b/tests/api-resources/extensions.test.ts index 8d196d93..ecdcdc2e 100644 --- a/tests/api-resources/extensions.test.ts +++ b/tests/api-resources/extensions.test.ts @@ -27,6 +27,7 @@ describe('resource extensions', () => { client.extensions.list( { limit: 1, + name: 'name', offset: 0, query: 'query', }, diff --git a/tests/api-resources/profiles.test.ts b/tests/api-resources/profiles.test.ts index 2cfe7ecc..13ff21e4 100644 --- a/tests/api-resources/profiles.test.ts +++ b/tests/api-resources/profiles.test.ts @@ -68,6 +68,7 @@ describe('resource profiles', () => { client.profiles.list( { limit: 1, + name: 'name', offset: 0, query: 'query', }, diff --git a/tests/api-resources/projects/projects.test.ts b/tests/api-resources/projects/projects.test.ts index 229d6581..f4be4431 100644 --- a/tests/api-resources/projects/projects.test.ts +++ b/tests/api-resources/projects/projects.test.ts @@ -68,6 +68,7 @@ describe('resource projects', () => { client.projects.list( { limit: 100, + name: 'name', offset: 0, query: 'query', }, diff --git a/tests/api-resources/proxies.test.ts b/tests/api-resources/proxies.test.ts index 00eff027..800ba2c0 100644 --- a/tests/api-resources/proxies.test.ts +++ b/tests/api-resources/proxies.test.ts @@ -79,6 +79,7 @@ describe('resource proxies', () => { client.proxies.list( { limit: 1, + name: 'name', offset: 0, query: 'query', }, From cfc45396ab79ee020ffd927ea2cd40291b5496bb Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:56:12 +0000 Subject: [PATCH 05/12] feat: Make the browser pool OpenAPI contract truthful --- .stats.yml | 4 +- src/resources/browser-pools.ts | 80 +++++++++++++++++----------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.stats.yml b/.stats.yml index f7ef7fe6..c403f2c1 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 127 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-b20fcf2fc1cdb91b51ffd354adcd12d63b950ea98b69e13bee6a78a58498c2cd.yml -openapi_spec_hash: bc8b527a963dd2c2d74b6f9e6ca56652 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-d7ab1ecb886cb7f86e7ce0926207db423a6650e8e12e7283a71f8682fbb472ae.yml +openapi_spec_hash: 9323b0ba38d2d50b8506be4d7401c04d config_hash: 77ee715aa17061166f9a02b264a21b8d diff --git a/src/resources/browser-pools.ts b/src/resources/browser-pools.ts index e84ce49d..2617a58a 100644 --- a/src/resources/browser-pools.ts +++ b/src/resources/browser-pools.ts @@ -216,7 +216,7 @@ export namespace BrowserPool { */ export interface BrowserPoolConfig { /** - * Number of browsers to maintain in the pool. The maximum size is determined by + * Number of browsers maintained in the pool. The maximum size is determined by * your organization's pooled sessions limit (the sum of all pool sizes cannot * exceed your limit). */ @@ -226,7 +226,8 @@ export namespace BrowserPool { * Custom Chrome enterprise policy overrides applied to all browsers in this pool. * Keys are Chrome enterprise policy names; values must match their expected types. * Blocked: kernel-managed policies (extensions, proxy, CDP/automation). See - * https://chromeenterprise.google/policies/ + * https://chromeenterprise.google/policies/ The serialized JSON payload is capped + * at 5 MiB. */ chrome_policy?: { [key: string]: unknown }; @@ -236,14 +237,13 @@ export namespace BrowserPool { extensions?: Array; /** - * Percentage of the pool to fill per minute. Defaults to 10. The cap is 25 for - * most organizations but can be raised per-organization, so only the lower bound - * is enforced here. + * Percentage of the pool to fill per minute. The cap is 25 for most organizations + * but can be raised per-organization, so only the lower bound is enforced here. */ fill_rate_per_minute?: number; /** - * If true, launches the browser using a headless image. Defaults to false. + * If true, launches the browser using a headless image. */ headless?: boolean; @@ -268,8 +268,8 @@ export namespace BrowserPool { profile?: BrowserPoolConfig.Profile; /** - * Optional proxy to associate to the browser session. Must reference a proxy in - * the same project as the browser session. + * Optional proxy associated to the browser session. References a proxy in the same + * project as the browser session. */ proxy_id?: string; @@ -297,7 +297,7 @@ export namespace BrowserPool { /** * Default idle timeout in seconds for browsers acquired from this pool before they - * are destroyed. Defaults to 600 seconds. Minimum 10, maximum 259200 (72 hours). + * are destroyed. Minimum 10, maximum 259200 (72 hours). */ timeout_seconds?: number; @@ -485,7 +485,8 @@ export interface BrowserPoolCreateParams { * Custom Chrome enterprise policy overrides applied to all browsers in this pool. * Keys are Chrome enterprise policy names; values must match their expected types. * Blocked: kernel-managed policies (extensions, proxy, CDP/automation). See - * https://chromeenterprise.google/policies/ + * https://chromeenterprise.google/policies/ The serialized JSON payload is capped + * at 5 MiB. */ chrome_policy?: { [key: string]: unknown }; @@ -508,7 +509,7 @@ export interface BrowserPoolCreateParams { /** * If true, launches the browser in kiosk mode to hide address bar and tabs in live - * view. + * view. Defaults to false. */ kiosk_mode?: boolean; @@ -550,7 +551,7 @@ export interface BrowserPoolCreateParams { /** * If true, launches the browser in stealth mode to reduce detection by anti-bot - * mechanisms. + * mechanisms. Defaults to false. */ stealth?: boolean; @@ -601,10 +602,12 @@ export namespace BrowserPoolCreateParams { export interface BrowserPoolUpdateParams { /** - * Custom Chrome enterprise policy overrides applied to all browsers in this pool. - * Keys are Chrome enterprise policy names; values must match their expected types. + * If provided, replaces the custom Chrome enterprise policy overrides applied to + * all browsers in this pool. Empty object clears any previously-set policy. Keys + * are Chrome enterprise policy names; values must match their expected types. * Blocked: kernel-managed policies (extensions, proxy, CDP/automation). See - * https://chromeenterprise.google/policies/ + * https://chromeenterprise.google/policies/ The serialized JSON payload is capped + * at 5 MiB. */ chrome_policy?: { [key: string]: unknown }; @@ -619,30 +622,31 @@ export interface BrowserPoolUpdateParams { discard_all_idle?: boolean; /** - * List of browser extensions to load into the session. Provide each by id or name. + * If provided, replaces the extension list. Empty array clears all + * previously-selected extensions. Omit this field to leave extensions unchanged. */ extensions?: Array; /** - * Percentage of the pool to fill per minute. Defaults to 10. The cap is 25 for - * most organizations but can be raised per-organization, so only the lower bound - * is enforced here. + * If provided, replaces the percentage of the pool to fill per minute. The cap is + * 25 for most organizations but can be raised per-organization, so only the lower + * bound is enforced here. */ fill_rate_per_minute?: number; /** - * If true, launches the browser using a headless image. Defaults to false. + * If provided, replaces whether browsers launch using a headless image. */ headless?: boolean; /** - * If true, launches the browser in kiosk mode to hide address bar and tabs in live - * view. + * If provided, replaces whether browsers launch in kiosk mode. */ kiosk_mode?: boolean; /** - * Optional name for the browser pool. Must be unique within the project. + * If provided, replaces the pool name. Empty string is a no-op; the pool name + * cannot be cleared or reset to empty once assigned. */ name?: string; @@ -656,43 +660,39 @@ export interface BrowserPoolUpdateParams { profile?: BrowserPoolUpdateParams.Profile; /** - * Optional proxy to associate to the browser session. Must reference a proxy in - * the same project as the browser session. + * Empty string clears the previously-selected proxy. Omit this field to leave the + * proxy unchanged. */ proxy_id?: string; /** - * When true, flush idle browsers when the profile the pool uses is updated, so - * pool browsers pick up the latest profile data. Requires a profile to be set on - * the pool. + * If provided, replaces whether idle browsers are flushed when the profile the + * pool uses is updated. Requires a profile to be set on the pool. */ refresh_on_profile_update?: boolean; /** - * Number of browsers to maintain in the pool. The maximum size is determined by - * your organization's pooled sessions limit (the sum of all pool sizes cannot - * exceed your limit). + * If provided, replaces the number of browsers to maintain in the pool. The + * maximum size is determined by your organization's pooled sessions limit (the sum + * of all pool sizes cannot exceed your limit). */ size?: number; /** - * Optional URL to navigate to when a new browser is warmed into the pool. - * Best-effort: failures to navigate do not fail pool fill. Only applied to - * newly-warmed browsers; browsers reused via release/acquire keep whatever URL the - * previous lease left them on. Accepts any URL Chromium can resolve, including - * chrome:// pages. + * If provided, replaces the URL to navigate to when a new browser is warmed into + * the pool. Empty string clears the previously-set URL. Omit this field to leave + * it unchanged. */ start_url?: string; /** - * If true, launches the browser in stealth mode to reduce detection by anti-bot - * mechanisms. + * If provided, replaces whether browsers launch in stealth mode. */ stealth?: boolean; /** - * Default idle timeout in seconds for browsers acquired from this pool before they - * are destroyed. Defaults to 600 seconds. Minimum 10, maximum 259200 (72 hours). + * If provided, replaces the default idle timeout in seconds for browsers acquired + * from this pool before they are destroyed. Minimum 10, maximum 259200 (72 hours). */ timeout_seconds?: number; From f8605df3e781a05a2beddb933273b0eb4fb0d24b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 15:32:45 +0000 Subject: [PATCH 06/12] feat: Persist and echo deployment source identity --- .stats.yml | 4 +- src/resources/deployments.ts | 132 +++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index c403f2c1..f6f61824 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 127 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-d7ab1ecb886cb7f86e7ce0926207db423a6650e8e12e7283a71f8682fbb472ae.yml -openapi_spec_hash: 9323b0ba38d2d50b8506be4d7401c04d +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-d61b5e5ca18ce30a6b4d05483bcd67969ce0f4aee2e9e8c379be4f22f1362b01.yml +openapi_spec_hash: 23121d1c1552e41177b472c4c39d154e config_hash: 77ee715aa17061166f9a02b264a21b8d diff --git a/src/resources/deployments.ts b/src/resources/deployments.ts index 597dad21..8e3c7622 100644 --- a/src/resources/deployments.ts +++ b/src/resources/deployments.ts @@ -165,6 +165,39 @@ export namespace DeploymentStateEvent { */ env_vars?: { [key: string]: string }; + /** + * Hex-encoded SHA-256 checksum of the source archive. For file uploads, this + * hashes the uploaded archive; for GitHub-sourced deployments, this hashes the + * GitHub archive downloaded by the API. Omitted for deployments created before + * this field was recorded. + */ + source_checksum?: string; + + /** + * For GitHub-sourced deployments, the subpath within the repository that was used + * as the deploy root. Omitted when the repo root was used or for file uploads. + */ + source_path?: string; + + /** + * For GitHub-sourced deployments, the git ref as requested at deploy time (branch, + * tag, or commit SHA — not resolved to a commit). Omitted for file uploads. + */ + source_ref?: string; + + /** + * Origin of the deployed source code. This is read-only response provenance; + * `file` indicates an uploaded archive and `github` indicates a repository fetched + * by the API. + */ + source_type?: 'file' | 'github'; + + /** + * For GitHub-sourced deployments, the repository URL that was fetched. Omitted for + * file uploads. + */ + source_url?: string; + /** * Status reason */ @@ -213,6 +246,39 @@ export interface DeploymentCreateResponse { */ env_vars?: { [key: string]: string }; + /** + * Hex-encoded SHA-256 checksum of the source archive. For file uploads, this + * hashes the uploaded archive; for GitHub-sourced deployments, this hashes the + * GitHub archive downloaded by the API. Omitted for deployments created before + * this field was recorded. + */ + source_checksum?: string; + + /** + * For GitHub-sourced deployments, the subpath within the repository that was used + * as the deploy root. Omitted when the repo root was used or for file uploads. + */ + source_path?: string; + + /** + * For GitHub-sourced deployments, the git ref as requested at deploy time (branch, + * tag, or commit SHA — not resolved to a commit). Omitted for file uploads. + */ + source_ref?: string; + + /** + * Origin of the deployed source code. This is read-only response provenance; + * `file` indicates an uploaded archive and `github` indicates a repository fetched + * by the API. + */ + source_type?: 'file' | 'github'; + + /** + * For GitHub-sourced deployments, the repository URL that was fetched. Omitted for + * file uploads. + */ + source_url?: string; + /** * Status reason */ @@ -260,6 +326,39 @@ export interface DeploymentRetrieveResponse { */ env_vars?: { [key: string]: string }; + /** + * Hex-encoded SHA-256 checksum of the source archive. For file uploads, this + * hashes the uploaded archive; for GitHub-sourced deployments, this hashes the + * GitHub archive downloaded by the API. Omitted for deployments created before + * this field was recorded. + */ + source_checksum?: string; + + /** + * For GitHub-sourced deployments, the subpath within the repository that was used + * as the deploy root. Omitted when the repo root was used or for file uploads. + */ + source_path?: string; + + /** + * For GitHub-sourced deployments, the git ref as requested at deploy time (branch, + * tag, or commit SHA — not resolved to a commit). Omitted for file uploads. + */ + source_ref?: string; + + /** + * Origin of the deployed source code. This is read-only response provenance; + * `file` indicates an uploaded archive and `github` indicates a repository fetched + * by the API. + */ + source_type?: 'file' | 'github'; + + /** + * For GitHub-sourced deployments, the repository URL that was fetched. Omitted for + * file uploads. + */ + source_url?: string; + /** * Status reason */ @@ -307,6 +406,39 @@ export interface DeploymentListResponse { */ env_vars?: { [key: string]: string }; + /** + * Hex-encoded SHA-256 checksum of the source archive. For file uploads, this + * hashes the uploaded archive; for GitHub-sourced deployments, this hashes the + * GitHub archive downloaded by the API. Omitted for deployments created before + * this field was recorded. + */ + source_checksum?: string; + + /** + * For GitHub-sourced deployments, the subpath within the repository that was used + * as the deploy root. Omitted when the repo root was used or for file uploads. + */ + source_path?: string; + + /** + * For GitHub-sourced deployments, the git ref as requested at deploy time (branch, + * tag, or commit SHA — not resolved to a commit). Omitted for file uploads. + */ + source_ref?: string; + + /** + * Origin of the deployed source code. This is read-only response provenance; + * `file` indicates an uploaded archive and `github` indicates a repository fetched + * by the API. + */ + source_type?: 'file' | 'github'; + + /** + * For GitHub-sourced deployments, the repository URL that was fetched. Omitted for + * file uploads. + */ + source_url?: string; + /** * Status reason */ From d1a70cd2c01e78e695bb7926c16a3c026c77a2f3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 15:59:42 +0000 Subject: [PATCH 07/12] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6f61824..38aa69be 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 127 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-d61b5e5ca18ce30a6b4d05483bcd67969ce0f4aee2e9e8c379be4f22f1362b01.yml -openapi_spec_hash: 23121d1c1552e41177b472c4c39d154e +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-9143bc729ef60beffa0bbd9b601bb095083e41e23c8994553e69302f586882f5.yml +openapi_spec_hash: bd04c530cfa8188af0e63a784129645d config_hash: 77ee715aa17061166f9a02b264a21b8d From adaf0372de1e2eaf1450a93d510c51f9b843957c Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 19:29:07 +0000 Subject: [PATCH 08/12] feat: Auto-default refresh_on_profile_update when browser pool profile changes --- .stats.yml | 4 ++-- src/resources/browser-pools.ts | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.stats.yml b/.stats.yml index 38aa69be..5882e06c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 127 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-9143bc729ef60beffa0bbd9b601bb095083e41e23c8994553e69302f586882f5.yml -openapi_spec_hash: bd04c530cfa8188af0e63a784129645d +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-25b48b79d356843aeda41e5e5c3c407c5bd5c12f9548500ffc0a6696e6acd941.yml +openapi_spec_hash: f710169690ab7aca30c91968e752cff7 config_hash: 77ee715aa17061166f9a02b264a21b8d diff --git a/src/resources/browser-pools.ts b/src/resources/browser-pools.ts index 2617a58a..086e30cf 100644 --- a/src/resources/browser-pools.ts +++ b/src/resources/browser-pools.ts @@ -275,8 +275,8 @@ export namespace BrowserPool { /** * When true, flush idle browsers when the profile the pool uses is updated, so - * pool browsers pick up the latest profile data. Requires a profile to be set on - * the pool. + * pool browsers pick up the latest profile data. When a profile is provided during + * creation, this defaults to true. Requires a profile to be set on the pool. */ refresh_on_profile_update?: boolean; @@ -535,8 +535,8 @@ export interface BrowserPoolCreateParams { /** * When true, flush idle browsers when the profile the pool uses is updated, so - * pool browsers pick up the latest profile data. Requires a profile to be set on - * the pool. + * pool browsers pick up the latest profile data. When a profile is provided during + * creation, this defaults to true. Requires a profile to be set on the pool. */ refresh_on_profile_update?: boolean; @@ -667,7 +667,10 @@ export interface BrowserPoolUpdateParams { /** * If provided, replaces whether idle browsers are flushed when the profile the - * pool uses is updated. Requires a profile to be set on the pool. + * pool uses is updated. When the pool's profile reference is changed (including + * newly attached) and this field is omitted, it defaults to true. Re-sending the + * same profile reference leaves this setting unchanged. Clearing the profile also + * disables this setting. Requires a profile to be set on the pool. */ refresh_on_profile_update?: boolean; From 6fca5191da0d3c4512a74e3246df0591459b6d29 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 02:12:56 +0000 Subject: [PATCH 09/12] fix(ci): bump @arethetypeswrong/cli to ^0.18.0 and run CI workflows on Node 24 --- .github/workflows/ci.yml | 6 ++-- .github/workflows/publish-npm.yml | 2 +- package.json | 2 +- yarn.lock | 51 +++++++++++++++++++------------ 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d920d7bf..3125f0fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: - name: Set up Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '24' - name: Bootstrap run: ./scripts/bootstrap @@ -48,7 +48,7 @@ jobs: - name: Set up Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '24' - name: Bootstrap run: ./scripts/bootstrap @@ -85,7 +85,7 @@ jobs: - name: Set up Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '24' - name: Bootstrap run: ./scripts/bootstrap diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index 664e42c3..d01da10b 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -22,7 +22,7 @@ jobs: - name: Set up Node uses: actions/setup-node@3235b876344d2a9aa001b8d1453c930bba69e610 # v3.9.1 with: - node-version: '20' + node-version: '24' - name: Install dependencies run: | diff --git a/package.json b/package.json index 7757d07a..a438d296 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "fix": "./scripts/format" }, "devDependencies": { - "@arethetypeswrong/cli": "^0.17.0", + "@arethetypeswrong/cli": "^0.18.0", "@swc/core": "^1.3.102", "@swc/jest": "^0.2.29", "@types/busboy": "^1.5.4", diff --git a/yarn.lock b/yarn.lock index 3540e212..4bc693e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,12 +12,12 @@ resolved "https://registry.yarnpkg.com/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz#ba9494f85eb83017c5c855763969caf1d0adea00" integrity sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw== -"@arethetypeswrong/cli@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@arethetypeswrong/cli/-/cli-0.17.0.tgz#f97f10926b3f9f9eb5117550242d2e06c25cadac" - integrity sha512-xSMW7bfzVWpYw5JFgZqBXqr6PdR0/REmn3DkxCES5N0JTcB0CVgbIynJCvKBFmXaPc3hzmmTrb7+yPDRoOSZdA== +"@arethetypeswrong/cli@^0.18.0": + version "0.18.4" + resolved "https://registry.yarnpkg.com/@arethetypeswrong/cli/-/cli-0.18.4.tgz#c31f54f3b0d0e0f3256ab3edb6530beeb5e64b4b" + integrity sha512-kNWo6LTzGAuLYPpJ7Sgo63whSUeeSuKMlYx6IBgzs4ONEG807gW4hSSENvpeCHzO2H2wIzG5EFl0OKBbqGBAyA== dependencies: - "@arethetypeswrong/core" "0.17.0" + "@arethetypeswrong/core" "0.18.4" chalk "^4.1.2" cli-table3 "^0.6.3" commander "^10.0.1" @@ -25,15 +25,16 @@ marked-terminal "^7.1.0" semver "^7.5.4" -"@arethetypeswrong/core@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@arethetypeswrong/core/-/core-0.17.0.tgz#abb3b5f425056d37193644c2a2de4aecf866b76b" - integrity sha512-FHyhFizXNetigTVsIhqXKGYLpazPS5YNojEPpZEUcBPt9wVvoEbNIvG+hybuBR+pjlRcbyuqhukHZm1fr+bDgA== +"@arethetypeswrong/core@0.18.4": + version "0.18.4" + resolved "https://registry.yarnpkg.com/@arethetypeswrong/core/-/core-0.18.4.tgz#24edea3d651dea7d32bf6f1cc9ee9a00db39de49" + integrity sha512-M5F0ePyN6h2Z6XxRiyIPqjGbltotXLjR0CKA0uKspsDu0QmgTNYvRb4RSQPMUs2ZXZHCCYpbaZbFbYOXLxCjUA== dependencies: "@andrewbranch/untar.js" "^1.0.3" + "@loaderkit/resolve" "^1.0.2" cjs-module-lexer "^1.2.3" - fflate "^0.8.2" - lru-cache "^10.4.3" + fflate "^0.8.3" + lru-cache "^11.0.1" semver "^7.5.4" typescript "5.6.1-rc" validate-npm-package-name "^5.0.0" @@ -306,6 +307,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@braidai/lang@^1.0.0": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@braidai/lang/-/lang-1.1.2.tgz#65bc2bc1db6d00e153b95ac7006f4573e289e9be" + integrity sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -688,6 +694,13 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@loaderkit/resolve@^1.0.2": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@loaderkit/resolve/-/resolve-1.0.6.tgz#8d45341e688faecc25b3ae919c0f45d94c4e26c9" + integrity sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg== + dependencies: + "@braidai/lang" "^1.0.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1710,10 +1723,10 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fflate@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" - integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== +fflate@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.3.tgz#bc27d8eb30343d4d512abb03480202ce65d825fc" + integrity sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA== file-entry-cache@^8.0.0: version "8.0.0" @@ -2504,10 +2517,10 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lru-cache@^10.4.3: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^11.0.1: + version "11.5.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.2.tgz#00e16665c90c620fba14a3c368732a976493f760" + integrity sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g== lru-cache@^5.1.1: version "5.1.1" From a3b871374783991780c24b16fee40945c4e383fd Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 15:43:48 +0000 Subject: [PATCH 10/12] feat: Support multiple audit log method exclusions --- .stats.yml | 4 ++-- src/resources/audit-logs.ts | 4 ++-- tests/api-resources/audit-logs.test.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.stats.yml b/.stats.yml index 5882e06c..a855b9ce 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 127 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-25b48b79d356843aeda41e5e5c3c407c5bd5c12f9548500ffc0a6696e6acd941.yml -openapi_spec_hash: f710169690ab7aca30c91968e752cff7 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-f0003e336fc8dc54d9cac4728c847fb80c32d50a9165738c5b70aa83a09bb0f5.yml +openapi_spec_hash: a2099eec27728b1cfd9032dc71b9bb57 config_hash: 77ee715aa17061166f9a02b264a21b8d diff --git a/src/resources/audit-logs.ts b/src/resources/audit-logs.ts index 85df4103..9367dc9a 100644 --- a/src/resources/audit-logs.ts +++ b/src/resources/audit-logs.ts @@ -119,7 +119,7 @@ export interface AuditLogListParams extends PageTokenPaginationParams { /** * Filter out results by HTTP method. */ - exclude_method?: string; + exclude_method?: Array; /** * Filter by HTTP method. @@ -166,7 +166,7 @@ export interface AuditLogExportChunkParams { /** * Filter out results by HTTP method. */ - exclude_method?: string; + exclude_method?: Array; /** * Encoding for the returned chunk. diff --git a/tests/api-resources/audit-logs.test.ts b/tests/api-resources/audit-logs.test.ts index b1773ceb..ebce088d 100644 --- a/tests/api-resources/audit-logs.test.ts +++ b/tests/api-resources/audit-logs.test.ts @@ -29,7 +29,7 @@ describe('resource auditLogs', () => { end: '2026-01-02T00:00:00Z', start: '2026-01-01T00:00:00Z', auth_strategy: 'auth_strategy', - exclude_method: 'exclude_method', + exclude_method: ['string'], limit: 1, method: 'method', page_token: 'page_token', @@ -46,7 +46,7 @@ describe('resource auditLogs', () => { start: '2026-01-01T00:00:00Z', auth_strategy: 'auth_strategy', cursor: 'cursor', - exclude_method: 'exclude_method', + exclude_method: ['string'], format: 'jsonl', limit: 1, method: 'method', From ddf0a65dc7fb1a64e299173462266a09af0d2605 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:13:47 +0000 Subject: [PATCH 11/12] feat: Expose telemetry exception message in API/SDK --- .stats.yml | 4 ++-- src/resources/browsers/telemetry.ts | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.stats.yml b/.stats.yml index a855b9ce..04d533eb 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 127 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-f0003e336fc8dc54d9cac4728c847fb80c32d50a9165738c5b70aa83a09bb0f5.yml -openapi_spec_hash: a2099eec27728b1cfd9032dc71b9bb57 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-1413d61d06059008b4c1e204c783d8b2e7dca9af23f6e3b6d2552493ea2d9853.yml +openapi_spec_hash: 80aca500caddd300cb03a6daf568fddb config_hash: 77ee715aa17061166f9a02b264a21b8d diff --git a/src/resources/browsers/telemetry.ts b/src/resources/browsers/telemetry.ts index c11affc2..7b41c677 100644 --- a/src/resources/browsers/telemetry.ts +++ b/src/resources/browsers/telemetry.ts @@ -371,7 +371,10 @@ export namespace BrowserConsoleErrorEvent { */ export interface Data extends TelemetryAPI.BrowserEventContext { /** - * Error message text. Present in both source paths. + * Human-readable error text, as the browser console would display it. For + * console.error() calls, the first argument coerced to a string. For uncaught + * exceptions, the prefix and error message, e.g. "Uncaught Error: boom" or + * "Uncaught (in promise) TypeError: x is not a function". */ text: string; From 7d7425a3c0924900d3f2d60ec18a473df5a025d0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 18:30:52 +0000 Subject: [PATCH 12/12] release: 0.78.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 25 +++++++++++++++++++++++++ package.json | 2 +- src/version.ts | 2 +- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 5f3243d4..2fc68753 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.76.0" + ".": "0.78.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index a8b606f8..c6fc61d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## 0.78.0 (2026-07-13) + +Full Changelog: [v0.76.0...v0.78.0](https://github.com/kernel/kernel-node-sdk/compare/v0.76.0...v0.78.0) + +### Features + +* Add exact-match name filter to list endpoints ([dd94a68](https://github.com/kernel/kernel-node-sdk/commit/dd94a6824da367c28f29a41a50ff220a7bbd0015)) +* Add name-only rename for profiles and proxies ([2fe4124](https://github.com/kernel/kernel-node-sdk/commit/2fe41244b7e184914c6858a9533132d65b4380ba)) +* Auto-default refresh_on_profile_update when browser pool profile changes ([adaf037](https://github.com/kernel/kernel-node-sdk/commit/adaf0372de1e2eaf1450a93d510c51f9b843957c)) +* Document name uniqueness and query match semantics ([670f7c3](https://github.com/kernel/kernel-node-sdk/commit/670f7c32c4c63064198a53bab24117354a26832d)) +* Expose telemetry exception message in API/SDK ([ddf0a65](https://github.com/kernel/kernel-node-sdk/commit/ddf0a65dc7fb1a64e299173462266a09af0d2605)) +* Make the browser pool OpenAPI contract truthful ([cfc4539](https://github.com/kernel/kernel-node-sdk/commit/cfc45396ab79ee020ffd927ea2cd40291b5496bb)) +* Persist and echo deployment source identity ([f8605df](https://github.com/kernel/kernel-node-sdk/commit/f8605df3e781a05a2beddb933273b0eb4fb0d24b)) +* Support multiple audit log method exclusions ([a3b8713](https://github.com/kernel/kernel-node-sdk/commit/a3b871374783991780c24b16fee40945c4e383fd)) + + +### Bug Fixes + +* **ci:** bump @arethetypeswrong/cli to ^0.18.0 and run CI workflows on Node 24 ([6fca519](https://github.com/kernel/kernel-node-sdk/commit/6fca5191da0d3c4512a74e3246df0591459b6d29)) + + +### Documentation + +* **openapi:** describe unified concurrency limit, deprecate max_pooled_sessions (CUS-275) ([37d3e27](https://github.com/kernel/kernel-node-sdk/commit/37d3e277f98b068f23c5fc85e7b26269c254827c)) + ## 0.76.0 (2026-07-09) Full Changelog: [v0.75.0...v0.76.0](https://github.com/kernel/kernel-node-sdk/compare/v0.75.0...v0.76.0) diff --git a/package.json b/package.json index a438d296..58db90c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@onkernel/sdk", - "version": "0.76.0", + "version": "0.78.0", "description": "The official TypeScript library for the Kernel API", "author": "Kernel <>", "types": "dist/index.d.ts", diff --git a/src/version.ts b/src/version.ts index 2c80dbec..3d604761 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.76.0'; // x-release-please-version +export const VERSION = '0.78.0'; // x-release-please-version