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.13.0"
".": "0.14.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -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: 15cd063f8e308686ac71bf9ee9634625
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
16 changes: 16 additions & 0 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ Methods:
- <code title="get /browsers">client.browsers.<a href="./src/resources/browsers/browsers.ts">list</a>() -> BrowserListResponse</code>
- <code title="delete /browsers">client.browsers.<a href="./src/resources/browsers/browsers.ts">delete</a>({ ...params }) -> void</code>
- <code title="delete /browsers/{id}">client.browsers.<a href="./src/resources/browsers/browsers.ts">deleteByID</a>(id) -> void</code>
- <code title="post /browsers/{id}/extensions">client.browsers.<a href="./src/resources/browsers/browsers.ts">uploadExtensions</a>(id, { ...params }) -> void</code>

## Replays

Expand Down Expand Up @@ -177,3 +178,18 @@ Methods:
- <code title="get /proxies/{id}">client.proxies.<a href="./src/resources/proxies.ts">retrieve</a>(id) -> ProxyRetrieveResponse</code>
- <code title="get /proxies">client.proxies.<a href="./src/resources/proxies.ts">list</a>() -> ProxyListResponse</code>
- <code title="delete /proxies/{id}">client.proxies.<a href="./src/resources/proxies.ts">delete</a>(id) -> void</code>

# Extensions

Types:

- <code><a href="./src/resources/extensions.ts">ExtensionListResponse</a></code>
- <code><a href="./src/resources/extensions.ts">ExtensionUploadResponse</a></code>

Methods:

- <code title="get /extensions">client.extensions.<a href="./src/resources/extensions.ts">list</a>() -> ExtensionListResponse</code>
- <code title="delete /extensions/{id_or_name}">client.extensions.<a href="./src/resources/extensions.ts">delete</a>(idOrName) -> void</code>
- <code title="get /extensions/{id_or_name}">client.extensions.<a href="./src/resources/extensions.ts">download</a>(idOrName) -> Response</code>
- <code title="get /extensions/from_chrome_store">client.extensions.<a href="./src/resources/extensions.ts">downloadFromChromeStore</a>({ ...params }) -> Response</code>
- <code title="post /extensions">client.extensions.<a href="./src/resources/extensions.ts">upload</a>({ ...params }) -> ExtensionUploadResponse</code>
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.13.0",
"version": "0.14.0",
"description": "The official TypeScript library for the Kernel API",
"author": "Kernel <>",
"types": "dist/index.d.ts",
Expand Down
6 changes: 4 additions & 2 deletions scripts/utils/upload-artifact.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
19 changes: 19 additions & 0 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -61,6 +68,7 @@ import {
BrowserListResponse,
BrowserPersistence,
BrowserRetrieveResponse,
BrowserUploadExtensionsParams,
Browsers,
Profile,
} from './resources/browsers/browsers';
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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 {
Expand All @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/internal/to-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
77 changes: 77 additions & 0 deletions src/resources/browsers/browsers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<void> {
return this._client.post(
path`/browsers/${id}/extensions`,
multipartFormRequestOptions(
{ body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]) },
this._client,
),
);
}
}

/**
Expand Down Expand Up @@ -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<BrowserCreateParams.Extension>;

/**
* If true, launches the browser using a headless image (no VNC/GUI). Defaults to
* false.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -419,6 +473,28 @@ export interface BrowserDeleteParams {
persistent_id: string;
}

export interface BrowserUploadExtensionsParams {
/**
* List of extensions to upload and activate
*/
extensions: Array<BrowserUploadExtensionsParams.Extension>;
}

export namespace BrowserUploadExtensionsParams {
export interface Extension {
/**
* Folder name to place the extension under /home/kernel/extensions/<name>
*/
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;
Expand All @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions src/resources/browsers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export {
type BrowserListResponse,
type BrowserCreateParams,
type BrowserDeleteParams,
type BrowserUploadExtensionsParams,
} from './browsers';
export {
Fs,
Expand Down
Loading