From a2b9c8f6e8a42427c92ea239d61c6bb30b00be73 Mon Sep 17 00:00:00 2001
From: "kernel-internal[bot]"
<260533166+kernel-internal[bot]@users.noreply.github.com>
Date: Thu, 12 Nov 2026 19:26:33 +0000
Subject: [PATCH 1/3] feat: Say how many certificates the refresh PR body
leaves out
Stainless-Generated-From: 51c99c87f1c4026fdfca6867b49b86893d9d9796
---
.stats.yml | 2 +-
api.md | 12 +++
src/resources/browsers/browsers.ts | 18 ++++
src/resources/browsers/index.ts | 7 ++
src/resources/browsers/live-view.ts | 97 +++++++++++++++++++
src/resources/vaults/items.ts | 29 ++++--
.../api-resources/browsers/live-view.test.ts | 34 +++++++
7 files changed, 191 insertions(+), 8 deletions(-)
create mode 100644 src/resources/browsers/live-view.ts
create mode 100644 tests/api-resources/browsers/live-view.test.ts
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/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/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/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);
+ });
+});
From 4b796149030f91dabd5c563da49d9959a8f60735 Mon Sep 17 00:00:00 2001
From: "kernel-internal[bot]"
<260533166+kernel-internal[bot]@users.noreply.github.com>
Date: Thu, 12 Nov 2026 19:30:47 +0000
Subject: [PATCH 2/3] release: 0.148.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 7 +++++++
package.json | 2 +-
src/version.ts | 2 +-
4 files changed, 10 insertions(+), 3 deletions(-)
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/CHANGELOG.md b/CHANGELOG.md
index b203a3f1..26766cf2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [0.148.0](https://github.com/kernel/kernel-node-sdk/compare/v0.147.0...v0.148.0) (2026-11-12)
+
+
+### Features
+
+* Say how many certificates the refresh PR body leaves out ([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/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/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
From d01d6082d0ee3ed10becbc1b8e66458ef21848c1 Mon Sep 17 00:00:00 2001
From: masnwilliams <43387599+masnwilliams@users.noreply.github.com>
Date: Thu, 12 Nov 2026 19:36:30 +0000
Subject: [PATCH 3/3] chore: correct 0.148.0 changelog entries
---
CHANGELOG.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 26766cf2..ab1e5aa0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,9 @@
### Features
-* Say how many certificates the refresh PR body leaves out ([a2b9c8f](https://github.com/kernel/kernel-node-sdk/commit/a2b9c8f6e8a42427c92ea239d61c6bb30b00be73))
+* 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)