From fe32267f011df4444169d45787bac50b6249eab4 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 4 Oct 2025 02:21:20 +0000
Subject: [PATCH 1/5] =?UTF-8?q?chore(jsdoc):=20fix=20@link=20annotations?=
=?UTF-8?q?=20to=20refer=20only=20to=20parts=20of=20the=20package=E2=80=98?=
=?UTF-8?q?s=20public=20interface?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/internal/to-file.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/internal/to-file.ts b/src/internal/to-file.ts
index 245e849..30eada3 100644
--- a/src/internal/to-file.ts
+++ b/src/internal/to-file.ts
@@ -73,7 +73,7 @@ export type ToFileInput =
/**
* Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats
- * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s
+ * @param value the raw content of the file. Can be an {@link Uploadable}, BlobLikePart, or AsyncIterable of BlobLikeParts
* @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible
* @param {Object=} options additional properties
* @param {string=} options.type the MIME type of the content
From aac1084dca1bb547f314144891ed277ff82f2c89 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 7 Oct 2025 02:47:17 +0000
Subject: [PATCH 2/5] chore(internal): use npm pack for build uploads
---
scripts/utils/upload-artifact.sh | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/scripts/utils/upload-artifact.sh b/scripts/utils/upload-artifact.sh
index 38abeb4..efeeb16 100755
--- a/scripts/utils/upload-artifact.sh
+++ b/scripts/utils/upload-artifact.sh
@@ -12,9 +12,11 @@ if [[ "$SIGNED_URL" == "null" ]]; then
exit 1
fi
-UPLOAD_RESPONSE=$(tar "${BASE_PATH:+-C$BASE_PATH}" -cz "${ARTIFACT_PATH:-dist}" | curl -v -X PUT \
+TARBALL=$(cd dist && npm pack --silent)
+
+UPLOAD_RESPONSE=$(curl -v -X PUT \
-H "Content-Type: application/gzip" \
- --data-binary @- "$SIGNED_URL" 2>&1)
+ --data-binary "@dist/$TARBALL" "$SIGNED_URL" 2>&1)
if echo "$UPLOAD_RESPONSE" | grep -q "HTTP/[0-9.]* 200"; then
echo -e "\033[32mUploaded build to Stainless storage.\033[0m"
From 77333abe7f7ee0c53da495adcec728b2fed7f831 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 7 Oct 2025 13:43:59 +0000
Subject: [PATCH 3/5] feat: WIP browser extensions
---
.stats.yml | 8 +-
api.md | 16 ++
src/client.ts | 19 ++
src/resources/browsers/browsers.ts | 77 +++++++
src/resources/browsers/index.ts | 1 +
src/resources/extensions.ts | 200 ++++++++++++++++++
src/resources/index.ts | 8 +
tests/api-resources/browsers/browsers.test.ts | 24 ++-
tests/api-resources/extensions.test.ts | 60 ++++++
9 files changed, 408 insertions(+), 5 deletions(-)
create mode 100644 src/resources/extensions.ts
create mode 100644 tests/api-resources/extensions.test.ts
diff --git a/.stats.yml b/.stats.yml
index 0af2575..b296ff8 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 51
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-8a6175a75caa75c3de5400edf97a34e526ac3f62c63955375437461581deb0c2.yml
-openapi_spec_hash: 1a880e4ce337a0e44630e6d87ef5162a
-config_hash: 49c2ff978aaa5ccb4ce324a72f116010
+configured_endpoints: 57
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-936db268b3dcae5d64bd5d590506d8134304ffcbf67389eb9b1555b3febfd4cb.yml
+openapi_spec_hash: 145485087adf1b28c052bacb4df68462
+config_hash: 5236f9b34e39dc1930e36a88c714abd4
diff --git a/api.md b/api.md
index 9165c58..9bf2b7d 100644
--- a/api.md
+++ b/api.md
@@ -73,6 +73,7 @@ Methods:
- client.browsers.list() -> BrowserListResponse
- client.browsers.delete({ ...params }) -> void
- client.browsers.deleteByID(id) -> void
+- client.browsers.uploadExtensions(id, { ...params }) -> void
## Replays
@@ -177,3 +178,18 @@ Methods:
- client.proxies.retrieve(id) -> ProxyRetrieveResponse
- client.proxies.list() -> ProxyListResponse
- client.proxies.delete(id) -> void
+
+# Extensions
+
+Types:
+
+- ExtensionListResponse
+- ExtensionUploadResponse
+
+Methods:
+
+- client.extensions.list() -> ExtensionListResponse
+- client.extensions.delete(idOrName) -> void
+- client.extensions.download(idOrName) -> Response
+- client.extensions.downloadFromChromeStore({ ...params }) -> Response
+- client.extensions.upload({ ...params }) -> ExtensionUploadResponse
diff --git a/src/client.ts b/src/client.ts
index d5dc675..2b74698 100644
--- a/src/client.ts
+++ b/src/client.ts
@@ -32,6 +32,13 @@ import {
Deployments,
} from './resources/deployments';
import { KernelApp } from './core/app-framework';
+import {
+ ExtensionDownloadFromChromeStoreParams,
+ ExtensionListResponse,
+ ExtensionUploadParams,
+ ExtensionUploadResponse,
+ Extensions,
+} from './resources/extensions';
import {
InvocationCreateParams,
InvocationCreateResponse,
@@ -61,6 +68,7 @@ import {
BrowserListResponse,
BrowserPersistence,
BrowserRetrieveResponse,
+ BrowserUploadExtensionsParams,
Browsers,
Profile,
} from './resources/browsers/browsers';
@@ -832,6 +840,7 @@ export class Kernel {
browsers: API.Browsers = new API.Browsers(this);
profiles: API.Profiles = new API.Profiles(this);
proxies: API.Proxies = new API.Proxies(this);
+ extensions: API.Extensions = new API.Extensions(this);
}
Kernel.Deployments = Deployments;
@@ -840,6 +849,7 @@ Kernel.Invocations = Invocations;
Kernel.Browsers = Browsers;
Kernel.Profiles = Profiles;
Kernel.Proxies = Proxies;
+Kernel.Extensions = Extensions;
export declare namespace Kernel {
export type RequestOptions = Opts.RequestOptions;
@@ -889,6 +899,7 @@ export declare namespace Kernel {
type BrowserListResponse as BrowserListResponse,
type BrowserCreateParams as BrowserCreateParams,
type BrowserDeleteParams as BrowserDeleteParams,
+ type BrowserUploadExtensionsParams as BrowserUploadExtensionsParams,
};
export {
@@ -905,6 +916,14 @@ export declare namespace Kernel {
type ProxyCreateParams as ProxyCreateParams,
};
+ export {
+ Extensions as Extensions,
+ type ExtensionListResponse as ExtensionListResponse,
+ type ExtensionUploadResponse as ExtensionUploadResponse,
+ type ExtensionDownloadFromChromeStoreParams as ExtensionDownloadFromChromeStoreParams,
+ type ExtensionUploadParams as ExtensionUploadParams,
+ };
+
export type AppAction = API.AppAction;
export type ErrorDetail = API.ErrorDetail;
export type ErrorEvent = API.ErrorEvent;
diff --git a/src/resources/browsers/browsers.ts b/src/resources/browsers/browsers.ts
index 8368194..32681da 100644
--- a/src/resources/browsers/browsers.ts
+++ b/src/resources/browsers/browsers.ts
@@ -48,8 +48,10 @@ import {
Fs,
} from './fs/fs';
import { APIPromise } from '../../core/api-promise';
+import { type Uploadable } from '../../core/uploads';
import { buildHeaders } from '../../internal/headers';
import { RequestOptions } from '../../internal/request-options';
+import { multipartFormRequestOptions } from '../../internal/uploads';
import { path } from '../../internal/utils/path';
export class Browsers extends APIResource {
@@ -134,6 +136,36 @@ export class Browsers extends APIResource {
headers: buildHeaders([{ Accept: '*/*' }, options?.headers]),
});
}
+
+ /**
+ * Loads one or more unpacked extensions and restarts Chromium on the browser
+ * instance.
+ *
+ * @example
+ * ```ts
+ * await client.browsers.uploadExtensions('id', {
+ * extensions: [
+ * {
+ * name: 'name',
+ * zip_file: fs.createReadStream('path/to/file'),
+ * },
+ * ],
+ * });
+ * ```
+ */
+ uploadExtensions(
+ id: string,
+ body: BrowserUploadExtensionsParams,
+ options?: RequestOptions,
+ ): APIPromise {
+ return this._client.post(
+ path`/browsers/${id}/extensions`,
+ multipartFormRequestOptions(
+ { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]) },
+ this._client,
+ ),
+ );
+ }
}
/**
@@ -340,6 +372,11 @@ export namespace BrowserListResponse {
}
export interface BrowserCreateParams {
+ /**
+ * List of browser extensions to load into the session. Provide each by id or name.
+ */
+ extensions?: Array;
+
/**
* If true, launches the browser using a headless image (no VNC/GUI). Defaults to
* false.
@@ -387,6 +424,23 @@ export interface BrowserCreateParams {
}
export namespace BrowserCreateParams {
+ /**
+ * Extension selection for the browser session. Provide either id or name of an
+ * extension uploaded to Kernel.
+ */
+ export interface Extension {
+ /**
+ * Extension ID to load for this browser session
+ */
+ id?: string;
+
+ /**
+ * Extension name to load for this browser session (instead of id). Must be 1-255
+ * characters, using letters, numbers, dots, underscores, or hyphens.
+ */
+ name?: string;
+ }
+
/**
* Profile selection for the browser session. Provide either id or name. If
* specified, the matching profile will be loaded into the browser session.
@@ -419,6 +473,28 @@ export interface BrowserDeleteParams {
persistent_id: string;
}
+export interface BrowserUploadExtensionsParams {
+ /**
+ * List of extensions to upload and activate
+ */
+ extensions: Array;
+}
+
+export namespace BrowserUploadExtensionsParams {
+ export interface Extension {
+ /**
+ * Folder name to place the extension under /home/kernel/extensions/
+ */
+ name: string;
+
+ /**
+ * Zip archive containing an unpacked Chromium extension (must include
+ * manifest.json)
+ */
+ zip_file: Uploadable;
+ }
+}
+
Browsers.Replays = Replays;
Browsers.Fs = Fs;
Browsers.Process = Process;
@@ -433,6 +509,7 @@ export declare namespace Browsers {
type BrowserListResponse as BrowserListResponse,
type BrowserCreateParams as BrowserCreateParams,
type BrowserDeleteParams as BrowserDeleteParams,
+ type BrowserUploadExtensionsParams as BrowserUploadExtensionsParams,
};
export {
diff --git a/src/resources/browsers/index.ts b/src/resources/browsers/index.ts
index bcd5b40..71eab3b 100644
--- a/src/resources/browsers/index.ts
+++ b/src/resources/browsers/index.ts
@@ -9,6 +9,7 @@ export {
type BrowserListResponse,
type BrowserCreateParams,
type BrowserDeleteParams,
+ type BrowserUploadExtensionsParams,
} from './browsers';
export {
Fs,
diff --git a/src/resources/extensions.ts b/src/resources/extensions.ts
new file mode 100644
index 0000000..5697a07
--- /dev/null
+++ b/src/resources/extensions.ts
@@ -0,0 +1,200 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+import { APIResource } from '../core/resource';
+import { APIPromise } from '../core/api-promise';
+import { type Uploadable } from '../core/uploads';
+import { buildHeaders } from '../internal/headers';
+import { RequestOptions } from '../internal/request-options';
+import { multipartFormRequestOptions } from '../internal/uploads';
+import { path } from '../internal/utils/path';
+
+export class Extensions extends APIResource {
+ /**
+ * List extensions owned by the caller's organization.
+ *
+ * @example
+ * ```ts
+ * const extensions = await client.extensions.list();
+ * ```
+ */
+ list(options?: RequestOptions): APIPromise {
+ return this._client.get('/extensions', options);
+ }
+
+ /**
+ * Delete an extension by its ID or by its name.
+ *
+ * @example
+ * ```ts
+ * await client.extensions.delete('id_or_name');
+ * ```
+ */
+ delete(idOrName: string, options?: RequestOptions): APIPromise {
+ return this._client.delete(path`/extensions/${idOrName}`, {
+ ...options,
+ headers: buildHeaders([{ Accept: '*/*' }, options?.headers]),
+ });
+ }
+
+ /**
+ * Download the extension as a ZIP archive by ID or name.
+ *
+ * @example
+ * ```ts
+ * const response = await client.extensions.download(
+ * 'id_or_name',
+ * );
+ *
+ * const content = await response.blob();
+ * console.log(content);
+ * ```
+ */
+ download(idOrName: string, options?: RequestOptions): APIPromise {
+ return this._client.get(path`/extensions/${idOrName}`, {
+ ...options,
+ headers: buildHeaders([{ Accept: 'application/octet-stream' }, options?.headers]),
+ __binaryResponse: true,
+ });
+ }
+
+ /**
+ * Returns a ZIP archive containing the unpacked extension fetched from the Chrome
+ * Web Store.
+ *
+ * @example
+ * ```ts
+ * const response =
+ * await client.extensions.downloadFromChromeStore({
+ * url: 'url',
+ * });
+ *
+ * const content = await response.blob();
+ * console.log(content);
+ * ```
+ */
+ downloadFromChromeStore(
+ query: ExtensionDownloadFromChromeStoreParams,
+ options?: RequestOptions,
+ ): APIPromise {
+ return this._client.get('/extensions/from_chrome_store', {
+ query,
+ ...options,
+ headers: buildHeaders([{ Accept: 'application/octet-stream' }, options?.headers]),
+ __binaryResponse: true,
+ });
+ }
+
+ /**
+ * Upload a zip file containing an unpacked browser extension. Optionally provide a
+ * unique name for later reference.
+ *
+ * @example
+ * ```ts
+ * const response = await client.extensions.upload({
+ * file: fs.createReadStream('path/to/file'),
+ * });
+ * ```
+ */
+ upload(body: ExtensionUploadParams, options?: RequestOptions): APIPromise {
+ return this._client.post('/extensions', multipartFormRequestOptions({ body, ...options }, this._client));
+ }
+}
+
+export type ExtensionListResponse = Array;
+
+export namespace ExtensionListResponse {
+ /**
+ * A browser extension uploaded to Kernel.
+ */
+ export interface ExtensionListResponseItem {
+ /**
+ * Unique identifier for the extension
+ */
+ id: string;
+
+ /**
+ * Timestamp when the extension was created
+ */
+ created_at: string;
+
+ /**
+ * Size of the extension archive in bytes
+ */
+ size_bytes: number;
+
+ /**
+ * Timestamp when the extension was last used
+ */
+ last_used_at?: string | null;
+
+ /**
+ * Optional, easier-to-reference name for the extension. Must be unique within the
+ * organization.
+ */
+ name?: string | null;
+ }
+}
+
+/**
+ * A browser extension uploaded to Kernel.
+ */
+export interface ExtensionUploadResponse {
+ /**
+ * Unique identifier for the extension
+ */
+ id: string;
+
+ /**
+ * Timestamp when the extension was created
+ */
+ created_at: string;
+
+ /**
+ * Size of the extension archive in bytes
+ */
+ size_bytes: number;
+
+ /**
+ * Timestamp when the extension was last used
+ */
+ last_used_at?: string | null;
+
+ /**
+ * Optional, easier-to-reference name for the extension. Must be unique within the
+ * organization.
+ */
+ name?: string | null;
+}
+
+export interface ExtensionDownloadFromChromeStoreParams {
+ /**
+ * Chrome Web Store URL for the extension.
+ */
+ url: string;
+
+ /**
+ * Target operating system for the extension package. Defaults to linux.
+ */
+ os?: 'win' | 'mac' | 'linux';
+}
+
+export interface ExtensionUploadParams {
+ /**
+ * ZIP file containing the browser extension.
+ */
+ file: Uploadable;
+
+ /**
+ * Optional unique name within the organization to reference this extension.
+ */
+ name?: string;
+}
+
+export declare namespace Extensions {
+ export {
+ type ExtensionListResponse as ExtensionListResponse,
+ type ExtensionUploadResponse as ExtensionUploadResponse,
+ type ExtensionDownloadFromChromeStoreParams as ExtensionDownloadFromChromeStoreParams,
+ type ExtensionUploadParams as ExtensionUploadParams,
+ };
+}
diff --git a/src/resources/index.ts b/src/resources/index.ts
index 0288a65..37026ae 100644
--- a/src/resources/index.ts
+++ b/src/resources/index.ts
@@ -11,6 +11,7 @@ export {
type BrowserListResponse,
type BrowserCreateParams,
type BrowserDeleteParams,
+ type BrowserUploadExtensionsParams,
} from './browsers/browsers';
export {
Deployments,
@@ -24,6 +25,13 @@ export {
type DeploymentFollowParams,
type DeploymentListResponsesOffsetPagination,
} from './deployments';
+export {
+ Extensions,
+ type ExtensionListResponse,
+ type ExtensionUploadResponse,
+ type ExtensionDownloadFromChromeStoreParams,
+ type ExtensionUploadParams,
+} from './extensions';
export {
Invocations,
type InvocationStateEvent,
diff --git a/tests/api-resources/browsers/browsers.test.ts b/tests/api-resources/browsers/browsers.test.ts
index 3434e72..8d573b6 100644
--- a/tests/api-resources/browsers/browsers.test.ts
+++ b/tests/api-resources/browsers/browsers.test.ts
@@ -1,6 +1,6 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-import Kernel from '@onkernel/sdk';
+import Kernel, { toFile } from '@onkernel/sdk';
const client = new Kernel({
apiKey: 'My API Key',
@@ -26,6 +26,7 @@ describe('resource browsers', () => {
await expect(
client.browsers.create(
{
+ extensions: [{ id: 'id', name: 'name' }],
headless: false,
invocation_id: 'rr33xuugxj9h0bkf1rdt2bet',
persistence: { id: 'my-awesome-browser-for-user-1234' },
@@ -91,4 +92,25 @@ describe('resource browsers', () => {
expect(dataAndResponse.data).toBe(response);
expect(dataAndResponse.response).toBe(rawResponse);
});
+
+ // Prism tests are disabled
+ test.skip('uploadExtensions: only required params', async () => {
+ const responsePromise = client.browsers.uploadExtensions('id', {
+ extensions: [{ name: 'name', zip_file: await toFile(Buffer.from('# my file contents'), 'README.md') }],
+ });
+ 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);
+ });
+
+ // Prism tests are disabled
+ test.skip('uploadExtensions: required and optional params', async () => {
+ const response = await client.browsers.uploadExtensions('id', {
+ extensions: [{ name: 'name', zip_file: await toFile(Buffer.from('# my file contents'), 'README.md') }],
+ });
+ });
});
diff --git a/tests/api-resources/extensions.test.ts b/tests/api-resources/extensions.test.ts
new file mode 100644
index 0000000..515415f
--- /dev/null
+++ b/tests/api-resources/extensions.test.ts
@@ -0,0 +1,60 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+import Kernel, { toFile } from '@onkernel/sdk';
+
+const client = new Kernel({
+ apiKey: 'My API Key',
+ baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010',
+});
+
+describe('resource extensions', () => {
+ // Prism tests are disabled
+ test.skip('list', async () => {
+ const responsePromise = client.extensions.list();
+ 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);
+ });
+
+ // Prism tests are disabled
+ test.skip('delete', async () => {
+ const responsePromise = client.extensions.delete('id_or_name');
+ 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('downloadFromChromeStore: required and optional params', async () => {
+ const response = await client.extensions.downloadFromChromeStore({ url: 'url', os: 'win' });
+ });
+
+ // Prism tests are disabled
+ test.skip('upload: only required params', async () => {
+ const responsePromise = client.extensions.upload({
+ file: await toFile(Buffer.from('# my file contents'), 'README.md'),
+ });
+ 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);
+ });
+
+ // Prism tests are disabled
+ test.skip('upload: required and optional params', async () => {
+ const response = await client.extensions.upload({
+ file: await toFile(Buffer.from('# my file contents'), 'README.md'),
+ name: 'name',
+ });
+ });
+});
From c4ce155693c9634405efafb4f1043e1bce08ccb3 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 7 Oct 2025 13:51:57 +0000
Subject: [PATCH 4/5] codegen metadata
---
.stats.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.stats.yml b/.stats.yml
index b296ff8..f577dd0 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 57
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-936db268b3dcae5d64bd5d590506d8134304ffcbf67389eb9b1555b3febfd4cb.yml
openapi_spec_hash: 145485087adf1b28c052bacb4df68462
-config_hash: 5236f9b34e39dc1930e36a88c714abd4
+config_hash: 15cd063f8e308686ac71bf9ee9634625
From d2b0a87c524fa6cfb260182104a44544c06bce1d Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 7 Oct 2025 13:52:15 +0000
Subject: [PATCH 5/5] release: 0.14.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 14 ++++++++++++++
package.json | 2 +-
src/version.ts | 2 +-
4 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index ed21d28..727e2be 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.13.0"
+ ".": "0.14.0"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4e20e55..0ea0274 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,19 @@
# Changelog
+## 0.14.0 (2025-10-07)
+
+Full Changelog: [v0.13.0...v0.14.0](https://github.com/onkernel/kernel-node-sdk/compare/v0.13.0...v0.14.0)
+
+### Features
+
+* WIP browser extensions ([77333ab](https://github.com/onkernel/kernel-node-sdk/commit/77333abe7f7ee0c53da495adcec728b2fed7f831))
+
+
+### Chores
+
+* **internal:** use npm pack for build uploads ([aac1084](https://github.com/onkernel/kernel-node-sdk/commit/aac1084dca1bb547f314144891ed277ff82f2c89))
+* **jsdoc:** fix [@link](https://github.com/link) annotations to refer only to parts of the packageās public interface ([fe32267](https://github.com/onkernel/kernel-node-sdk/commit/fe32267f011df4444169d45787bac50b6249eab4))
+
## 0.13.0 (2025-10-03)
Full Changelog: [v0.12.0...v0.13.0](https://github.com/onkernel/kernel-node-sdk/compare/v0.12.0...v0.13.0)
diff --git a/package.json b/package.json
index 92fc936..eebd87b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@onkernel/sdk",
- "version": "0.13.0",
+ "version": "0.14.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 9d013cc..e2b0672 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1 +1 @@
-export const VERSION = '0.13.0'; // x-release-please-version
+export const VERSION = '0.14.0'; // x-release-please-version