Skip to content

Commit 77333ab

Browse files
feat: WIP browser extensions
1 parent aac1084 commit 77333ab

File tree

9 files changed

+408
-5
lines changed

9 files changed

+408
-5
lines changed

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 51
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-8a6175a75caa75c3de5400edf97a34e526ac3f62c63955375437461581deb0c2.yml
3-
openapi_spec_hash: 1a880e4ce337a0e44630e6d87ef5162a
4-
config_hash: 49c2ff978aaa5ccb4ce324a72f116010
1+
configured_endpoints: 57
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-936db268b3dcae5d64bd5d590506d8134304ffcbf67389eb9b1555b3febfd4cb.yml
3+
openapi_spec_hash: 145485087adf1b28c052bacb4df68462
4+
config_hash: 5236f9b34e39dc1930e36a88c714abd4

api.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ Methods:
7373
- <code title="get /browsers">client.browsers.<a href="./src/resources/browsers/browsers.ts">list</a>() -> BrowserListResponse</code>
7474
- <code title="delete /browsers">client.browsers.<a href="./src/resources/browsers/browsers.ts">delete</a>({ ...params }) -> void</code>
7575
- <code title="delete /browsers/{id}">client.browsers.<a href="./src/resources/browsers/browsers.ts">deleteByID</a>(id) -> void</code>
76+
- <code title="post /browsers/{id}/extensions">client.browsers.<a href="./src/resources/browsers/browsers.ts">uploadExtensions</a>(id, { ...params }) -> void</code>
7677

7778
## Replays
7879

@@ -177,3 +178,18 @@ Methods:
177178
- <code title="get /proxies/{id}">client.proxies.<a href="./src/resources/proxies.ts">retrieve</a>(id) -> ProxyRetrieveResponse</code>
178179
- <code title="get /proxies">client.proxies.<a href="./src/resources/proxies.ts">list</a>() -> ProxyListResponse</code>
179180
- <code title="delete /proxies/{id}">client.proxies.<a href="./src/resources/proxies.ts">delete</a>(id) -> void</code>
181+
182+
# Extensions
183+
184+
Types:
185+
186+
- <code><a href="./src/resources/extensions.ts">ExtensionListResponse</a></code>
187+
- <code><a href="./src/resources/extensions.ts">ExtensionUploadResponse</a></code>
188+
189+
Methods:
190+
191+
- <code title="get /extensions">client.extensions.<a href="./src/resources/extensions.ts">list</a>() -> ExtensionListResponse</code>
192+
- <code title="delete /extensions/{id_or_name}">client.extensions.<a href="./src/resources/extensions.ts">delete</a>(idOrName) -> void</code>
193+
- <code title="get /extensions/{id_or_name}">client.extensions.<a href="./src/resources/extensions.ts">download</a>(idOrName) -> Response</code>
194+
- <code title="get /extensions/from_chrome_store">client.extensions.<a href="./src/resources/extensions.ts">downloadFromChromeStore</a>({ ...params }) -> Response</code>
195+
- <code title="post /extensions">client.extensions.<a href="./src/resources/extensions.ts">upload</a>({ ...params }) -> ExtensionUploadResponse</code>

