diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 2be9c43..0ee8c01 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.2.0" + ".": "0.3.0" } diff --git a/.stats.yml b/.stats.yml index b26bed3..d4463c3 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 7 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-39aa058a60035c34a636e7f580b4b9c76b05400ae401ef04a761572b20a5425b.yml -openapi_spec_hash: bb79a204f9edb6b6ccfe783a0a82a423 -config_hash: 3eb1ed1dd0067258984b31d53a0dab48 +configured_endpoints: 10 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-3edc7a0eef4a0d4495782efbdb0d9b777a55aee058dab119f90de56019441326.yml +openapi_spec_hash: dff0b1efa1c1614cf770ed8327cefab2 +config_hash: cb04a4d88ee9f530b303ca57ff7090b3 diff --git a/CHANGELOG.md b/CHANGELOG.md index baac236..e1aedc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 0.3.0 (2025-05-22) + +Full Changelog: [v0.2.0...v0.3.0](https://github.com/onkernel/kernel-node-sdk/compare/v0.2.0...v0.3.0) + +### Features + +* **api:** update via SDK Studio ([4203ce6](https://github.com/onkernel/kernel-node-sdk/commit/4203ce6729274b73b8cfec048b149405098a0295)) +* **api:** update via SDK Studio ([17ea405](https://github.com/onkernel/kernel-node-sdk/commit/17ea40587b26c15bf6d2fb8ac7521d6a635bad9c)) +* **api:** update via SDK Studio ([f8bf6c3](https://github.com/onkernel/kernel-node-sdk/commit/f8bf6c3b395a702ecdfe6f1517416bdeadf0b726)) +* **api:** update via SDK Studio ([4164908](https://github.com/onkernel/kernel-node-sdk/commit/416490808559874428ef93270296235a8eaeb046)) + + +### Chores + +* **docs:** grammar improvements ([b07afdd](https://github.com/onkernel/kernel-node-sdk/commit/b07afdd965c35a2eafc2c3604cec0c0bd76d8abd)) + ## 0.2.0 (2025-05-21) Full Changelog: [v0.1.0...v0.2.0](https://github.com/onkernel/kernel-node-sdk/compare/v0.1.0...v0.2.0) diff --git a/README.md b/README.md index d993074..8db99d1 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,10 @@ const client = new Kernel({ }); async function main() { - const params: Kernel.BrowserCreateParams = { invocation_id: 'REPLACE_ME' }; + const params: Kernel.BrowserCreateParams = { + invocation_id: 'REPLACE_ME', + persistence: { id: 'browser-for-user-1234' }, + }; const browser: Kernel.BrowserCreateResponse = await client.browsers.create(params); } @@ -117,15 +120,17 @@ a subclass of `APIError` will be thrown: ```ts async function main() { - const browser = await client.browsers.create({ invocation_id: 'REPLACE_ME' }).catch(async (err) => { - if (err instanceof Kernel.APIError) { - console.log(err.status); // 400 - console.log(err.name); // BadRequestError - console.log(err.headers); // {server: 'nginx', ...} - } else { - throw err; - } - }); + const browser = await client.browsers + .create({ invocation_id: 'REPLACE_ME', persistence: { id: 'browser-for-user-1234' } }) + .catch(async (err) => { + if (err instanceof Kernel.APIError) { + console.log(err.status); // 400 + console.log(err.name); // BadRequestError + console.log(err.headers); // {server: 'nginx', ...} + } else { + throw err; + } + }); } main(); @@ -160,7 +165,7 @@ const client = new Kernel({ }); // Or, configure per-request: -await client.browsers.create({ invocation_id: 'REPLACE_ME' }, { +await client.browsers.create({ invocation_id: 'REPLACE_ME', persistence: { id: 'browser-for-user-1234' } }, { maxRetries: 5, }); ``` @@ -177,7 +182,7 @@ const client = new Kernel({ }); // Override per-request: -await client.browsers.create({ invocation_id: 'REPLACE_ME' }, { +await client.browsers.create({ invocation_id: 'REPLACE_ME', persistence: { id: 'browser-for-user-1234' } }, { timeout: 5 * 1000, }); ``` @@ -200,12 +205,14 @@ Unlike `.asResponse()` this method consumes the body, returning once it is parse ```ts const client = new Kernel(); -const response = await client.browsers.create({ invocation_id: 'REPLACE_ME' }).asResponse(); +const response = await client.browsers + .create({ invocation_id: 'REPLACE_ME', persistence: { id: 'browser-for-user-1234' } }) + .asResponse(); console.log(response.headers.get('X-My-Header')); console.log(response.statusText); // access the underlying Response object const { data: browser, response: raw } = await client.browsers - .create({ invocation_id: 'REPLACE_ME' }) + .create({ invocation_id: 'REPLACE_ME', persistence: { id: 'browser-for-user-1234' } }) .withResponse(); console.log(raw.headers.get('X-My-Header')); console.log(browser.session_id); diff --git a/SECURITY.md b/SECURITY.md index bd2ba47..0c6c32d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -16,7 +16,7 @@ before making any information public. ## Reporting Non-SDK Related Security Issues If you encounter security issues that are not directly related to SDKs but pertain to the services -or products provided by Kernel please follow the respective company's security reporting guidelines. +or products provided by Kernel, please follow the respective company's security reporting guidelines. --- diff --git a/api.md b/api.md index 93c2c19..6c5f238 100644 --- a/api.md +++ b/api.md @@ -36,10 +36,15 @@ Methods: Types: +- BrowserPersistence - BrowserCreateResponse - BrowserRetrieveResponse +- BrowserListResponse Methods: - client.browsers.create({ ...params }) -> BrowserCreateResponse - client.browsers.retrieve(id) -> BrowserRetrieveResponse +- client.browsers.list() -> BrowserListResponse +- client.browsers.delete({ ...params }) -> void +- client.browsers.deleteByID(id) -> void diff --git a/package.json b/package.json index 7e328ae..c5ebe61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@onkernel/sdk", - "version": "0.2.0", + "version": "0.3.0", "description": "The official TypeScript library for the Kernel API", "author": "Kernel <>", "types": "dist/index.d.ts", diff --git a/src/client.ts b/src/client.ts index d3725a3..21d63a6 100644 --- a/src/client.ts +++ b/src/client.ts @@ -23,6 +23,9 @@ import { FinalRequestOptions, RequestOptions } from './internal/request-options' import { BrowserCreateParams, BrowserCreateResponse, + BrowserDeleteParams, + BrowserListResponse, + BrowserPersistence, BrowserRetrieveResponse, Browsers, } from './resources/browsers'; @@ -744,8 +747,11 @@ export declare namespace Kernel { export { Browsers as Browsers, + type BrowserPersistence as BrowserPersistence, type BrowserCreateResponse as BrowserCreateResponse, type BrowserRetrieveResponse as BrowserRetrieveResponse, + type BrowserListResponse as BrowserListResponse, type BrowserCreateParams as BrowserCreateParams, + type BrowserDeleteParams as BrowserDeleteParams, }; } diff --git a/src/resources/apps/invocations.ts b/src/resources/apps/invocations.ts index fee4db3..3f1e23a 100644 --- a/src/resources/apps/invocations.ts +++ b/src/resources/apps/invocations.ts @@ -28,7 +28,7 @@ export class Invocations extends APIResource { * @example * ```ts * const invocation = await client.apps.invocations.retrieve( - * 'ckqwer3o20000jb9s7abcdef', + * 'rr33xuugxj9h0bkf1rdt2bet', * ); * ``` */ diff --git a/src/resources/browsers.ts b/src/resources/browsers.ts index febb6d1..b66c68f 100644 --- a/src/resources/browsers.ts +++ b/src/resources/browsers.ts @@ -1,7 +1,9 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from '../core/resource'; +import * as BrowsersAPI from './browsers'; import { APIPromise } from '../core/api-promise'; +import { buildHeaders } from '../internal/headers'; import { RequestOptions } from '../internal/request-options'; import { path } from '../internal/utils/path'; @@ -12,7 +14,7 @@ export class Browsers extends APIResource { * @example * ```ts * const browser = await client.browsers.create({ - * invocation_id: 'ckqwer3o20000jb9s7abcdef', + * invocation_id: 'rr33xuugxj9h0bkf1rdt2bet', * }); * ``` */ @@ -26,13 +28,71 @@ export class Browsers extends APIResource { * @example * ```ts * const browser = await client.browsers.retrieve( - * 'e5bf36fe-9247-4e2b-8b5a-2f594cc1c073', + * 'htzv5orfit78e1m2biiifpbv', * ); * ``` */ retrieve(id: string, options?: RequestOptions): APIPromise { return this._client.get(path`/browsers/${id}`, options); } + + /** + * List active browser sessions for the authenticated user + * + * @example + * ```ts + * const browsers = await client.browsers.list(); + * ``` + */ + list(options?: RequestOptions): APIPromise { + return this._client.get('/browsers', options); + } + + /** + * Delete a persistent browser session by persistent_id query parameter. + * + * @example + * ```ts + * await client.browsers.delete({ + * persistent_id: 'persistent_id', + * }); + * ``` + */ + delete(params: BrowserDeleteParams, options?: RequestOptions): APIPromise { + const { persistent_id } = params; + return this._client.delete('/browsers', { + query: { persistent_id }, + ...options, + headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), + }); + } + + /** + * Delete Browser Session by ID + * + * @example + * ```ts + * await client.browsers.deleteByID( + * 'htzv5orfit78e1m2biiifpbv', + * ); + * ``` + */ + deleteByID(id: string, options?: RequestOptions): APIPromise { + return this._client.delete(path`/browsers/${id}`, { + ...options, + headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), + }); + } +} + +/** + * Optional persistence configuration for the browser session. + */ +export interface BrowserPersistence { + /** + * Unique identifier for the persistent browser session. + */ + id: string; } export interface BrowserCreateResponse { @@ -50,6 +110,11 @@ export interface BrowserCreateResponse { * Unique identifier for the browser session */ session_id: string; + + /** + * Optional persistence configuration for the browser session. + */ + persistence?: BrowserPersistence; } export interface BrowserRetrieveResponse { @@ -67,6 +132,37 @@ export interface BrowserRetrieveResponse { * Unique identifier for the browser session */ session_id: string; + + /** + * Optional persistence configuration for the browser session. + */ + persistence?: BrowserPersistence; +} + +export type BrowserListResponse = Array; + +export namespace BrowserListResponse { + export interface BrowserListResponseItem { + /** + * Remote URL for live viewing the browser session + */ + browser_live_view_url: string; + + /** + * Websocket URL for Chrome DevTools Protocol connections to the browser session + */ + cdp_ws_url: string; + + /** + * Unique identifier for the browser session + */ + session_id: string; + + /** + * Optional persistence configuration for the browser session. + */ + persistence?: BrowsersAPI.BrowserPersistence; + } } export interface BrowserCreateParams { @@ -74,12 +170,27 @@ export interface BrowserCreateParams { * action invocation ID */ invocation_id: string; + + /** + * Optional persistence configuration for the browser session. + */ + persistence?: BrowserPersistence; +} + +export interface BrowserDeleteParams { + /** + * Persistent browser identifier + */ + persistent_id: string; } export declare namespace Browsers { export { + type BrowserPersistence as BrowserPersistence, type BrowserCreateResponse as BrowserCreateResponse, type BrowserRetrieveResponse as BrowserRetrieveResponse, + type BrowserListResponse as BrowserListResponse, type BrowserCreateParams as BrowserCreateParams, + type BrowserDeleteParams as BrowserDeleteParams, }; } diff --git a/src/resources/index.ts b/src/resources/index.ts index ecbf870..5faf2a5 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -3,7 +3,10 @@ export { Apps, type AppListResponse, type AppListParams } from './apps/apps'; export { Browsers, + type BrowserPersistence, type BrowserCreateResponse, type BrowserRetrieveResponse, + type BrowserListResponse, type BrowserCreateParams, + type BrowserDeleteParams, } from './browsers'; diff --git a/src/version.ts b/src/version.ts index bade2ff..88f4d40 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.2.0'; // x-release-please-version +export const VERSION = '0.3.0'; // x-release-please-version diff --git a/tests/api-resources/apps/invocations.test.ts b/tests/api-resources/apps/invocations.test.ts index 3bafc76..4d76cc8 100644 --- a/tests/api-resources/apps/invocations.test.ts +++ b/tests/api-resources/apps/invocations.test.ts @@ -36,7 +36,7 @@ describe('resource invocations', () => { // skipped: tests are disabled for the time being test.skip('retrieve', async () => { - const responsePromise = client.apps.invocations.retrieve('ckqwer3o20000jb9s7abcdef'); + const responsePromise = client.apps.invocations.retrieve('rr33xuugxj9h0bkf1rdt2bet'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; diff --git a/tests/api-resources/browsers.test.ts b/tests/api-resources/browsers.test.ts index 7234977..8bb89aa 100644 --- a/tests/api-resources/browsers.test.ts +++ b/tests/api-resources/browsers.test.ts @@ -10,7 +10,7 @@ const client = new Kernel({ describe('resource browsers', () => { // skipped: tests are disabled for the time being test.skip('create: only required params', async () => { - const responsePromise = client.browsers.create({ invocation_id: 'ckqwer3o20000jb9s7abcdef' }); + const responsePromise = client.browsers.create({ invocation_id: 'rr33xuugxj9h0bkf1rdt2bet' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -22,12 +22,56 @@ describe('resource browsers', () => { // skipped: tests are disabled for the time being test.skip('create: required and optional params', async () => { - const response = await client.browsers.create({ invocation_id: 'ckqwer3o20000jb9s7abcdef' }); + const response = await client.browsers.create({ + invocation_id: 'rr33xuugxj9h0bkf1rdt2bet', + persistence: { id: 'my-awesome-browser-for-user-1234' }, + }); }); // skipped: tests are disabled for the time being test.skip('retrieve', async () => { - const responsePromise = client.browsers.retrieve('e5bf36fe-9247-4e2b-8b5a-2f594cc1c073'); + const responsePromise = client.browsers.retrieve('htzv5orfit78e1m2biiifpbv'); + 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); + }); + + // skipped: tests are disabled for the time being + test.skip('list', async () => { + const responsePromise = client.browsers.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); + }); + + // skipped: tests are disabled for the time being + test.skip('delete: only required params', async () => { + const responsePromise = client.browsers.delete({ persistent_id: 'persistent_id' }); + 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); + }); + + // skipped: tests are disabled for the time being + test.skip('delete: required and optional params', async () => { + const response = await client.browsers.delete({ persistent_id: 'persistent_id' }); + }); + + // skipped: tests are disabled for the time being + test.skip('deleteByID', async () => { + const responsePromise = client.browsers.deleteByID('htzv5orfit78e1m2biiifpbv'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise;