diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 4fb7843b..3350a097 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.147.0" + ".": "0.148.0" } diff --git a/.stats.yml b/.stats.yml index 4725ed91..4731cdc5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1 +1 @@ -configured_endpoints: 178 +configured_endpoints: 179 diff --git a/CHANGELOG.md b/CHANGELOG.md index b203a3f1..ab1e5aa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [0.148.0](https://github.com/kernel/kernel-node-sdk/compare/v0.147.0...v0.148.0) (2026-11-12) + + +### Features + +* Add scoped live view URLs ([a2b9c8f](https://github.com/kernel/kernel-node-sdk/commit/a2b9c8f6e8a42427c92ea239d61c6bb30b00be73)) +* Pace 1Password status checks on the partner schedule ([a2b9c8f](https://github.com/kernel/kernel-node-sdk/commit/a2b9c8f6e8a42427c92ea239d61c6bb30b00be73)) +* Return the 1Password access request reference on the approval action ([a2b9c8f](https://github.com/kernel/kernel-node-sdk/commit/a2b9c8f6e8a42427c92ea239d61c6bb30b00be73)) + ## [0.147.0](https://github.com/kernel/kernel-node-sdk/compare/v0.146.0...v0.147.0) (2026-11-12) diff --git a/api.md b/api.md index 325dfd86..8b9c140d 100644 --- a/api.md +++ b/api.md @@ -204,6 +204,18 @@ Methods: - client.browsers.telemetry.events(idOrName, { ...params }) -> TelemetryEventsResponsesOffsetPagination - client.browsers.telemetry.stream(idOrName, { ...params }) -> TelemetryStreamResponse +## LiveView + +Types: + +- BrowserLiveView +- BrowserLiveViewRequest +- BrowserLiveViewScope + +Methods: + +- client.browsers.liveView.create(idOrName, { ...params }) -> BrowserLiveView + ## Replays Types: diff --git a/package.json b/package.json index 8cc34167..73c014f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@onkernel/sdk", - "version": "0.147.0", + "version": "0.148.0", "description": "The official TypeScript library for the Kernel API", "author": "Kernel <>", "types": "dist/index.d.ts", diff --git a/src/resources/browsers/browsers.ts b/src/resources/browsers/browsers.ts index 15b22c40..d0f9a134 100644 --- a/src/resources/browsers/browsers.ts +++ b/src/resources/browsers/browsers.ts @@ -20,6 +20,14 @@ import { ComputerTypeTextParams, ComputerWriteClipboardParams, } from './computer'; +import * as LiveViewAPI from './live-view'; +import { + BrowserLiveView, + BrowserLiveViewRequest, + BrowserLiveViewScope, + LiveView, + LiveViewCreateParams, +} from './live-view'; import * as LogsAPI from './logs'; import { LogStreamParams, Logs } from './logs'; import * as ProcessAPI from './process'; @@ -161,6 +169,7 @@ import { browserFetch, type BrowserFetchInit } from '../../lib/browser-fetch'; export class Browsers extends APIResource { telemetry: TelemetryAPI.Telemetry = new TelemetryAPI.Telemetry(this._client); + liveView: LiveViewAPI.LiveView = new LiveViewAPI.LiveView(this._client); replays: ReplaysAPI.Replays = new ReplaysAPI.Replays(this._client); fs: FsAPI.Fs = new FsAPI.Fs(this._client); process: ProcessAPI.Process = new ProcessAPI.Process(this._client); @@ -2441,6 +2450,7 @@ export interface BrowserSaveProfileParams { } Browsers.Telemetry = TelemetryAPITelemetry; +Browsers.LiveView = LiveView; Browsers.Replays = Replays; Browsers.Fs = Fs; Browsers.Process = Process; @@ -2551,6 +2561,14 @@ export declare namespace Browsers { type TelemetryStreamParams as TelemetryStreamParams, }; + export { + LiveView as LiveView, + type BrowserLiveView as BrowserLiveView, + type BrowserLiveViewRequest as BrowserLiveViewRequest, + type BrowserLiveViewScope as BrowserLiveViewScope, + type LiveViewCreateParams as LiveViewCreateParams, + }; + export { Replays as Replays, type ReplayListResponse as ReplayListResponse, diff --git a/src/resources/browsers/index.ts b/src/resources/browsers/index.ts index b91400f8..ff5348dd 100644 --- a/src/resources/browsers/index.ts +++ b/src/resources/browsers/index.ts @@ -76,6 +76,13 @@ export { type FUploadZipParams, type FWriteFileParams, } from './fs/index'; +export { + LiveView, + type BrowserLiveView, + type BrowserLiveViewRequest, + type BrowserLiveViewScope, + type LiveViewCreateParams, +} from './live-view'; export { Logs, type LogStreamParams } from './logs'; export { Playwright, diff --git a/src/resources/browsers/live-view.ts b/src/resources/browsers/live-view.ts new file mode 100644 index 00000000..46e5c159 --- /dev/null +++ b/src/resources/browsers/live-view.ts @@ -0,0 +1,97 @@ +// 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 { RequestOptions } from '../../internal/request-options'; +import { path } from '../../internal/utils/path'; + +/** + * Create and manage browser sessions. + */ +export class LiveView extends APIResource { + /** + * Creates a live view URL for a headful browser that grants either read-only or + * control access. The URL works only for the live view: it cannot connect to CDP, + * WebDriver, or any other browser endpoint. A read-only URL shows the browser but + * cannot send input, regardless of query parameters. The URL stays valid until the + * browser is deleted, or until `ttl_seconds` elapse when set. For a browser + * acquired from a pool, it stops working when the browser is released. Nothing is + * stored, so a URL cannot be revoked before then. + * + * @example + * ```ts + * const browserLiveView = + * await client.browsers.liveView.create( + * 'htzv5orfit78e1m2biiifpbv', + * ); + * ``` + */ + create( + idOrName: string, + body: LiveViewCreateParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.post(path`/browsers/${idOrName}/live_view`, { body, ...options }); + } +} + +export interface BrowserLiveView { + /** + * `read` shows the browser without accepting input. `control` also lets the viewer + * drive the browser through the live view. + */ + scope: BrowserLiveViewScope; + + /** + * Live view URL. Treat it as a credential. + */ + url: string; + + /** + * When the URL expires. Absent when it stays valid until the browser is deleted. + */ + expires_at?: string; +} + +export interface BrowserLiveViewRequest { + /** + * `read` shows the browser without accepting input. `control` also lets the viewer + * drive the browser through the live view. + */ + scope?: BrowserLiveViewScope; + + /** + * Seconds until the URL expires. Omit to keep it valid until the browser is + * deleted. + */ + ttl_seconds?: number; +} + +/** + * `read` shows the browser without accepting input. `control` also lets the viewer + * drive the browser through the live view. + */ +export type BrowserLiveViewScope = 'read' | 'control'; + +export interface LiveViewCreateParams { + /** + * `read` shows the browser without accepting input. `control` also lets the viewer + * drive the browser through the live view. + */ + scope?: BrowserLiveViewScope; + + /** + * Seconds until the URL expires. Omit to keep it valid until the browser is + * deleted. + */ + ttl_seconds?: number; +} + +export declare namespace LiveView { + export { + type BrowserLiveView as BrowserLiveView, + type BrowserLiveViewRequest as BrowserLiveViewRequest, + type BrowserLiveViewScope as BrowserLiveViewScope, + type LiveViewCreateParams as LiveViewCreateParams, + }; +} diff --git a/src/resources/vaults/items.ts b/src/resources/vaults/items.ts index e0ed2692..fe5d4636 100644 --- a/src/resources/vaults/items.ts +++ b/src/resources/vaults/items.ts @@ -1170,9 +1170,10 @@ export interface CredentialVaultItem { /** * Kernel credentials advertise collect and fill when eligible. 1Password * credentials advertise 1pw_create_access_request until a request is made, - * 1pw_access_request_status while its approval is pending, and 1pw_fill after - * access is granted. Managed auth credentials advertise fill while ready and - * nothing otherwise. + * 1pw_access_request_status while its approval is pending (and + * 1pw_create_access_request again once the 3-minute status-check window has + * passed), and 1pw_fill after access is granted. Managed auth credentials + * advertise fill while ready and nothing otherwise. */ available_operations: Array; @@ -1273,6 +1274,15 @@ export namespace CredentialVaultItem { } export interface OnePasswordAccessApprovalAction { + /** + * The access_request_reference value from url, for approving inside your own iOS + * or Android app with 1Password's action extension or authorization activity. Pass + * it unchanged; the grant comes back to your app, and 1pw_access_request_status + * records it in Kernel. Treat it like url, which carries the same request text, + * and keep it out of logs. + */ + access_request_reference: string; + /** * Steps for the agent to hand approval to the human and poll the resulting * decision. @@ -1282,8 +1292,10 @@ export namespace CredentialVaultItem { name: '1password_access_approval'; /** - * Native 1Password approval link. Present it to the account owner without - * modifying it; it does not grant access until they approve in their app. + * Native 1Password approval link. Present it to the account owner unchanged, + * except that you may append `&return_url=` so 1Password sends + * them back to your app after they decide (1Password 8.12.46 or later on iOS, + * Android and desktop). It does not grant access until they approve in their app. */ url: string; } @@ -2395,7 +2407,9 @@ export namespace OnePasswordCredentialVaultItemState { has_autofill_token: boolean; /** - * One of pending, resolved, denied, or failed. + * One of pending, resolved, denied, failed, expired, or unknown. expired returns + * the item to pending_authorization so access can be requested again; unknown is a + * state 1Password added later and is treated as failed. */ state: string; @@ -4822,7 +4836,8 @@ export declare namespace ItemPerformOperationParams { type: '1pw_access_request_status'; /** - * Body param + * Body param: How long to keep checking on the schedule. The call still waits for + * its first scheduled check, at most 20 seconds, when that comes later. */ timeout_seconds?: number; } diff --git a/src/version.ts b/src/version.ts index 7ede2cec..48acf2cd 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.147.0'; // x-release-please-version +export const VERSION = '0.148.0'; // x-release-please-version diff --git a/tests/api-resources/browsers/live-view.test.ts b/tests/api-resources/browsers/live-view.test.ts new file mode 100644 index 00000000..eebcfa2e --- /dev/null +++ b/tests/api-resources/browsers/live-view.test.ts @@ -0,0 +1,34 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import Kernel 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 liveView', () => { + // Mock server tests are disabled + test.skip('create', async () => { + const responsePromise = client.browsers.liveView.create('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); + }); + + // Mock server tests are disabled + test.skip('create: 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.browsers.liveView.create( + 'htzv5orfit78e1m2biiifpbv', + { scope: 'read', ttl_seconds: 3600 }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(Kernel.NotFoundError); + }); +});