Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.68.0"
".": "0.69.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 120
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-d26459bd3514237e8d757be3cbdc76ca62f6083504b85601e57db830888964f7.yml
openapi_spec_hash: 5dd151a8099398819a97692c1c60c3c6
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-cde481b2f320ce48f83db84ae96226b0e7568146c9387c4fefebf286ecb0dd0a.yml
openapi_spec_hash: 6bd86d767290fcd7e2a6aae26dff5417
config_hash: 03c7e57f268c750e2415831662e95969
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Changelog

## 0.69.0 (2026-06-18)

Full Changelog: [v0.68.0...v0.69.0](https://github.com/kernel/kernel-node-sdk/compare/v0.68.0...v0.69.0)

### Features

* Add free-text search to remaining paginated list endpoints ([bc595a5](https://github.com/kernel/kernel-node-sdk/commit/bc595a51a8d1f53ec70b56ecf2fbc0ade8d471ff))


### Bug Fixes

* **client:** send content-type header for requests with an omitted optional body ([2cde4eb](https://github.com/kernel/kernel-node-sdk/commit/2cde4eb8a2469ffe31bad3462e9c3e3339d9bd7c))

## 0.68.0 (2026-06-15)

Full Changelog: [v0.67.0...v0.68.0](https://github.com/kernel/kernel-node-sdk/compare/v0.67.0...v0.68.0)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onkernel/sdk",
"version": "0.68.0",
"version": "0.69.0",
"description": "The official TypeScript library for the Kernel API",
"author": "Kernel <>",
"types": "dist/index.d.ts",
Expand Down
10 changes: 9 additions & 1 deletion src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -880,11 +880,19 @@ export class Kernel {
return () => controller.abort();
}

private buildBody({ options: { body, headers: rawHeaders } }: { options: FinalRequestOptions }): {
private buildBody({ options }: { options: FinalRequestOptions }): {
bodyHeaders: HeadersLike;
body: BodyInit | undefined;
} {
const { body, headers: rawHeaders } = options;
if (!body) {
// A resource method always passes a `body` key when its operation defines a
// request body, even if the caller omitted an optional body param. Keep the
// content-type for those, and only elide it for operations with no body at
// all (e.g. GET/DELETE).
if (body == null && 'body' in options) {
return this.#encoder({ body, headers: buildHeaders([rawHeaders]) });

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Null body sends JSON null

Low Severity

The new optional-body branch uses body == null, so an explicit null body (e.g. apiKeys.rotate(id, null)) runs through #encoder and JSON.stringify(null) becomes the string "null", which is attached to the fetch. Omitted optional bodies are undefined and correctly get Content-Type without a body; null now sends a literal JSON null entity, which differs from pre-change behavior and from the stated fix for omitted params.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 224b078. Configure here.

}
return { bodyHeaders: undefined, body: undefined };
}
const headers = buildHeaders([rawHeaders]);
Expand Down
5 changes: 5 additions & 0 deletions src/resources/auth/connections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1398,6 +1398,11 @@ export interface ConnectionListParams extends OffsetPaginationParams {
* Filter by profile name
*/
profile_name?: string;

/**
* Search auth connections by ID, domain, or profile name.
*/
query?: string;
}

export interface ConnectionLoginParams {
Expand Down
7 changes: 6 additions & 1 deletion src/resources/browser-pools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,12 @@ export interface BrowserPoolUpdateParams {
viewport?: Shared.BrowserViewport;
}

export interface BrowserPoolListParams extends OffsetPaginationParams {}
export interface BrowserPoolListParams extends OffsetPaginationParams {
/**
* Search browser pools by name or ID.
*/
query?: string;
}

export interface BrowserPoolDeleteParams {
/**
Expand Down
7 changes: 6 additions & 1 deletion src/resources/credential-providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,12 @@ export interface CredentialProviderUpdateParams {
priority?: number;
}

export interface CredentialProviderListParams extends OffsetPaginationParams {}
export interface CredentialProviderListParams extends OffsetPaginationParams {
/**
* Search credential providers by name or ID.
*/
query?: string;
}

export declare namespace CredentialProviders {
export {
Expand Down
5 changes: 5 additions & 0 deletions src/resources/credentials.ts
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,11 @@ export interface CredentialListParams extends OffsetPaginationParams {
* Filter by domain
*/
domain?: string;

/**
* Search credentials by name, domain, or ID.
*/
query?: string;
}

export declare namespace Credentials {
Expand Down
5 changes: 5 additions & 0 deletions src/resources/deployments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,11 @@ export interface DeploymentListParams extends OffsetPaginationParams {
* Filter results by application version. Requires app_name to be set.
*/
app_version?: string;

/**
* Search deployments by ID or app name.
*/
query?: string;
}

export interface DeploymentFollowParams {
Expand Down
7 changes: 6 additions & 1 deletion src/resources/extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,12 @@ export interface ExtensionUploadResponse {
name?: string | null;
}

export interface ExtensionListParams extends OffsetPaginationParams {}
export interface ExtensionListParams extends OffsetPaginationParams {
/**
* Search extensions by name or ID.
*/
query?: string;
}

export interface ExtensionDownloadFromChromeStoreParams {
/**
Expand Down
5 changes: 5 additions & 0 deletions src/resources/invocations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,11 @@ export interface InvocationListParams extends OffsetPaginationParams {
*/
deployment_id?: string;

/**
* Search invocations by ID, app name, or action name.
*/
query?: string;

/**
* Show invocations that have started since the given time (RFC timestamps or
* durations like 5m).
Expand Down
7 changes: 6 additions & 1 deletion src/resources/proxies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,12 @@ export namespace ProxyCreateParams {
}
}

export interface ProxyListParams extends OffsetPaginationParams {}
export interface ProxyListParams extends OffsetPaginationParams {
/**
* Search proxies by name, host, IP address, or ID.
*/
query?: string;
}

export interface ProxyCheckParams {
/**
Expand Down
2 changes: 1 addition & 1 deletion src/version.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const VERSION = '0.68.0'; // x-release-please-version
export const VERSION = '0.69.0'; // x-release-please-version
1 change: 1 addition & 0 deletions tests/api-resources/auth/connections.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ describe('resource connections', () => {
limit: 100,
offset: 0,
profile_name: 'profile_name',
query: 'query',
},
{ path: '/_stainless_unknown_path' },
),
Expand Down
9 changes: 8 additions & 1 deletion tests/api-resources/browser-pools.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,14 @@ describe('resource browserPools', () => {
test.skip('list: request options and 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.browserPools.list({ limit: 1, offset: 0 }, { path: '/_stainless_unknown_path' }),
client.browserPools.list(
{
limit: 1,
offset: 0,
query: 'query',
},
{ path: '/_stainless_unknown_path' },
),
).rejects.toThrow(Kernel.NotFoundError);
});

Expand Down
9 changes: 8 additions & 1 deletion tests/api-resources/credential-providers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,14 @@ describe('resource credentialProviders', () => {
test.skip('list: request options and 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.credentialProviders.list({ limit: 1, offset: 0 }, { path: '/_stainless_unknown_path' }),
client.credentialProviders.list(
{
limit: 1,
offset: 0,
query: 'query',
},
{ path: '/_stainless_unknown_path' },
),
).rejects.toThrow(Kernel.NotFoundError);
});

Expand Down
1 change: 1 addition & 0 deletions tests/api-resources/credentials.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ describe('resource credentials', () => {
domain: 'domain',
limit: 100,
offset: 0,
query: 'query',
},
{ path: '/_stainless_unknown_path' },
),
Expand Down
1 change: 1 addition & 0 deletions tests/api-resources/deployments.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ describe('resource deployments', () => {
app_version: 'app_version',
limit: 1,
offset: 0,
query: 'query',
},
{ path: '/_stainless_unknown_path' },
),
Expand Down
9 changes: 8 additions & 1 deletion tests/api-resources/extensions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,14 @@ describe('resource extensions', () => {
test.skip('list: request options and 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.extensions.list({ limit: 1, offset: 0 }, { path: '/_stainless_unknown_path' }),
client.extensions.list(
{
limit: 1,
offset: 0,
query: 'query',
},
{ path: '/_stainless_unknown_path' },
),
).rejects.toThrow(Kernel.NotFoundError);
});

Expand Down
1 change: 1 addition & 0 deletions tests/api-resources/invocations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ describe('resource invocations', () => {
deployment_id: 'deployment_id',
limit: 1,
offset: 0,
query: 'query',
since: '2025-06-20T12:00:00Z',
status: 'queued',
version: 'version',
Expand Down
9 changes: 8 additions & 1 deletion tests/api-resources/proxies.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,14 @@ describe('resource proxies', () => {
test.skip('list: request options and 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.proxies.list({ limit: 1, offset: 0 }, { path: '/_stainless_unknown_path' }),
client.proxies.list(
{
limit: 1,
offset: 0,
query: 'query',
},
{ path: '/_stainless_unknown_path' },
),
).rejects.toThrow(Kernel.NotFoundError);
});

Expand Down
Loading