diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 29c16586..3c1df308 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.97.0" + ".": "0.98.0" } diff --git a/.stats.yml b/.stats.yml index 2aae27b8..a867372d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1 +1 @@ -configured_endpoints: 145 +configured_endpoints: 147 diff --git a/CHANGELOG.md b/CHANGELOG.md index a1dfbe95..a3e18e2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.98.0](https://github.com/kernel/kernel-node-sdk/compare/v0.97.0...v0.98.0) (2026-09-02) + + +### Features + +* Accept browser session name on all /browsers/{id_or_name} sub-resource routes ([d1006ba](https://github.com/kernel/kernel-node-sdk/commit/d1006ba6723ae641097635a8d803db04b8f4e5bd)) + ## [0.97.0](https://github.com/kernel/kernel-node-sdk/compare/v0.96.0...v0.97.0) (2026-08-31) diff --git a/api.md b/api.md index 3c2115ac..9f4e5a6c 100644 --- a/api.md +++ b/api.md @@ -120,9 +120,9 @@ Methods: - client.browsers.retrieve(idOrName, { ...params }) -> BrowserRetrieveResponse - client.browsers.update(idOrName, { ...params }) -> BrowserUpdateResponse - client.browsers.list({ ...params }) -> BrowserListResponsesOffsetPagination -- client.browsers.curl(id, { ...params }) -> BrowserCurlResponse +- client.browsers.curl(idOrName, { ...params }) -> BrowserCurlResponse - client.browsers.deleteByID(idOrName) -> void -- client.browsers.loadExtensions(id, { ...params }) -> void +- client.browsers.loadExtensions(idOrName, { ...params }) -> void ## Telemetry @@ -182,8 +182,8 @@ Types: Methods: -- client.browsers.telemetry.events(id, { ...params }) -> TelemetryEventsResponsesOffsetPagination -- client.browsers.telemetry.stream(id, { ...params }) -> TelemetryStreamResponse +- client.browsers.telemetry.events(idOrName, { ...params }) -> TelemetryEventsResponsesOffsetPagination +- client.browsers.telemetry.stream(idOrName, { ...params }) -> TelemetryStreamResponse ## Replays @@ -194,10 +194,10 @@ Types: Methods: -- client.browsers.replays.list(id) -> ReplayListResponse -- client.browsers.replays.download(replayID, { ...params }) -> Response -- client.browsers.replays.start(id, { ...params }) -> ReplayStartResponse -- client.browsers.replays.stop(replayID, { ...params }) -> void +- client.browsers.replays.list(idOrName) -> ReplayListResponse +- client.browsers.replays.download(replayID, { ...params }) -> Response +- client.browsers.replays.start(idOrName, { ...params }) -> ReplayStartResponse +- client.browsers.replays.stop(replayID, { ...params }) -> void ## Fs @@ -208,18 +208,18 @@ Types: Methods: -- client.browsers.fs.createDirectory(id, { ...params }) -> void -- client.browsers.fs.deleteDirectory(id, { ...params }) -> void -- client.browsers.fs.deleteFile(id, { ...params }) -> void -- client.browsers.fs.downloadDirZip(id, { ...params }) -> Response -- client.browsers.fs.fileInfo(id, { ...params }) -> FFileInfoResponse -- client.browsers.fs.listFiles(id, { ...params }) -> FListFilesResponse -- client.browsers.fs.move(id, { ...params }) -> void -- client.browsers.fs.readFile(id, { ...params }) -> Response -- client.browsers.fs.setFilePermissions(id, { ...params }) -> void -- client.browsers.fs.upload(id, { ...params }) -> void -- client.browsers.fs.uploadZip(id, { ...params }) -> void -- client.browsers.fs.writeFile(id, contents, { ...params }) -> void +- client.browsers.fs.createDirectory(idOrName, { ...params }) -> void +- client.browsers.fs.deleteDirectory(idOrName, { ...params }) -> void +- client.browsers.fs.deleteFile(idOrName, { ...params }) -> void +- client.browsers.fs.downloadDirZip(idOrName, { ...params }) -> Response +- client.browsers.fs.fileInfo(idOrName, { ...params }) -> FFileInfoResponse +- client.browsers.fs.listFiles(idOrName, { ...params }) -> FListFilesResponse +- client.browsers.fs.move(idOrName, { ...params }) -> void +- client.browsers.fs.readFile(idOrName, { ...params }) -> Response +- client.browsers.fs.setFilePermissions(idOrName, { ...params }) -> void +- client.browsers.fs.upload(idOrName, { ...params }) -> void +- client.browsers.fs.uploadZip(idOrName, { ...params }) -> void +- client.browsers.fs.writeFile(idOrName, contents, { ...params }) -> void ### Watch @@ -230,9 +230,9 @@ Types: Methods: -- client.browsers.fs.watch.events(watchID, { ...params }) -> WatchEventsResponse -- client.browsers.fs.watch.start(id, { ...params }) -> WatchStartResponse -- client.browsers.fs.watch.stop(watchID, { ...params }) -> void +- client.browsers.fs.watch.events(watchID, { ...params }) -> WatchEventsResponse +- client.browsers.fs.watch.start(idOrName, { ...params }) -> WatchStartResponse +- client.browsers.fs.watch.stop(watchID, { ...params }) -> void ## Process @@ -248,19 +248,19 @@ Types: Methods: -- client.browsers.process.exec(id, { ...params }) -> ProcessExecResponse -- client.browsers.process.kill(processID, { ...params }) -> ProcessKillResponse -- client.browsers.process.resize(processID, { ...params }) -> ProcessResizeResponse -- client.browsers.process.spawn(id, { ...params }) -> ProcessSpawnResponse -- client.browsers.process.status(processID, { ...params }) -> ProcessStatusResponse -- client.browsers.process.stdin(processID, { ...params }) -> ProcessStdinResponse -- client.browsers.process.stdoutStream(processID, { ...params }) -> ProcessStdoutStreamResponse +- client.browsers.process.exec(idOrName, { ...params }) -> ProcessExecResponse +- client.browsers.process.kill(processID, { ...params }) -> ProcessKillResponse +- client.browsers.process.resize(processID, { ...params }) -> ProcessResizeResponse +- client.browsers.process.spawn(idOrName, { ...params }) -> ProcessSpawnResponse +- client.browsers.process.status(processID, { ...params }) -> ProcessStatusResponse +- client.browsers.process.stdin(processID, { ...params }) -> ProcessStdinResponse +- client.browsers.process.stdoutStream(processID, { ...params }) -> ProcessStdoutStreamResponse ## Logs Methods: -- client.browsers.logs.stream(id, { ...params }) -> LogEvent +- client.browsers.logs.stream(idOrName, { ...params }) -> LogEvent ## Computer @@ -272,18 +272,18 @@ Types: Methods: -- client.browsers.computer.batch(id, { ...params }) -> void -- client.browsers.computer.captureScreenshot(id, { ...params }) -> Response -- client.browsers.computer.clickMouse(id, { ...params }) -> void -- client.browsers.computer.dragMouse(id, { ...params }) -> void -- client.browsers.computer.getMousePosition(id) -> ComputerGetMousePositionResponse -- client.browsers.computer.moveMouse(id, { ...params }) -> void -- client.browsers.computer.pressKey(id, { ...params }) -> void -- client.browsers.computer.readClipboard(id) -> ComputerReadClipboardResponse -- client.browsers.computer.scroll(id, { ...params }) -> void -- client.browsers.computer.setCursorVisibility(id, { ...params }) -> ComputerSetCursorVisibilityResponse -- client.browsers.computer.typeText(id, { ...params }) -> void -- client.browsers.computer.writeClipboard(id, { ...params }) -> void +- client.browsers.computer.batch(idOrName, { ...params }) -> void +- client.browsers.computer.captureScreenshot(idOrName, { ...params }) -> Response +- client.browsers.computer.clickMouse(idOrName, { ...params }) -> void +- client.browsers.computer.dragMouse(idOrName, { ...params }) -> void +- client.browsers.computer.getMousePosition(idOrName) -> ComputerGetMousePositionResponse +- client.browsers.computer.moveMouse(idOrName, { ...params }) -> void +- client.browsers.computer.pressKey(idOrName, { ...params }) -> void +- client.browsers.computer.readClipboard(idOrName) -> ComputerReadClipboardResponse +- client.browsers.computer.scroll(idOrName, { ...params }) -> void +- client.browsers.computer.setCursorVisibility(idOrName, { ...params }) -> ComputerSetCursorVisibilityResponse +- client.browsers.computer.typeText(idOrName, { ...params }) -> void +- client.browsers.computer.writeClipboard(idOrName, { ...params }) -> void ## Playwright @@ -293,7 +293,25 @@ Types: Methods: -- client.browsers.playwright.execute(id, { ...params }) -> PlaywrightExecuteResponse +- client.browsers.playwright.execute(idOrName, { ...params }) -> PlaywrightExecuteResponse + +## Webmcp + +Types: + +- InvocationFailure +- InvocationResult +- InvokeRequest +- Tool +- ToolAnnotations +- ToolFrame +- ToolSource +- ToolsResponse + +Methods: + +- client.browsers.webmcp.invokeTool(idOrName, { ...params }) -> InvocationResult +- client.browsers.webmcp.listTools(idOrName) -> ToolsResponse # Profiles diff --git a/package.json b/package.json index 9b0d183b..1708299a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@onkernel/sdk", - "version": "0.97.0", + "version": "0.98.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 0c9b537b..c1adfabc 100644 --- a/src/resources/browsers/browsers.ts +++ b/src/resources/browsers/browsers.ts @@ -109,6 +109,19 @@ import { TelemetryStreamParams, TelemetryStreamResponse, } from './telemetry'; +import * as WebmcpAPI from './webmcp'; +import { + InvocationFailure, + InvocationResult, + InvokeRequest, + Tool, + ToolAnnotations, + ToolFrame, + ToolSource, + ToolsResponse, + Webmcp, + WebmcpInvokeToolParams, +} from './webmcp'; import * as FsAPI from './fs/fs'; import { FCreateDirectoryParams, @@ -147,6 +160,7 @@ export class Browsers extends APIResource { logs: LogsAPI.Logs = new LogsAPI.Logs(this._client); computer: ComputerAPI.Computer = new ComputerAPI.Computer(this._client); playwright: PlaywrightAPI.Playwright = new PlaywrightAPI.Playwright(this._client); + webmcp: WebmcpAPI.Webmcp = new WebmcpAPI.Webmcp(this._client); /** * Create a new browser session from within an action. @@ -225,13 +239,14 @@ export class Browsers extends APIResource { * * @example * ```ts - * const response = await client.browsers.curl('id', { - * url: 'url', - * }); + * const response = await client.browsers.curl( + * 'htzv5orfit78e1m2biiifpbv', + * { url: 'url' }, + * ); * ``` */ - curl(id: string, body: BrowserCurlParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/curl`, { body, ...options }); + curl(idOrName: string, body: BrowserCurlParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/curl`, { body, ...options }); } /** @@ -265,19 +280,26 @@ export class Browsers extends APIResource { * * @example * ```ts - * await client.browsers.loadExtensions('id', { - * extensions: [ - * { - * name: 'name', - * zip_file: fs.createReadStream('path/to/file'), - * }, - * ], - * }); + * await client.browsers.loadExtensions( + * 'htzv5orfit78e1m2biiifpbv', + * { + * extensions: [ + * { + * name: 'name', + * zip_file: fs.createReadStream('path/to/file'), + * }, + * ], + * }, + * ); * ``` */ - loadExtensions(id: string, body: BrowserLoadExtensionsParams, options?: RequestOptions): APIPromise { + loadExtensions( + idOrName: string, + body: BrowserLoadExtensionsParams, + options?: RequestOptions, + ): APIPromise { return this._client.post( - path`/browsers/${id}/extensions`, + path`/browsers/${idOrName}/extensions`, multipartFormRequestOptions( { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]) }, this._client, @@ -1621,6 +1643,7 @@ Browsers.Process = Process; Browsers.Logs = Logs; Browsers.Computer = Computer; Browsers.Playwright = Playwright; +Browsers.Webmcp = Webmcp; export declare namespace Browsers { export { @@ -1775,4 +1798,17 @@ export declare namespace Browsers { type PlaywrightExecuteResponse as PlaywrightExecuteResponse, type PlaywrightExecuteParams as PlaywrightExecuteParams, }; + + export { + Webmcp as Webmcp, + type InvocationFailure as InvocationFailure, + type InvocationResult as InvocationResult, + type InvokeRequest as InvokeRequest, + type Tool as Tool, + type ToolAnnotations as ToolAnnotations, + type ToolFrame as ToolFrame, + type ToolSource as ToolSource, + type ToolsResponse as ToolsResponse, + type WebmcpInvokeToolParams as WebmcpInvokeToolParams, + }; } diff --git a/src/resources/browsers/computer.ts b/src/resources/browsers/computer.ts index a8b8d443..a51d618d 100644 --- a/src/resources/browsers/computer.ts +++ b/src/resources/browsers/computer.ts @@ -17,13 +17,14 @@ export class Computer extends APIResource { * * @example * ```ts - * await client.browsers.computer.batch('id', { - * actions: [{ type: 'click_mouse' }], - * }); + * await client.browsers.computer.batch( + * 'htzv5orfit78e1m2biiifpbv', + * { actions: [{ type: 'click_mouse' }] }, + * ); * ``` */ - batch(id: string, body: ComputerBatchParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/batch`, { + batch(idOrName: string, body: ComputerBatchParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/batch`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -36,18 +37,20 @@ export class Computer extends APIResource { * @example * ```ts * const response = - * await client.browsers.computer.captureScreenshot('id'); + * await client.browsers.computer.captureScreenshot( + * 'htzv5orfit78e1m2biiifpbv', + * ); * * const content = await response.blob(); * console.log(content); * ``` */ captureScreenshot( - id: string, + idOrName: string, body: ComputerCaptureScreenshotParams | null | undefined = {}, options?: RequestOptions, ): APIPromise { - return this._client.post(path`/browsers/${id}/computer/screenshot`, { + return this._client.post(path`/browsers/${idOrName}/computer/screenshot`, { body, ...options, headers: buildHeaders([{ Accept: 'image/png' }, options?.headers]), @@ -60,14 +63,14 @@ export class Computer extends APIResource { * * @example * ```ts - * await client.browsers.computer.clickMouse('id', { - * x: 0, - * y: 0, - * }); + * await client.browsers.computer.clickMouse( + * 'htzv5orfit78e1m2biiifpbv', + * { x: 0, y: 0 }, + * ); * ``` */ - clickMouse(id: string, body: ComputerClickMouseParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/click_mouse`, { + clickMouse(idOrName: string, body: ComputerClickMouseParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/click_mouse`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -79,16 +82,19 @@ export class Computer extends APIResource { * * @example * ```ts - * await client.browsers.computer.dragMouse('id', { - * path: [ - * [0, 0], - * [0, 0], - * ], - * }); + * await client.browsers.computer.dragMouse( + * 'htzv5orfit78e1m2biiifpbv', + * { + * path: [ + * [0, 0], + * [0, 0], + * ], + * }, + * ); * ``` */ - dragMouse(id: string, body: ComputerDragMouseParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/drag_mouse`, { + dragMouse(idOrName: string, body: ComputerDragMouseParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/drag_mouse`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -101,11 +107,13 @@ export class Computer extends APIResource { * @example * ```ts * const response = - * await client.browsers.computer.getMousePosition('id'); + * await client.browsers.computer.getMousePosition( + * 'htzv5orfit78e1m2biiifpbv', + * ); * ``` */ - getMousePosition(id: string, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/get_mouse_position`, options); + getMousePosition(idOrName: string, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/get_mouse_position`, options); } /** @@ -113,14 +121,14 @@ export class Computer extends APIResource { * * @example * ```ts - * await client.browsers.computer.moveMouse('id', { - * x: 0, - * y: 0, - * }); + * await client.browsers.computer.moveMouse( + * 'htzv5orfit78e1m2biiifpbv', + * { x: 0, y: 0 }, + * ); * ``` */ - moveMouse(id: string, body: ComputerMoveMouseParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/move_mouse`, { + moveMouse(idOrName: string, body: ComputerMoveMouseParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/move_mouse`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -132,13 +140,14 @@ export class Computer extends APIResource { * * @example * ```ts - * await client.browsers.computer.pressKey('id', { - * keys: ['string'], - * }); + * await client.browsers.computer.pressKey( + * 'htzv5orfit78e1m2biiifpbv', + * { keys: ['string'] }, + * ); * ``` */ - pressKey(id: string, body: ComputerPressKeyParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/press_key`, { + pressKey(idOrName: string, body: ComputerPressKeyParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/press_key`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -151,11 +160,13 @@ export class Computer extends APIResource { * @example * ```ts * const response = - * await client.browsers.computer.readClipboard('id'); + * await client.browsers.computer.readClipboard( + * 'htzv5orfit78e1m2biiifpbv', + * ); * ``` */ - readClipboard(id: string, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/clipboard/read`, options); + readClipboard(idOrName: string, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/clipboard/read`, options); } /** @@ -163,11 +174,14 @@ export class Computer extends APIResource { * * @example * ```ts - * await client.browsers.computer.scroll('id', { x: 0, y: 0 }); + * await client.browsers.computer.scroll( + * 'htzv5orfit78e1m2biiifpbv', + * { x: 0, y: 0 }, + * ); * ``` */ - scroll(id: string, body: ComputerScrollParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/scroll`, { + scroll(idOrName: string, body: ComputerScrollParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/scroll`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -180,17 +194,18 @@ export class Computer extends APIResource { * @example * ```ts * const response = - * await client.browsers.computer.setCursorVisibility('id', { - * hidden: true, - * }); + * await client.browsers.computer.setCursorVisibility( + * 'htzv5orfit78e1m2biiifpbv', + * { hidden: true }, + * ); * ``` */ setCursorVisibility( - id: string, + idOrName: string, body: ComputerSetCursorVisibilityParams, options?: RequestOptions, ): APIPromise { - return this._client.post(path`/browsers/${id}/computer/cursor`, { body, ...options }); + return this._client.post(path`/browsers/${idOrName}/computer/cursor`, { body, ...options }); } /** @@ -198,13 +213,14 @@ export class Computer extends APIResource { * * @example * ```ts - * await client.browsers.computer.typeText('id', { - * text: 'text', - * }); + * await client.browsers.computer.typeText( + * 'htzv5orfit78e1m2biiifpbv', + * { text: 'text' }, + * ); * ``` */ - typeText(id: string, body: ComputerTypeTextParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/type`, { + typeText(idOrName: string, body: ComputerTypeTextParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/type`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -216,13 +232,18 @@ export class Computer extends APIResource { * * @example * ```ts - * await client.browsers.computer.writeClipboard('id', { - * text: 'text', - * }); + * await client.browsers.computer.writeClipboard( + * 'htzv5orfit78e1m2biiifpbv', + * { text: 'text' }, + * ); * ``` */ - writeClipboard(id: string, body: ComputerWriteClipboardParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/computer/clipboard/write`, { + writeClipboard( + idOrName: string, + body: ComputerWriteClipboardParams, + options?: RequestOptions, + ): APIPromise { + return this._client.post(path`/browsers/${idOrName}/computer/clipboard/write`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), diff --git a/src/resources/browsers/fs/fs.ts b/src/resources/browsers/fs/fs.ts index 4e03aa75..4d7a5fda 100644 --- a/src/resources/browsers/fs/fs.ts +++ b/src/resources/browsers/fs/fs.ts @@ -28,13 +28,18 @@ export class Fs extends APIResource { * * @example * ```ts - * await client.browsers.fs.createDirectory('id', { - * path: '/J!', - * }); + * await client.browsers.fs.createDirectory( + * 'htzv5orfit78e1m2biiifpbv', + * { path: '/J!' }, + * ); * ``` */ - createDirectory(id: string, body: FCreateDirectoryParams, options?: RequestOptions): APIPromise { - return this._client.put(path`/browsers/${id}/fs/create_directory`, { + createDirectory( + idOrName: string, + body: FCreateDirectoryParams, + options?: RequestOptions, + ): APIPromise { + return this._client.put(path`/browsers/${idOrName}/fs/create_directory`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -46,13 +51,18 @@ export class Fs extends APIResource { * * @example * ```ts - * await client.browsers.fs.deleteDirectory('id', { - * path: '/J!', - * }); + * await client.browsers.fs.deleteDirectory( + * 'htzv5orfit78e1m2biiifpbv', + * { path: '/J!' }, + * ); * ``` */ - deleteDirectory(id: string, body: FDeleteDirectoryParams, options?: RequestOptions): APIPromise { - return this._client.put(path`/browsers/${id}/fs/delete_directory`, { + deleteDirectory( + idOrName: string, + body: FDeleteDirectoryParams, + options?: RequestOptions, + ): APIPromise { + return this._client.put(path`/browsers/${idOrName}/fs/delete_directory`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -64,11 +74,14 @@ export class Fs extends APIResource { * * @example * ```ts - * await client.browsers.fs.deleteFile('id', { path: '/J!' }); + * await client.browsers.fs.deleteFile( + * 'htzv5orfit78e1m2biiifpbv', + * { path: '/J!' }, + * ); * ``` */ - deleteFile(id: string, body: FDeleteFileParams, options?: RequestOptions): APIPromise { - return this._client.put(path`/browsers/${id}/fs/delete_file`, { + deleteFile(idOrName: string, body: FDeleteFileParams, options?: RequestOptions): APIPromise { + return this._client.put(path`/browsers/${idOrName}/fs/delete_file`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -81,7 +94,7 @@ export class Fs extends APIResource { * @example * ```ts * const response = await client.browsers.fs.downloadDirZip( - * 'id', + * 'htzv5orfit78e1m2biiifpbv', * { path: '/J!' }, * ); * @@ -89,8 +102,12 @@ export class Fs extends APIResource { * console.log(content); * ``` */ - downloadDirZip(id: string, query: FDownloadDirZipParams, options?: RequestOptions): APIPromise { - return this._client.get(path`/browsers/${id}/fs/download_dir_zip`, { + downloadDirZip( + idOrName: string, + query: FDownloadDirZipParams, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/browsers/${idOrName}/fs/download_dir_zip`, { query, ...options, headers: buildHeaders([{ Accept: 'application/zip' }, options?.headers]), @@ -103,13 +120,18 @@ export class Fs extends APIResource { * * @example * ```ts - * const response = await client.browsers.fs.fileInfo('id', { - * path: '/J!', - * }); + * const response = await client.browsers.fs.fileInfo( + * 'htzv5orfit78e1m2biiifpbv', + * { path: '/J!' }, + * ); * ``` */ - fileInfo(id: string, query: FFileInfoParams, options?: RequestOptions): APIPromise { - return this._client.get(path`/browsers/${id}/fs/file_info`, { query, ...options }); + fileInfo( + idOrName: string, + query: FFileInfoParams, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/browsers/${idOrName}/fs/file_info`, { query, ...options }); } /** @@ -117,13 +139,18 @@ export class Fs extends APIResource { * * @example * ```ts - * const response = await client.browsers.fs.listFiles('id', { - * path: '/J!', - * }); + * const response = await client.browsers.fs.listFiles( + * 'htzv5orfit78e1m2biiifpbv', + * { path: '/J!' }, + * ); * ``` */ - listFiles(id: string, query: FListFilesParams, options?: RequestOptions): APIPromise { - return this._client.get(path`/browsers/${id}/fs/list_files`, { query, ...options }); + listFiles( + idOrName: string, + query: FListFilesParams, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/browsers/${idOrName}/fs/list_files`, { query, ...options }); } /** @@ -131,14 +158,14 @@ export class Fs extends APIResource { * * @example * ```ts - * await client.browsers.fs.move('id', { + * await client.browsers.fs.move('htzv5orfit78e1m2biiifpbv', { * dest_path: '/J!', * src_path: '/J!', * }); * ``` */ - move(id: string, body: FMoveParams, options?: RequestOptions): APIPromise { - return this._client.put(path`/browsers/${id}/fs/move`, { + move(idOrName: string, body: FMoveParams, options?: RequestOptions): APIPromise { + return this._client.put(path`/browsers/${idOrName}/fs/move`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -150,16 +177,17 @@ export class Fs extends APIResource { * * @example * ```ts - * const response = await client.browsers.fs.readFile('id', { - * path: '/J!', - * }); + * const response = await client.browsers.fs.readFile( + * 'htzv5orfit78e1m2biiifpbv', + * { path: '/J!' }, + * ); * * const content = await response.blob(); * console.log(content); * ``` */ - readFile(id: string, query: FReadFileParams, options?: RequestOptions): APIPromise { - return this._client.get(path`/browsers/${id}/fs/read_file`, { + readFile(idOrName: string, query: FReadFileParams, options?: RequestOptions): APIPromise { + return this._client.get(path`/browsers/${idOrName}/fs/read_file`, { query, ...options, headers: buildHeaders([{ Accept: 'application/octet-stream' }, options?.headers]), @@ -172,18 +200,18 @@ export class Fs extends APIResource { * * @example * ```ts - * await client.browsers.fs.setFilePermissions('id', { - * mode: '0611', - * path: '/J!', - * }); + * await client.browsers.fs.setFilePermissions( + * 'htzv5orfit78e1m2biiifpbv', + * { mode: '0611', path: '/J!' }, + * ); * ``` */ setFilePermissions( - id: string, + idOrName: string, body: FSetFilePermissionsParams, options?: RequestOptions, ): APIPromise { - return this._client.put(path`/browsers/${id}/fs/set_file_permissions`, { + return this._client.put(path`/browsers/${idOrName}/fs/set_file_permissions`, { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), @@ -195,19 +223,22 @@ export class Fs extends APIResource { * * @example * ```ts - * await client.browsers.fs.upload('id', { - * files: [ - * { - * dest_path: '/J!', - * file: fs.createReadStream('path/to/file'), - * }, - * ], - * }); + * await client.browsers.fs.upload( + * 'htzv5orfit78e1m2biiifpbv', + * { + * files: [ + * { + * dest_path: '/J!', + * file: fs.createReadStream('path/to/file'), + * }, + * ], + * }, + * ); * ``` */ - upload(id: string, body: FUploadParams, options?: RequestOptions): APIPromise { + upload(idOrName: string, body: FUploadParams, options?: RequestOptions): APIPromise { return this._client.post( - path`/browsers/${id}/fs/upload`, + path`/browsers/${idOrName}/fs/upload`, multipartFormRequestOptions( { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]) }, this._client, @@ -220,15 +251,18 @@ export class Fs extends APIResource { * * @example * ```ts - * await client.browsers.fs.uploadZip('id', { - * dest_path: '/J!', - * zip_file: fs.createReadStream('path/to/file'), - * }); + * await client.browsers.fs.uploadZip( + * 'htzv5orfit78e1m2biiifpbv', + * { + * dest_path: '/J!', + * zip_file: fs.createReadStream('path/to/file'), + * }, + * ); * ``` */ - uploadZip(id: string, body: FUploadZipParams, options?: RequestOptions): APIPromise { + uploadZip(idOrName: string, body: FUploadZipParams, options?: RequestOptions): APIPromise { return this._client.post( - path`/browsers/${id}/fs/upload_zip`, + path`/browsers/${idOrName}/fs/upload_zip`, multipartFormRequestOptions( { body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]) }, this._client, @@ -242,20 +276,20 @@ export class Fs extends APIResource { * @example * ```ts * await client.browsers.fs.writeFile( - * 'id', + * 'htzv5orfit78e1m2biiifpbv', * fs.createReadStream('path/to/file'), * { path: '/J!' }, * ); * ``` */ writeFile( - id: string, + idOrName: string, contents: string | ArrayBuffer | ArrayBufferView | Blob | DataView, params: FWriteFileParams, options?: RequestOptions, ): APIPromise { const { path: path_, mode } = params; - return this._client.put(path`/browsers/${id}/fs/write_file`, { + return this._client.put(path`/browsers/${idOrName}/fs/write_file`, { body: contents, query: { path: path_, mode }, ...options, diff --git a/src/resources/browsers/fs/watch.ts b/src/resources/browsers/fs/watch.ts index 41b5b439..f6b5e942 100644 --- a/src/resources/browsers/fs/watch.ts +++ b/src/resources/browsers/fs/watch.ts @@ -18,7 +18,7 @@ export class Watch extends APIResource { * ```ts * const response = await client.browsers.fs.watch.events( * 'watch_id', - * { id: 'id' }, + * { id_or_name: 'htzv5orfit78e1m2biiifpbv' }, * ); * ``` */ @@ -27,8 +27,8 @@ export class Watch extends APIResource { params: WatchEventsParams, options?: RequestOptions, ): APIPromise> { - const { id } = params; - return this._client.get(path`/browsers/${id}/fs/watch/${watchID}/events`, { + const { id_or_name } = params; + return this._client.get(path`/browsers/${id_or_name}/fs/watch/${watchID}/events`, { ...options, headers: buildHeaders([{ Accept: 'text/event-stream' }, options?.headers]), stream: true, @@ -41,13 +41,13 @@ export class Watch extends APIResource { * @example * ```ts * const response = await client.browsers.fs.watch.start( - * 'id', + * 'htzv5orfit78e1m2biiifpbv', * { path: 'path' }, * ); * ``` */ - start(id: string, body: WatchStartParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/fs/watch`, { body, ...options }); + start(idOrName: string, body: WatchStartParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/fs/watch`, { body, ...options }); } /** @@ -56,13 +56,13 @@ export class Watch extends APIResource { * @example * ```ts * await client.browsers.fs.watch.stop('watch_id', { - * id: 'id', + * id_or_name: 'htzv5orfit78e1m2biiifpbv', * }); * ``` */ stop(watchID: string, params: WatchStopParams, options?: RequestOptions): APIPromise { - const { id } = params; - return this._client.delete(path`/browsers/${id}/fs/watch/${watchID}`, { + const { id_or_name } = params; + return this._client.delete(path`/browsers/${id_or_name}/fs/watch/${watchID}`, { ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), }); @@ -103,9 +103,9 @@ export interface WatchStartResponse { export interface WatchEventsParams { /** - * Browser session ID + * Browser session ID or name */ - id: string; + id_or_name: string; } export interface WatchStartParams { @@ -122,9 +122,9 @@ export interface WatchStartParams { export interface WatchStopParams { /** - * Browser session ID + * Browser session ID or name */ - id: string; + id_or_name: string; } export declare namespace Watch { diff --git a/src/resources/browsers/index.ts b/src/resources/browsers/index.ts index 2b225829..7742988a 100644 --- a/src/resources/browsers/index.ts +++ b/src/resources/browsers/index.ts @@ -143,3 +143,15 @@ export { type TelemetryStreamParams, type TelemetryEventsResponsesOffsetPagination, } from './telemetry'; +export { + Webmcp, + type InvocationFailure, + type InvocationResult, + type InvokeRequest, + type Tool, + type ToolAnnotations, + type ToolFrame, + type ToolSource, + type ToolsResponse, + type WebmcpInvokeToolParams, +} from './webmcp'; diff --git a/src/resources/browsers/logs.ts b/src/resources/browsers/logs.ts index 13511b10..e8494fe0 100644 --- a/src/resources/browsers/logs.ts +++ b/src/resources/browsers/logs.ts @@ -17,13 +17,18 @@ export class Logs extends APIResource { * * @example * ```ts - * const logEvent = await client.browsers.logs.stream('id', { - * source: 'path', - * }); + * const logEvent = await client.browsers.logs.stream( + * 'htzv5orfit78e1m2biiifpbv', + * { source: 'path' }, + * ); * ``` */ - stream(id: string, query: LogStreamParams, options?: RequestOptions): APIPromise> { - return this._client.get(path`/browsers/${id}/logs/stream`, { + stream( + idOrName: string, + query: LogStreamParams, + options?: RequestOptions, + ): APIPromise> { + return this._client.get(path`/browsers/${idOrName}/logs/stream`, { query, ...options, headers: buildHeaders([{ Accept: 'text/event-stream' }, options?.headers]), diff --git a/src/resources/browsers/playwright.ts b/src/resources/browsers/playwright.ts index 022ccc7f..2ddd51d2 100644 --- a/src/resources/browsers/playwright.ts +++ b/src/resources/browsers/playwright.ts @@ -12,23 +12,26 @@ export class Playwright extends APIResource { /** * Execute arbitrary Playwright code in a fresh execution context against the * browser. The code runs in the same VM as the browser, minimizing latency and - * maximizing throughput. It has access to 'page', 'context', and 'browser' - * variables. It can `return` a value, and this value is returned in the response. + * maximizing throughput. It has access to 'page', 'context', 'browser', and + * 'webmcp' variables. Use 'webmcp.listTools()' to discover browser-wide WebMCP + * tools and 'webmcp.invokeTool(toolRef, input?, { timeoutSec? })' to invoke an + * exact registration. It can `return` a value, and this value is returned in the + * response. * * @example * ```ts * const response = await client.browsers.playwright.execute( - * 'id', + * 'htzv5orfit78e1m2biiifpbv', * { code: 'code' }, * ); * ``` */ execute( - id: string, + idOrName: string, body: PlaywrightExecuteParams, options?: RequestOptions, ): APIPromise { - return this._client.post(path`/browsers/${id}/playwright/execute`, { body, ...options }); + return this._client.post(path`/browsers/${idOrName}/playwright/execute`, { body, ...options }); } } diff --git a/src/resources/browsers/process.ts b/src/resources/browsers/process.ts index 40e04f0a..390d418e 100644 --- a/src/resources/browsers/process.ts +++ b/src/resources/browsers/process.ts @@ -16,13 +16,14 @@ export class Process extends APIResource { * * @example * ```ts - * const response = await client.browsers.process.exec('id', { - * command: 'command', - * }); + * const response = await client.browsers.process.exec( + * 'htzv5orfit78e1m2biiifpbv', + * { command: 'command' }, + * ); * ``` */ - exec(id: string, body: ProcessExecParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/process/exec`, { body, ...options }); + exec(idOrName: string, body: ProcessExecParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/browsers/${idOrName}/process/exec`, { body, ...options }); } /** @@ -32,7 +33,10 @@ export class Process extends APIResource { * ```ts * const response = await client.browsers.process.kill( * '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', - * { id: 'id', signal: 'TERM' }, + * { + * id_or_name: 'htzv5orfit78e1m2biiifpbv', + * signal: 'TERM', + * }, * ); * ``` */ @@ -41,8 +45,8 @@ export class Process extends APIResource { params: ProcessKillParams, options?: RequestOptions, ): APIPromise { - const { id, ...body } = params; - return this._client.post(path`/browsers/${id}/process/${processID}/kill`, { body, ...options }); + const { id_or_name, ...body } = params; + return this._client.post(path`/browsers/${id_or_name}/process/${processID}/kill`, { body, ...options }); } /** @@ -53,7 +57,7 @@ export class Process extends APIResource { * const response = await client.browsers.process.resize( * '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', * { - * id: 'id', + * id_or_name: 'htzv5orfit78e1m2biiifpbv', * cols: 1, * rows: 1, * }, @@ -65,8 +69,8 @@ export class Process extends APIResource { params: ProcessResizeParams, options?: RequestOptions, ): APIPromise { - const { id, ...body } = params; - return this._client.post(path`/browsers/${id}/process/${processID}/resize`, { body, ...options }); + const { id_or_name, ...body } = params; + return this._client.post(path`/browsers/${id_or_name}/process/${processID}/resize`, { body, ...options }); } /** @@ -74,13 +78,18 @@ export class Process extends APIResource { * * @example * ```ts - * const response = await client.browsers.process.spawn('id', { - * command: 'command', - * }); + * const response = await client.browsers.process.spawn( + * 'htzv5orfit78e1m2biiifpbv', + * { command: 'command' }, + * ); * ``` */ - spawn(id: string, body: ProcessSpawnParams, options?: RequestOptions): APIPromise { - return this._client.post(path`/browsers/${id}/process/spawn`, { body, ...options }); + spawn( + idOrName: string, + body: ProcessSpawnParams, + options?: RequestOptions, + ): APIPromise { + return this._client.post(path`/browsers/${idOrName}/process/spawn`, { body, ...options }); } /** @@ -90,7 +99,7 @@ export class Process extends APIResource { * ```ts * const response = await client.browsers.process.status( * '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', - * { id: 'id' }, + * { id_or_name: 'htzv5orfit78e1m2biiifpbv' }, * ); * ``` */ @@ -99,8 +108,8 @@ export class Process extends APIResource { params: ProcessStatusParams, options?: RequestOptions, ): APIPromise { - const { id } = params; - return this._client.get(path`/browsers/${id}/process/${processID}/status`, options); + const { id_or_name } = params; + return this._client.get(path`/browsers/${id_or_name}/process/${processID}/status`, options); } /** @@ -110,7 +119,10 @@ export class Process extends APIResource { * ```ts * const response = await client.browsers.process.stdin( * '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', - * { id: 'id', data_b64: 'data_b64' }, + * { + * id_or_name: 'htzv5orfit78e1m2biiifpbv', + * data_b64: 'data_b64', + * }, * ); * ``` */ @@ -119,8 +131,8 @@ export class Process extends APIResource { params: ProcessStdinParams, options?: RequestOptions, ): APIPromise { - const { id, ...body } = params; - return this._client.post(path`/browsers/${id}/process/${processID}/stdin`, { body, ...options }); + const { id_or_name, ...body } = params; + return this._client.post(path`/browsers/${id_or_name}/process/${processID}/stdin`, { body, ...options }); } /** @@ -130,7 +142,7 @@ export class Process extends APIResource { * ```ts * const response = await client.browsers.process.stdoutStream( * '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', - * { id: 'id' }, + * { id_or_name: 'htzv5orfit78e1m2biiifpbv' }, * ); * ``` */ @@ -139,8 +151,8 @@ export class Process extends APIResource { params: ProcessStdoutStreamParams, options?: RequestOptions, ): APIPromise> { - const { id } = params; - return this._client.get(path`/browsers/${id}/process/${processID}/stdout/stream`, { + const { id_or_name } = params; + return this._client.get(path`/browsers/${id_or_name}/process/${processID}/stdout/stream`, { ...options, headers: buildHeaders([{ Accept: 'text/event-stream' }, options?.headers]), stream: true, @@ -312,9 +324,9 @@ export interface ProcessExecParams { export interface ProcessKillParams { /** - * Path param: Browser session ID + * Path param: Browser session ID or name */ - id: string; + id_or_name: string; /** * Body param: Signal to send. @@ -324,9 +336,9 @@ export interface ProcessKillParams { export interface ProcessResizeParams { /** - * Path param: Browser session ID + * Path param: Browser session ID or name */ - id: string; + id_or_name: string; /** * Body param: New terminal columns. @@ -393,16 +405,16 @@ export interface ProcessSpawnParams { export interface ProcessStatusParams { /** - * Browser session ID + * Browser session ID or name */ - id: string; + id_or_name: string; } export interface ProcessStdinParams { /** - * Path param: Browser session ID + * Path param: Browser session ID or name */ - id: string; + id_or_name: string; /** * Body param: Base64-encoded data to write. @@ -412,9 +424,9 @@ export interface ProcessStdinParams { export interface ProcessStdoutStreamParams { /** - * Browser session ID + * Browser session ID or name */ - id: string; + id_or_name: string; } export declare namespace Process { diff --git a/src/resources/browsers/replays.ts b/src/resources/browsers/replays.ts index 1954856f..5bb672c5 100644 --- a/src/resources/browsers/replays.ts +++ b/src/resources/browsers/replays.ts @@ -15,11 +15,13 @@ export class Replays extends APIResource { * * @example * ```ts - * const replays = await client.browsers.replays.list('id'); + * const replays = await client.browsers.replays.list( + * 'htzv5orfit78e1m2biiifpbv', + * ); * ``` */ - list(id: string, options?: RequestOptions): APIPromise { - return this._client.get(path`/browsers/${id}/replays`, options); + list(idOrName: string, options?: RequestOptions): APIPromise { + return this._client.get(path`/browsers/${idOrName}/replays`, options); } /** @@ -29,7 +31,7 @@ export class Replays extends APIResource { * ```ts * const response = await client.browsers.replays.download( * 'replay_id', - * { id: 'id' }, + * { id_or_name: 'htzv5orfit78e1m2biiifpbv' }, * ); * * const content = await response.blob(); @@ -37,8 +39,8 @@ export class Replays extends APIResource { * ``` */ download(replayID: string, params: ReplayDownloadParams, options?: RequestOptions): APIPromise { - const { id } = params; - return this._client.get(path`/browsers/${id}/replays/${replayID}`, { + const { id_or_name } = params; + return this._client.get(path`/browsers/${id_or_name}/replays/${replayID}`, { ...options, headers: buildHeaders([{ Accept: 'video/mp4' }, options?.headers]), __binaryResponse: true, @@ -50,15 +52,17 @@ export class Replays extends APIResource { * * @example * ```ts - * const response = await client.browsers.replays.start('id'); + * const response = await client.browsers.replays.start( + * 'htzv5orfit78e1m2biiifpbv', + * ); * ``` */ start( - id: string, + idOrName: string, body: ReplayStartParams | null | undefined = {}, options?: RequestOptions, ): APIPromise { - return this._client.post(path`/browsers/${id}/replays`, { body, ...options }); + return this._client.post(path`/browsers/${idOrName}/replays`, { body, ...options }); } /** @@ -67,13 +71,13 @@ export class Replays extends APIResource { * @example * ```ts * await client.browsers.replays.stop('replay_id', { - * id: 'id', + * id_or_name: 'htzv5orfit78e1m2biiifpbv', * }); * ``` */ stop(replayID: string, params: ReplayStopParams, options?: RequestOptions): APIPromise { - const { id } = params; - return this._client.post(path`/browsers/${id}/replays/${replayID}/stop`, { + const { id_or_name } = params; + return this._client.post(path`/browsers/${id_or_name}/replays/${replayID}/stop`, { ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), }); @@ -136,9 +140,9 @@ export interface ReplayStartResponse { export interface ReplayDownloadParams { /** - * Browser session ID + * Browser session ID or name */ - id: string; + id_or_name: string; } export interface ReplayStartParams { @@ -162,9 +166,9 @@ export interface ReplayStartParams { export interface ReplayStopParams { /** - * Browser session ID + * Browser session ID or name */ - id: string; + id_or_name: string; } export declare namespace Replays { diff --git a/src/resources/browsers/telemetry.ts b/src/resources/browsers/telemetry.ts index c785e171..bd08cde1 100644 --- a/src/resources/browsers/telemetry.ts +++ b/src/resources/browsers/telemetry.ts @@ -23,19 +23,19 @@ export class Telemetry extends APIResource { * ```ts * // Automatically fetches more pages as needed. * for await (const telemetryEventsResponse of client.browsers.telemetry.events( - * 'id', + * 'htzv5orfit78e1m2biiifpbv', * )) { * // ... * } * ``` */ events( - id: string, + idOrName: string, query: TelemetryEventsParams | null | undefined = {}, options?: RequestOptions, ): PagePromise { return this._client.getAPIList( - path`/browsers/${id}/telemetry/events`, + path`/browsers/${idOrName}/telemetry/events`, OffsetPagination, { query, ...options }, ); @@ -55,17 +55,17 @@ export class Telemetry extends APIResource { * @example * ```ts * const response = await client.browsers.telemetry.stream( - * 'id', + * 'htzv5orfit78e1m2biiifpbv', * ); * ``` */ stream( - id: string, + idOrName: string, params: TelemetryStreamParams | undefined = {}, options?: RequestOptions, ): APIPromise> { const { 'Last-Event-ID': lastEventID, ...query } = params ?? {}; - return this._client.get(path`/browsers/${id}/telemetry/stream`, { + return this._client.get(path`/browsers/${idOrName}/telemetry/stream`, { query, ...options, headers: buildHeaders([ diff --git a/src/resources/browsers/webmcp.ts b/src/resources/browsers/webmcp.ts new file mode 100644 index 00000000..ff7e871a --- /dev/null +++ b/src/resources/browsers/webmcp.ts @@ -0,0 +1,196 @@ +// 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'; + +/** + * Discover and invoke native page tools across the browser instance. + */ +export class Webmcp extends APIResource { + /** + * Invokes the exact live registration identified by tool_ref and waits + * synchronously for its result. Navigation during execution is allowed. If the tab + * or embedded frame disappears, or the request times out after invocation begins, + * the response reports outcome_unknown and the tool is not retried. + * + * @example + * ```ts + * const invocationResult = + * await client.browsers.webmcp.invokeTool( + * 'htzv5orfit78e1m2biiifpbv', + * { + * input: { foo: 'bar' }, + * tool_ref: 'x', + * }, + * ); + * ``` + */ + invokeTool( + idOrName: string, + body: WebmcpInvokeToolParams, + options?: RequestOptions, + ): APIPromise { + return this._client.post(path`/browsers/${idOrName}/webmcp/invoke`, { body, ...options }); + } + + /** + * Returns a snapshot of native WebMCP tools available across every open tab and + * embedded frame in the browser. Each tool includes an opaque tool_ref for + * invoking that exact live registration. Tools disappear when their document + * closes or navigates away. + * + * @example + * ```ts + * const toolsResponse = + * await client.browsers.webmcp.listTools( + * 'htzv5orfit78e1m2biiifpbv', + * ); + * ``` + */ + listTools(idOrName: string, options?: RequestOptions): APIPromise { + return this._client.get(path`/browsers/${idOrName}/webmcp/tools`, options); + } +} + +export interface InvocationFailure { + code: 'outcome_unknown'; + + message: string; + + invocation_id?: string; +} + +export interface InvocationResult { + invocation_id: string; + + status: 'completed' | 'canceled' | 'error'; + + error_text?: string; + + /** + * Untrusted page-provided output. Callers must treat it as potentially malicious + * input. + */ + output?: unknown; +} + +export interface InvokeRequest { + /** + * Tool input, limited to 1 MiB after JSON serialization. + */ + input: { [key: string]: unknown }; + + tool_ref: string; + + timeout_sec?: number; +} + +export interface Tool { + description: string; + + input_schema: { [key: string]: unknown }; + + name: string; + + source: ToolSource; + + /** + * Opaque reference for invoking this exact live registration. It becomes invalid + * when its document or browser process is replaced. + */ + tool_ref: string; + + /** + * Page-provided behavioral hints. These values are untrusted and are not enforced + * by Kernel. + */ + annotations?: ToolAnnotations; +} + +/** + * Page-provided behavioral hints. These values are untrusted and are not enforced + * by Kernel. + */ +export interface ToolAnnotations { + autosubmit: boolean; + + consequential: boolean; + + read_only: boolean; + + untrusted_content: boolean; +} + +export interface ToolFrame { + /** + * Monotonically increasing identifier for this embedded frame during the current + * browser process. + */ + frame_id: number; + + /** + * Current frame URL with the fragment omitted. + */ + url: string; +} + +export interface ToolSource { + /** + * Embedded frame that registered the tool, or null when the top-level page + * registered it. + */ + frame: ToolFrame | null; + + /** + * Current title of the top-level page. + */ + page_title: string; + + /** + * Current URL of the top-level page with the fragment omitted. + */ + page_url: string; + + /** + * Monotonically increasing identifier for the tab during the current browser + * process. + */ + tab_id: number; + + /** + * Monotonically increasing identifier for the browser window during the current + * browser process. + */ + window_id: number; +} + +export interface ToolsResponse { + tools: Array; +} + +export interface WebmcpInvokeToolParams { + /** + * Tool input, limited to 1 MiB after JSON serialization. + */ + input: { [key: string]: unknown }; + + tool_ref: string; + + timeout_sec?: number; +} + +export declare namespace Webmcp { + export { + type InvocationFailure as InvocationFailure, + type InvocationResult as InvocationResult, + type InvokeRequest as InvokeRequest, + type Tool as Tool, + type ToolAnnotations as ToolAnnotations, + type ToolFrame as ToolFrame, + type ToolSource as ToolSource, + type ToolsResponse as ToolsResponse, + type WebmcpInvokeToolParams as WebmcpInvokeToolParams, + }; +} diff --git a/src/resources/telemetry/destinations.ts b/src/resources/telemetry/destinations.ts index d3846d93..0c5b8ada 100644 --- a/src/resources/telemetry/destinations.ts +++ b/src/resources/telemetry/destinations.ts @@ -12,15 +12,19 @@ import { path } from '../../internal/utils/path'; */ export class Destinations extends APIResource { /** - * Create an OTLP export destination in the resolved project. Names must be unique - * within the project. + * Create an OTLP export destination in the authenticated organization. Names must + * be unique within the organization. Requires an organization-scoped credential or + * dashboard authentication; project-scoped credentials receive a 403. */ create(body: DestinationCreateParams, options?: RequestOptions): APIPromise { return this._client.post('/telemetry/destinations', { body, ...options }); } /** - * Retrieve a single OTLP destination in the resolved project by its ID or name. + * Retrieve a customer-visible OTLP destination in the authenticated organization + * by its ID or name. Project-scoped credentials can retrieve these destinations + * for selection by workloads in their project. Non-dashboard reads return header + * values redacted. */ retrieve(idOrName: string, options?: RequestOptions): APIPromise { return this._client.get(path`/telemetry/destinations/${idOrName}`, options); @@ -31,10 +35,11 @@ export class Destinations extends APIResource { * values without restarting, which makes this the way to rotate credentials * without interrupting export. * - * Names must be unique within the project. Renaming is refused with a 409 while a - * managed auth connection selects this destination by name, since that connection - * resolves the name on every login. Every other field, including `headers`, stays - * editable. + * Names must be unique within the organization. Renaming is refused with a 409 + * while a managed auth connection selects this destination by name, since that + * connection resolves the name on every login. Every other field, including + * `headers`, stays editable. Requires an organization-scoped credential or + * dashboard authentication; project-scoped credentials receive a 403. */ update( idOrName: string, @@ -45,7 +50,10 @@ export class Destinations extends APIResource { } /** - * List OTLP export destinations in the resolved project. + * List customer-visible OTLP export destinations in the authenticated + * organization. Project-scoped credentials can list these destinations for + * selection by workloads in their project. Non-dashboard reads return header + * values redacted. */ list( query: DestinationListParams | null | undefined = {}, @@ -63,6 +71,8 @@ export class Destinations extends APIResource { * end or delete them first. It is refused the same way while a managed auth * connection still selects it, because that connection re-resolves the destination * on every login, and while a managed auth login using it is still in progress. + * Requires an organization-scoped credential or dashboard authentication; + * project-scoped credentials receive a 403. */ delete(idOrName: string, options?: RequestOptions): APIPromise { return this._client.delete(path`/telemetry/destinations/${idOrName}`, { @@ -91,13 +101,14 @@ export interface OtlpDestination { /** * Headers sent with each export request. Names are returned in canonical form - * (`Authorization`, not `authorization`). Values are returned redacted as empty - * strings, so the keys are visible but the credentials are not. + * (`Authorization`, not `authorization`). Non-dashboard reads return values + * redacted as empty strings, so the keys are visible but the credentials are not. + * Dashboard reads return the stored values. */ headers: { [key: string]: string }; /** - * Unique within the project. Usable in place of the ID when selecting a + * Unique within the organization. Usable in place of the ID when selecting a * destination, so it cannot be shaped like an ID. */ name: string; @@ -124,7 +135,7 @@ export interface DestinationCreateParams { endpoint: string; /** - * Unique within the project. + * Unique within the organization. */ name: string; diff --git a/src/version.ts b/src/version.ts index 1b7c9366..f94f8b86 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.97.0'; // x-release-please-version +export const VERSION = '0.98.0'; // x-release-please-version diff --git a/tests/api-resources/browsers/browsers.test.ts b/tests/api-resources/browsers/browsers.test.ts index b9dfeb5f..4c60d15e 100644 --- a/tests/api-resources/browsers/browsers.test.ts +++ b/tests/api-resources/browsers/browsers.test.ts @@ -155,7 +155,7 @@ describe('resource browsers', () => { // Mock server tests are disabled test.skip('curl: only required params', async () => { - const responsePromise = client.browsers.curl('id', { url: 'url' }); + const responsePromise = client.browsers.curl('htzv5orfit78e1m2biiifpbv', { url: 'url' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -167,7 +167,7 @@ describe('resource browsers', () => { // Mock server tests are disabled test.skip('curl: required and optional params', async () => { - const response = await client.browsers.curl('id', { + const response = await client.browsers.curl('htzv5orfit78e1m2biiifpbv', { url: 'url', body: 'body', headers: { foo: 'string' }, @@ -191,7 +191,7 @@ describe('resource browsers', () => { // Mock server tests are disabled test.skip('loadExtensions: only required params', async () => { - const responsePromise = client.browsers.loadExtensions('id', { + const responsePromise = client.browsers.loadExtensions('htzv5orfit78e1m2biiifpbv', { extensions: [{ name: 'name', zip_file: await toFile(Buffer.from('Example data'), 'README.md') }], }); const rawResponse = await responsePromise.asResponse(); @@ -205,7 +205,7 @@ describe('resource browsers', () => { // Mock server tests are disabled test.skip('loadExtensions: required and optional params', async () => { - const response = await client.browsers.loadExtensions('id', { + const response = await client.browsers.loadExtensions('htzv5orfit78e1m2biiifpbv', { extensions: [{ name: 'name', zip_file: await toFile(Buffer.from('Example data'), 'README.md') }], }); }); diff --git a/tests/api-resources/browsers/computer.test.ts b/tests/api-resources/browsers/computer.test.ts index 807834d7..9d552355 100644 --- a/tests/api-resources/browsers/computer.test.ts +++ b/tests/api-resources/browsers/computer.test.ts @@ -10,7 +10,9 @@ const client = new Kernel({ describe('resource computer', () => { // Mock server tests are disabled test.skip('batch: only required params', async () => { - const responsePromise = client.browsers.computer.batch('id', { actions: [{ type: 'click_mouse' }] }); + const responsePromise = client.browsers.computer.batch('htzv5orfit78e1m2biiifpbv', { + actions: [{ type: 'click_mouse' }], + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -22,7 +24,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('batch: required and optional params', async () => { - const response = await client.browsers.computer.batch('id', { + const response = await client.browsers.computer.batch('htzv5orfit78e1m2biiifpbv', { actions: [ { type: 'click_mouse', @@ -79,7 +81,7 @@ describe('resource computer', () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( client.browsers.computer.captureScreenshot( - 'id', + 'htzv5orfit78e1m2biiifpbv', { region: { height: 0, @@ -95,7 +97,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('clickMouse: only required params', async () => { - const responsePromise = client.browsers.computer.clickMouse('id', { x: 0, y: 0 }); + const responsePromise = client.browsers.computer.clickMouse('htzv5orfit78e1m2biiifpbv', { x: 0, y: 0 }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -107,7 +109,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('clickMouse: required and optional params', async () => { - const response = await client.browsers.computer.clickMouse('id', { + const response = await client.browsers.computer.clickMouse('htzv5orfit78e1m2biiifpbv', { x: 0, y: 0, button: 'left', @@ -119,7 +121,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('dragMouse: only required params', async () => { - const responsePromise = client.browsers.computer.dragMouse('id', { + const responsePromise = client.browsers.computer.dragMouse('htzv5orfit78e1m2biiifpbv', { path: [ [0, 0], [0, 0], @@ -136,7 +138,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('dragMouse: required and optional params', async () => { - const response = await client.browsers.computer.dragMouse('id', { + const response = await client.browsers.computer.dragMouse('htzv5orfit78e1m2biiifpbv', { path: [ [0, 0], [0, 0], @@ -153,7 +155,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('getMousePosition', async () => { - const responsePromise = client.browsers.computer.getMousePosition('id'); + const responsePromise = client.browsers.computer.getMousePosition('htzv5orfit78e1m2biiifpbv'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -165,7 +167,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('moveMouse: only required params', async () => { - const responsePromise = client.browsers.computer.moveMouse('id', { x: 0, y: 0 }); + const responsePromise = client.browsers.computer.moveMouse('htzv5orfit78e1m2biiifpbv', { x: 0, y: 0 }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -177,7 +179,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('moveMouse: required and optional params', async () => { - const response = await client.browsers.computer.moveMouse('id', { + const response = await client.browsers.computer.moveMouse('htzv5orfit78e1m2biiifpbv', { x: 0, y: 0, duration_ms: 50, @@ -188,7 +190,9 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('pressKey: only required params', async () => { - const responsePromise = client.browsers.computer.pressKey('id', { keys: ['string'] }); + const responsePromise = client.browsers.computer.pressKey('htzv5orfit78e1m2biiifpbv', { + keys: ['string'], + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -200,7 +204,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('pressKey: required and optional params', async () => { - const response = await client.browsers.computer.pressKey('id', { + const response = await client.browsers.computer.pressKey('htzv5orfit78e1m2biiifpbv', { keys: ['string'], duration: 0, hold_keys: ['string'], @@ -209,7 +213,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('readClipboard', async () => { - const responsePromise = client.browsers.computer.readClipboard('id'); + const responsePromise = client.browsers.computer.readClipboard('htzv5orfit78e1m2biiifpbv'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -221,7 +225,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('scroll: only required params', async () => { - const responsePromise = client.browsers.computer.scroll('id', { x: 0, y: 0 }); + const responsePromise = client.browsers.computer.scroll('htzv5orfit78e1m2biiifpbv', { x: 0, y: 0 }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -233,7 +237,7 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('scroll: required and optional params', async () => { - const response = await client.browsers.computer.scroll('id', { + const response = await client.browsers.computer.scroll('htzv5orfit78e1m2biiifpbv', { x: 0, y: 0, delta_x: 0, @@ -244,7 +248,9 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('setCursorVisibility: only required params', async () => { - const responsePromise = client.browsers.computer.setCursorVisibility('id', { hidden: true }); + const responsePromise = client.browsers.computer.setCursorVisibility('htzv5orfit78e1m2biiifpbv', { + hidden: true, + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -256,12 +262,14 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('setCursorVisibility: required and optional params', async () => { - const response = await client.browsers.computer.setCursorVisibility('id', { hidden: true }); + const response = await client.browsers.computer.setCursorVisibility('htzv5orfit78e1m2biiifpbv', { + hidden: true, + }); }); // Mock server tests are disabled test.skip('typeText: only required params', async () => { - const responsePromise = client.browsers.computer.typeText('id', { text: 'text' }); + const responsePromise = client.browsers.computer.typeText('htzv5orfit78e1m2biiifpbv', { text: 'text' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -273,12 +281,17 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('typeText: required and optional params', async () => { - const response = await client.browsers.computer.typeText('id', { text: 'text', delay: 0 }); + const response = await client.browsers.computer.typeText('htzv5orfit78e1m2biiifpbv', { + text: 'text', + delay: 0, + }); }); // Mock server tests are disabled test.skip('writeClipboard: only required params', async () => { - const responsePromise = client.browsers.computer.writeClipboard('id', { text: 'text' }); + const responsePromise = client.browsers.computer.writeClipboard('htzv5orfit78e1m2biiifpbv', { + text: 'text', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -290,6 +303,8 @@ describe('resource computer', () => { // Mock server tests are disabled test.skip('writeClipboard: required and optional params', async () => { - const response = await client.browsers.computer.writeClipboard('id', { text: 'text' }); + const response = await client.browsers.computer.writeClipboard('htzv5orfit78e1m2biiifpbv', { + text: 'text', + }); }); }); diff --git a/tests/api-resources/browsers/fs/fs.test.ts b/tests/api-resources/browsers/fs/fs.test.ts index 6dcd3dba..54e3023e 100644 --- a/tests/api-resources/browsers/fs/fs.test.ts +++ b/tests/api-resources/browsers/fs/fs.test.ts @@ -10,7 +10,7 @@ const client = new Kernel({ describe('resource fs', () => { // Mock server tests are disabled test.skip('createDirectory: only required params', async () => { - const responsePromise = client.browsers.fs.createDirectory('id', { path: '/J!' }); + const responsePromise = client.browsers.fs.createDirectory('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -22,12 +22,15 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('createDirectory: required and optional params', async () => { - const response = await client.browsers.fs.createDirectory('id', { path: '/J!', mode: '0611' }); + const response = await client.browsers.fs.createDirectory('htzv5orfit78e1m2biiifpbv', { + path: '/J!', + mode: '0611', + }); }); // Mock server tests are disabled test.skip('deleteDirectory: only required params', async () => { - const responsePromise = client.browsers.fs.deleteDirectory('id', { path: '/J!' }); + const responsePromise = client.browsers.fs.deleteDirectory('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -39,12 +42,12 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('deleteDirectory: required and optional params', async () => { - const response = await client.browsers.fs.deleteDirectory('id', { path: '/J!' }); + const response = await client.browsers.fs.deleteDirectory('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); }); // Mock server tests are disabled test.skip('deleteFile: only required params', async () => { - const responsePromise = client.browsers.fs.deleteFile('id', { path: '/J!' }); + const responsePromise = client.browsers.fs.deleteFile('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -56,17 +59,17 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('deleteFile: required and optional params', async () => { - const response = await client.browsers.fs.deleteFile('id', { path: '/J!' }); + const response = await client.browsers.fs.deleteFile('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); }); // Mock server tests are disabled test.skip('downloadDirZip: required and optional params', async () => { - const response = await client.browsers.fs.downloadDirZip('id', { path: '/J!' }); + const response = await client.browsers.fs.downloadDirZip('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); }); // Mock server tests are disabled test.skip('fileInfo: only required params', async () => { - const responsePromise = client.browsers.fs.fileInfo('id', { path: '/J!' }); + const responsePromise = client.browsers.fs.fileInfo('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -78,12 +81,12 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('fileInfo: required and optional params', async () => { - const response = await client.browsers.fs.fileInfo('id', { path: '/J!' }); + const response = await client.browsers.fs.fileInfo('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); }); // Mock server tests are disabled test.skip('listFiles: only required params', async () => { - const responsePromise = client.browsers.fs.listFiles('id', { path: '/J!' }); + const responsePromise = client.browsers.fs.listFiles('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -95,12 +98,15 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('listFiles: required and optional params', async () => { - const response = await client.browsers.fs.listFiles('id', { path: '/J!' }); + const response = await client.browsers.fs.listFiles('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); }); // Mock server tests are disabled test.skip('move: only required params', async () => { - const responsePromise = client.browsers.fs.move('id', { dest_path: '/J!', src_path: '/J!' }); + const responsePromise = client.browsers.fs.move('htzv5orfit78e1m2biiifpbv', { + dest_path: '/J!', + src_path: '/J!', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -112,17 +118,23 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('move: required and optional params', async () => { - const response = await client.browsers.fs.move('id', { dest_path: '/J!', src_path: '/J!' }); + const response = await client.browsers.fs.move('htzv5orfit78e1m2biiifpbv', { + dest_path: '/J!', + src_path: '/J!', + }); }); // Mock server tests are disabled test.skip('readFile: required and optional params', async () => { - const response = await client.browsers.fs.readFile('id', { path: '/J!' }); + const response = await client.browsers.fs.readFile('htzv5orfit78e1m2biiifpbv', { path: '/J!' }); }); // Mock server tests are disabled test.skip('setFilePermissions: only required params', async () => { - const responsePromise = client.browsers.fs.setFilePermissions('id', { mode: '0611', path: '/J!' }); + const responsePromise = client.browsers.fs.setFilePermissions('htzv5orfit78e1m2biiifpbv', { + mode: '0611', + path: '/J!', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -134,7 +146,7 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('setFilePermissions: required and optional params', async () => { - const response = await client.browsers.fs.setFilePermissions('id', { + const response = await client.browsers.fs.setFilePermissions('htzv5orfit78e1m2biiifpbv', { mode: '0611', path: '/J!', group: 'group', @@ -144,7 +156,7 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('upload: only required params', async () => { - const responsePromise = client.browsers.fs.upload('id', { + const responsePromise = client.browsers.fs.upload('htzv5orfit78e1m2biiifpbv', { files: [{ dest_path: '/J!', file: await toFile(Buffer.from('Example data'), 'README.md') }], }); const rawResponse = await responsePromise.asResponse(); @@ -158,14 +170,14 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('upload: required and optional params', async () => { - const response = await client.browsers.fs.upload('id', { + const response = await client.browsers.fs.upload('htzv5orfit78e1m2biiifpbv', { files: [{ dest_path: '/J!', file: await toFile(Buffer.from('Example data'), 'README.md') }], }); }); // Mock server tests are disabled test.skip('uploadZip: only required params', async () => { - const responsePromise = client.browsers.fs.uploadZip('id', { + const responsePromise = client.browsers.fs.uploadZip('htzv5orfit78e1m2biiifpbv', { dest_path: '/J!', zip_file: await toFile(Buffer.from('Example data'), 'README.md'), }); @@ -180,7 +192,7 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('uploadZip: required and optional params', async () => { - const response = await client.browsers.fs.uploadZip('id', { + const response = await client.browsers.fs.uploadZip('htzv5orfit78e1m2biiifpbv', { dest_path: '/J!', zip_file: await toFile(Buffer.from('Example data'), 'README.md'), }); @@ -189,7 +201,7 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('writeFile: only required params', async () => { const responsePromise = client.browsers.fs.writeFile( - 'id', + 'htzv5orfit78e1m2biiifpbv', await toFile(Buffer.from('Example data'), 'README.md'), { path: '/J!' }, ); @@ -205,7 +217,7 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('writeFile: required and optional params', async () => { const response = await client.browsers.fs.writeFile( - 'id', + 'htzv5orfit78e1m2biiifpbv', await toFile(Buffer.from('Example data'), 'README.md'), { path: '/J!', mode: '0611' }, ); diff --git a/tests/api-resources/browsers/fs/watch.test.ts b/tests/api-resources/browsers/fs/watch.test.ts index 5d98d0f9..26bde3f3 100644 --- a/tests/api-resources/browsers/fs/watch.test.ts +++ b/tests/api-resources/browsers/fs/watch.test.ts @@ -10,7 +10,9 @@ const client = new Kernel({ describe('resource watch', () => { // Mock server tests are disabled test.skip('events: only required params', async () => { - const responsePromise = client.browsers.fs.watch.events('watch_id', { id: 'id' }); + const responsePromise = client.browsers.fs.watch.events('watch_id', { + id_or_name: 'htzv5orfit78e1m2biiifpbv', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -22,12 +24,14 @@ describe('resource watch', () => { // Mock server tests are disabled test.skip('events: required and optional params', async () => { - const response = await client.browsers.fs.watch.events('watch_id', { id: 'id' }); + const response = await client.browsers.fs.watch.events('watch_id', { + id_or_name: 'htzv5orfit78e1m2biiifpbv', + }); }); // Mock server tests are disabled test.skip('start: only required params', async () => { - const responsePromise = client.browsers.fs.watch.start('id', { path: 'path' }); + const responsePromise = client.browsers.fs.watch.start('htzv5orfit78e1m2biiifpbv', { path: 'path' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -39,12 +43,17 @@ describe('resource watch', () => { // Mock server tests are disabled test.skip('start: required and optional params', async () => { - const response = await client.browsers.fs.watch.start('id', { path: 'path', recursive: true }); + const response = await client.browsers.fs.watch.start('htzv5orfit78e1m2biiifpbv', { + path: 'path', + recursive: true, + }); }); // Mock server tests are disabled test.skip('stop: only required params', async () => { - const responsePromise = client.browsers.fs.watch.stop('watch_id', { id: 'id' }); + const responsePromise = client.browsers.fs.watch.stop('watch_id', { + id_or_name: 'htzv5orfit78e1m2biiifpbv', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -56,6 +65,8 @@ describe('resource watch', () => { // Mock server tests are disabled test.skip('stop: required and optional params', async () => { - const response = await client.browsers.fs.watch.stop('watch_id', { id: 'id' }); + const response = await client.browsers.fs.watch.stop('watch_id', { + id_or_name: 'htzv5orfit78e1m2biiifpbv', + }); }); }); diff --git a/tests/api-resources/browsers/logs.test.ts b/tests/api-resources/browsers/logs.test.ts index 893d9aa7..32a26535 100644 --- a/tests/api-resources/browsers/logs.test.ts +++ b/tests/api-resources/browsers/logs.test.ts @@ -10,7 +10,7 @@ const client = new Kernel({ describe('resource logs', () => { // Mock server tests are disabled test.skip('stream: only required params', async () => { - const responsePromise = client.browsers.logs.stream('id', { source: 'path' }); + const responsePromise = client.browsers.logs.stream('htzv5orfit78e1m2biiifpbv', { source: 'path' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -22,7 +22,7 @@ describe('resource logs', () => { // Mock server tests are disabled test.skip('stream: required and optional params', async () => { - const response = await client.browsers.logs.stream('id', { + const response = await client.browsers.logs.stream('htzv5orfit78e1m2biiifpbv', { source: 'path', follow: true, path: 'path', diff --git a/tests/api-resources/browsers/playwright.test.ts b/tests/api-resources/browsers/playwright.test.ts index 8b16eec9..a3cea970 100644 --- a/tests/api-resources/browsers/playwright.test.ts +++ b/tests/api-resources/browsers/playwright.test.ts @@ -10,7 +10,7 @@ const client = new Kernel({ describe('resource playwright', () => { // Mock server tests are disabled test.skip('execute: only required params', async () => { - const responsePromise = client.browsers.playwright.execute('id', { code: 'code' }); + const responsePromise = client.browsers.playwright.execute('htzv5orfit78e1m2biiifpbv', { code: 'code' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -22,6 +22,9 @@ describe('resource playwright', () => { // Mock server tests are disabled test.skip('execute: required and optional params', async () => { - const response = await client.browsers.playwright.execute('id', { code: 'code', timeout_sec: 1 }); + const response = await client.browsers.playwright.execute('htzv5orfit78e1m2biiifpbv', { + code: 'code', + timeout_sec: 1, + }); }); }); diff --git a/tests/api-resources/browsers/process.test.ts b/tests/api-resources/browsers/process.test.ts index fda1a924..13e48bf5 100644 --- a/tests/api-resources/browsers/process.test.ts +++ b/tests/api-resources/browsers/process.test.ts @@ -10,7 +10,7 @@ const client = new Kernel({ describe('resource process', () => { // Mock server tests are disabled test.skip('exec: only required params', async () => { - const responsePromise = client.browsers.process.exec('id', { command: 'command' }); + const responsePromise = client.browsers.process.exec('htzv5orfit78e1m2biiifpbv', { command: 'command' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -22,7 +22,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('exec: required and optional params', async () => { - const response = await client.browsers.process.exec('id', { + const response = await client.browsers.process.exec('htzv5orfit78e1m2biiifpbv', { command: 'command', args: ['string'], as_root: true, @@ -36,7 +36,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('kill: only required params', async () => { const responsePromise = client.browsers.process.kill('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', signal: 'TERM', }); const rawResponse = await responsePromise.asResponse(); @@ -51,7 +51,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('kill: required and optional params', async () => { const response = await client.browsers.process.kill('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', signal: 'TERM', }); }); @@ -59,7 +59,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('resize: only required params', async () => { const responsePromise = client.browsers.process.resize('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', cols: 1, rows: 1, }); @@ -75,7 +75,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('resize: required and optional params', async () => { const response = await client.browsers.process.resize('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', cols: 1, rows: 1, }); @@ -83,7 +83,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('spawn: only required params', async () => { - const responsePromise = client.browsers.process.spawn('id', { command: 'command' }); + const responsePromise = client.browsers.process.spawn('htzv5orfit78e1m2biiifpbv', { command: 'command' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -95,7 +95,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('spawn: required and optional params', async () => { - const response = await client.browsers.process.spawn('id', { + const response = await client.browsers.process.spawn('htzv5orfit78e1m2biiifpbv', { command: 'command', allocate_tty: true, args: ['string'], @@ -112,7 +112,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('status: only required params', async () => { const responsePromise = client.browsers.process.status('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); @@ -126,14 +126,14 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('status: required and optional params', async () => { const response = await client.browsers.process.status('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', }); }); // Mock server tests are disabled test.skip('stdin: only required params', async () => { const responsePromise = client.browsers.process.stdin('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', data_b64: 'data_b64', }); const rawResponse = await responsePromise.asResponse(); @@ -148,7 +148,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('stdin: required and optional params', async () => { const response = await client.browsers.process.stdin('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', data_b64: 'data_b64', }); }); @@ -156,7 +156,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('stdoutStream: only required params', async () => { const responsePromise = client.browsers.process.stdoutStream('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); @@ -170,7 +170,7 @@ describe('resource process', () => { // Mock server tests are disabled test.skip('stdoutStream: required and optional params', async () => { const response = await client.browsers.process.stdoutStream('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', { - id: 'id', + id_or_name: 'htzv5orfit78e1m2biiifpbv', }); }); }); diff --git a/tests/api-resources/browsers/replays.test.ts b/tests/api-resources/browsers/replays.test.ts index 672a7789..60e7ed96 100644 --- a/tests/api-resources/browsers/replays.test.ts +++ b/tests/api-resources/browsers/replays.test.ts @@ -10,7 +10,7 @@ const client = new Kernel({ describe('resource replays', () => { // Mock server tests are disabled test.skip('list', async () => { - const responsePromise = client.browsers.replays.list('id'); + const responsePromise = client.browsers.replays.list('htzv5orfit78e1m2biiifpbv'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -22,12 +22,14 @@ describe('resource replays', () => { // Mock server tests are disabled test.skip('download: required and optional params', async () => { - const response = await client.browsers.replays.download('replay_id', { id: 'id' }); + const response = await client.browsers.replays.download('replay_id', { + id_or_name: 'htzv5orfit78e1m2biiifpbv', + }); }); // Mock server tests are disabled test.skip('start', async () => { - const responsePromise = client.browsers.replays.start('id'); + const responsePromise = client.browsers.replays.start('htzv5orfit78e1m2biiifpbv'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -42,7 +44,7 @@ describe('resource replays', () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( client.browsers.replays.start( - 'id', + 'htzv5orfit78e1m2biiifpbv', { framerate: 1, max_duration_in_seconds: 1, @@ -55,7 +57,9 @@ describe('resource replays', () => { // Mock server tests are disabled test.skip('stop: only required params', async () => { - const responsePromise = client.browsers.replays.stop('replay_id', { id: 'id' }); + const responsePromise = client.browsers.replays.stop('replay_id', { + id_or_name: 'htzv5orfit78e1m2biiifpbv', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -67,6 +71,8 @@ describe('resource replays', () => { // Mock server tests are disabled test.skip('stop: required and optional params', async () => { - const response = await client.browsers.replays.stop('replay_id', { id: 'id' }); + const response = await client.browsers.replays.stop('replay_id', { + id_or_name: 'htzv5orfit78e1m2biiifpbv', + }); }); }); diff --git a/tests/api-resources/browsers/telemetry.test.ts b/tests/api-resources/browsers/telemetry.test.ts index d096d2c5..797d2539 100644 --- a/tests/api-resources/browsers/telemetry.test.ts +++ b/tests/api-resources/browsers/telemetry.test.ts @@ -10,7 +10,7 @@ const client = new Kernel({ describe('resource telemetry', () => { // Mock server tests are disabled test.skip('events', async () => { - const responsePromise = client.browsers.telemetry.events('id'); + const responsePromise = client.browsers.telemetry.events('htzv5orfit78e1m2biiifpbv'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -25,7 +25,7 @@ describe('resource telemetry', () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( client.browsers.telemetry.events( - 'id', + 'htzv5orfit78e1m2biiifpbv', { category: ['console'], limit: 1, @@ -41,7 +41,7 @@ describe('resource telemetry', () => { // Mock server tests are disabled test.skip('stream', async () => { - const responsePromise = client.browsers.telemetry.stream('id'); + const responsePromise = client.browsers.telemetry.stream('htzv5orfit78e1m2biiifpbv'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -56,7 +56,7 @@ describe('resource telemetry', () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( client.browsers.telemetry.stream( - 'id', + 'htzv5orfit78e1m2biiifpbv', { replay: 'replay', 'Last-Event-ID': 'Last-Event-ID' }, { path: '/_stainless_unknown_path' }, ), diff --git a/tests/api-resources/browsers/webmcp.test.ts b/tests/api-resources/browsers/webmcp.test.ts new file mode 100644 index 00000000..7bfb8db4 --- /dev/null +++ b/tests/api-resources/browsers/webmcp.test.ts @@ -0,0 +1,46 @@ +// 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 webmcp', () => { + // Mock server tests are disabled + test.skip('invokeTool: only required params', async () => { + const responsePromise = client.browsers.webmcp.invokeTool('htzv5orfit78e1m2biiifpbv', { + input: { foo: 'bar' }, + tool_ref: 'x', + }); + 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('invokeTool: required and optional params', async () => { + const response = await client.browsers.webmcp.invokeTool('htzv5orfit78e1m2biiifpbv', { + input: { foo: 'bar' }, + tool_ref: 'x', + timeout_sec: 1, + }); + }); + + // Mock server tests are disabled + test.skip('listTools', async () => { + const responsePromise = client.browsers.webmcp.listTools('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); + }); +});