src/client.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ import {
3232
Deployments,
3333
} from './resources/deployments';
3434
import { KernelApp } from './core/app-framework';
35+
import {
36+
ExtensionDownloadFromChromeStoreParams,
37+
ExtensionListResponse,
38+
ExtensionUploadParams,
39+
ExtensionUploadResponse,
40+
Extensions,
41+
} from './resources/extensions';
3542
import {
3643
InvocationCreateParams,
3744
InvocationCreateResponse,
@@ -61,6 +68,7 @@ import {
6168
BrowserListResponse,
6269
BrowserPersistence,
6370
BrowserRetrieveResponse,
71+
BrowserUploadExtensionsParams,
6472
Browsers,
6573
Profile,
6674
} from './resources/browsers/browsers';
@@ -832,6 +840,7 @@ export class Kernel {
832840
browsers: API.Browsers = new API.Browsers(this);
833841
profiles: API.Profiles = new API.Profiles(this);
834842
proxies: API.Proxies = new API.Proxies(this);
843+
extensions: API.Extensions = new API.Extensions(this);
835844
}
836845

837846
Kernel.Deployments = Deployments;
@@ -840,6 +849,7 @@ Kernel.Invocations = Invocations;
840849
Kernel.Browsers = Browsers;
841850
Kernel.Profiles = Profiles;
842851
Kernel.Proxies = Proxies;
852+
Kernel.Extensions = Extensions;
843853

844854
export declare namespace Kernel {
845855
export type RequestOptions = Opts.RequestOptions;
@@ -889,6 +899,7 @@ export declare namespace Kernel {
889899
type BrowserListResponse as BrowserListResponse,
890900
type BrowserCreateParams as BrowserCreateParams,
891901
type BrowserDeleteParams as BrowserDeleteParams,
902+
type BrowserUploadExtensionsParams as BrowserUploadExtensionsParams,
892903
};
893904

894905
export {
@@ -905,6 +916,14 @@ export declare namespace Kernel {
905916
type ProxyCreateParams as ProxyCreateParams,
906917
};
907918

919+
export {
920+
Extensions as Extensions,
921+
type ExtensionListResponse as ExtensionListResponse,
922+
type ExtensionUploadResponse as ExtensionUploadResponse,
923+
type ExtensionDownloadFromChromeStoreParams as ExtensionDownloadFromChromeStoreParams,
924+
type ExtensionUploadParams as ExtensionUploadParams,
925+
};
926+
908927
export type AppAction = API.AppAction;
909928
export type ErrorDetail = API.ErrorDetail;
910929
export type ErrorEvent = API.ErrorEvent;

src/resources/browsers/browsers.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,10 @@ import {
4848
Fs,
4949
} from './fs/fs';
5050
import { APIPromise } from '../../core/api-promise';
51+
import { type Uploadable } from '../../core/uploads';
5152
import { buildHeaders } from '../../internal/headers';
5253
import { RequestOptions } from '../../internal/request-options';
54+
import { multipartFormRequestOptions } from '../../internal/uploads';
5355
import { path } from '../../internal/utils/path';
5456

5557
export class Browsers extends APIResource {
@@ -134,6 +136,36 @@ export class Browsers extends APIResource {
134136
headers: buildHeaders([{ Accept: '*/*' }, options?.headers]),
135137
});
136138
}
139+
140+
/**
141+
* Loads one or more unpacked extensions and restarts Chromium on the browser
142+
* instance.
143+
*
144+
* @example
145+
* ```ts
146+
* await client.browsers.uploadExtensions('id', {
147+
* extensions: [
148+
* {
149+
* name: 'name',
150+
* zip_file: fs.createReadStream('path/to/file'),
151+
* },
152+
* ],
153+
* });
154+
* ```
155+
*/
156+
uploadExtensions(
157+
id: string,
158+
body: BrowserUploadExtensionsParams,
159+
options?: RequestOptions,
160+
): APIPromise<void> {
161+
return this._client.post(
162+
path`/browsers/${id}/extensions`,
163+
multipartFormRequestOptions(
164+
{ body, ...options, headers: buildHeaders([{ Accept: '*/*' }, options?.headers]) },
165+
this._client,
166+
),
167+
);
168+
}
137169
}
138170

139171
/**
@@ -340,6 +372,11 @@ export namespace BrowserListResponse {
340372
}
341373

342374
export interface BrowserCreateParams {
375+
/**
376+
* List of browser extensions to load into the session. Provide each by id or name.
377+
*/
378+
extensions?: Array<BrowserCreateParams.Extension>;
379+
343380
/**
344381
* If true, launches the browser using a headless image (no VNC/GUI). Defaults to
345382
* false.
@@ -387,6 +424,23 @@ export interface BrowserCreateParams {
387424
}
388425

389426
export namespace BrowserCreateParams {
427+
/**
428+
* Extension selection for the browser session. Provide either id or name of an
429+
* extension uploaded to Kernel.
430+
*/
431+
export interface Extension {
432+
/**
433+
* Extension ID to load for this browser session
434+
*/
435+
id?: string;
436+
437+
/**
438+
* Extension name to load for this browser session (instead of id). Must be 1-255
439+
* characters, using letters, numbers, dots, underscores, or hyphens.
440+
*/
441+
name?: string;
442+
}
443+
390444
/**
391445
* Profile selection for the browser session. Provide either id or name. If
392446
* specified, the matching profile will be loaded into the browser session.
@@ -419,6 +473,28 @@ export interface BrowserDeleteParams {
419473
persistent_id: string;
420474
}
421475

476+
export interface BrowserUploadExtensionsParams {
477+
/**
478+
* List of extensions to upload and activate
479+
*/
480+
extensions: Array<BrowserUploadExtensionsParams.Extension>;
481+
}
482+
483+
export namespace BrowserUploadExtensionsParams {
484+
export interface Extension {
485+
/**
486+
* Folder name to place the extension under /home/kernel/extensions/<name>
487+
*/
488+
name: string;
489+
490+
/**
491+
* Zip archive containing an unpacked Chromium extension (must include
492+
* manifest.json)
493+
*/
494+
zip_file: Uploadable;
495+
}
496+
}
497+
422498
Browsers.Replays = Replays;
423499
Browsers.Fs = Fs;
424500
Browsers.Process = Process;
@@ -433,6 +509,7 @@ export declare namespace Browsers {
433509
type BrowserListResponse as BrowserListResponse,
434510
type BrowserCreateParams as BrowserCreateParams,
435511
type BrowserDeleteParams as BrowserDeleteParams,
512+
type BrowserUploadExtensionsParams as BrowserUploadExtensionsParams,
436513
};
437514

438515
export {

src/resources/browsers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export {
99
type BrowserListResponse,
1010
type BrowserCreateParams,
1111
type BrowserDeleteParams,
12+
type BrowserUploadExtensionsParams,
1213
} from './browsers';
1314
export {
1415
Fs,

0 commit comments

Comments
 (0)