diff --git a/.stats.yml b/.stats.yml index 434275e..330b531 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 89 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-8d66dbedea5b240936b338809f272568ca84a452fc13dbda835479f2ec068b41.yml -openapi_spec_hash: 7c499bfce2e996f1fff5e7791cea390e -config_hash: fcc2db3ed48ab4e8d1b588d31d394a23 +configured_endpoints: 91 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-4f5307643555b7917e8681b1966ae0b99f770cf59805e2f917ec7528edf11ba8.yml +openapi_spec_hash: 873a9aa3a88b6cec1ad94f848eeb1c45 +config_hash: 20337f7888852c165d099faa7589c90a diff --git a/CHANGELOG.md b/CHANGELOG.md index fdeefc5..ff477f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,26 +1,23 @@ # Changelog -## 0.25.0 (2026-01-07) +## 0.25.0 (2026-01-16) -Full Changelog: [v0.24.0...v0.25.0](https://github.com/onkernel/kernel-go-sdk/compare/v0.24.0...v0.25.0) +Full Changelog: [v0.24.0...v0.25.0](https://github.com/kernel/kernel-go-sdk/compare/v0.24.0...v0.25.0) ### Features -* **api:** add health check endpoint for proxies ([c7b8728](https://github.com/onkernel/kernel-go-sdk/commit/c7b8728369482de76bdf143a59f16b0de8bc03bb)) -* **auth:** add auto_login credential flow ([2eec1a1](https://github.com/onkernel/kernel-go-sdk/commit/2eec1a147279fe64a060c2066b30a2f0a13e74ab)) -* Enhance AuthAgentInvocation with step and last activity tracking ([ccb1425](https://github.com/onkernel/kernel-go-sdk/commit/ccb1425ea205fbb18129f341ae36bfc55c70ca64)) - - -### Bug Fixes - -* skip usage tests that don't work with Prism ([8872193](https://github.com/onkernel/kernel-go-sdk/commit/88721930052bff16639f371a9a7e46e7e34e7ff4)) +* add MFA options to agent authentication workflow ([0f5b637](https://github.com/kernel/kernel-go-sdk/commit/0f5b63778ed3fce2f8662053eb213ba55a77cde9)) +* add WebSocket process attach and PTY support ([690d473](https://github.com/kernel/kernel-go-sdk/commit/690d4737fe6b3d13c64acc5de08da76deb74a597)) +* **api:** add IP address logging for residential and custom proxies ([35a09ad](https://github.com/kernel/kernel-go-sdk/commit/35a09ad5ece2cdaf09a8d3b6420b4744377f5d6f)) +* **api:** manual updates ([0980329](https://github.com/kernel/kernel-go-sdk/commit/0980329671baab3951d42b472f69fcd5ef29aab7)) +* **api:** update production repos ([0cdfbfd](https://github.com/kernel/kernel-go-sdk/commit/0cdfbfdfccab1abe18180bce8500623be8bcad66)) +* Support hot swap proxy on a session ([5c479d9](https://github.com/kernel/kernel-go-sdk/commit/5c479d9abb0f42edbb4bdf8d0cef681f5aeeca3a)) ### Chores -* add float64 to valid types for RegisterFieldValidator ([1e23b39](https://github.com/onkernel/kernel-go-sdk/commit/1e23b39aca94dd1a98d6ec6669d2c8b87f8ccf02)) -* **internal:** codegen related update ([e07718d](https://github.com/onkernel/kernel-go-sdk/commit/e07718dbecbbc00c19e9d0725c04297fe48f2121)) -* **internal:** codegen related update ([0320876](https://github.com/onkernel/kernel-go-sdk/commit/0320876c8f64185768a3ad562b9656f96ab7e935)) +* sync repo ([1728134](https://github.com/kernel/kernel-go-sdk/commit/1728134103bf4a4bcb1c74ad335408cc3f7cc65a)) +* update module path from onkernel to kernel ([52c5887](https://github.com/kernel/kernel-go-sdk/commit/52c588700307b752e5d239718a00aafddc86ab96)) ## 0.24.0 (2025-12-17) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b668092..36f85c6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ To use a local version of this library from source in another project, edit the directive. This can be done through the CLI with the following: ```sh -$ go mod edit -replace github.com/onkernel/kernel-go-sdk=/path/to/kernel-go-sdk +$ go mod edit -replace github.com/kernel/kernel-go-sdk=/path/to/kernel-go-sdk ``` ## Running tests diff --git a/README.md b/README.md index 124904d..25c5e3d 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ -Go Reference +Go Reference -The Kernel Go library provides convenient access to the [Kernel REST API](https://docs.onkernel.com) +The Kernel Go library provides convenient access to the [Kernel REST API](https://www.kernel.sh/docs/api-reference) from applications written in Go. It is generated with [Stainless](https://www.stainless.com/). @@ -17,7 +17,7 @@ It is generated with [Stainless](https://www.stainless.com/). ```go import ( - "github.com/onkernel/kernel-go-sdk" // imported as kernel + "github.com/kernel/kernel-go-sdk" // imported as kernel ) ``` @@ -28,7 +28,7 @@ Or to pin the version: ```sh -go get -u 'github.com/onkernel/kernel-go-sdk@v0.25.0' +go get -u 'github.com/kernel/kernel-go-sdk@v0.25.0' ``` @@ -48,8 +48,8 @@ import ( "context" "fmt" - "github.com/onkernel/kernel-go-sdk" - "github.com/onkernel/kernel-go-sdk/option" + "github.com/kernel/kernel-go-sdk" + "github.com/kernel/kernel-go-sdk/option" ) func main() { @@ -279,7 +279,7 @@ client.Browsers.New(context.TODO(), ..., The request option `option.WithDebugLog(nil)` may be helpful while debugging. -See the [full list of request options](https://pkg.go.dev/github.com/onkernel/kernel-go-sdk/option). +See the [full list of request options](https://pkg.go.dev/github.com/kernel/kernel-go-sdk/option). ### Pagination @@ -542,7 +542,7 @@ This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) con We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience. -We are keen for your feedback; please open an [issue](https://www.github.com/onkernel/kernel-go-sdk/issues) with questions, bugs, or suggestions. +We are keen for your feedback; please open an [issue](https://www.github.com/kernel/kernel-go-sdk/issues) with questions, bugs, or suggestions. ## Contributing diff --git a/agentauth.go b/agentauth.go index 065a906..4e30d8f 100644 --- a/agentauth.go +++ b/agentauth.go @@ -139,6 +139,9 @@ type AgentAuthInvocationResponse struct { ExternalActionMessage string `json:"external_action_message,nullable"` // Browser live view URL for debugging the invocation LiveViewURL string `json:"live_view_url,nullable"` + // MFA method options to choose from (present when step=awaiting_input and MFA + // selection is required) + MfaOptions []AgentAuthInvocationResponseMfaOption `json:"mfa_options,nullable"` // Fields currently awaiting input (present when step=awaiting_input) PendingFields []DiscoveredField `json:"pending_fields,nullable"` // SSO buttons available on the page (present when step=awaiting_input) @@ -156,6 +159,7 @@ type AgentAuthInvocationResponse struct { ErrorMessage respjson.Field ExternalActionMessage respjson.Field LiveViewURL respjson.Field + MfaOptions respjson.Field PendingFields respjson.Field PendingSSOButtons respjson.Field SubmittedFields respjson.Field @@ -207,6 +211,35 @@ const ( AgentAuthInvocationResponseTypeReauth AgentAuthInvocationResponseType = "reauth" ) +// An MFA method option for verification +type AgentAuthInvocationResponseMfaOption struct { + // The visible option text + Label string `json:"label,required"` + // The MFA delivery method type + // + // Any of "sms", "call", "email", "totp", "push", "security_key". + Type string `json:"type,required"` + // Additional instructions from the site + Description string `json:"description,nullable"` + // The masked destination (phone/email) if shown + Target string `json:"target,nullable"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Label respjson.Field + Type respjson.Field + Description respjson.Field + Target respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r AgentAuthInvocationResponseMfaOption) RawJSON() string { return r.JSON.raw } +func (r *AgentAuthInvocationResponseMfaOption) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + // An SSO button for signing in with an external identity provider type AgentAuthInvocationResponsePendingSSOButton struct { // Visible button text diff --git a/agentauthinvocation.go b/agentauthinvocation.go index 830c592..91acce7 100644 --- a/agentauthinvocation.go +++ b/agentauthinvocation.go @@ -145,12 +145,14 @@ type AgentAuthInvocationSubmitParams struct { OfFieldValues *AgentAuthInvocationSubmitParamsBodyFieldValues `json:",inline"` // This field is a request body variant, only one variant field can be set. OfSSOButton *AgentAuthInvocationSubmitParamsBodySSOButton `json:",inline"` + // This field is a request body variant, only one variant field can be set. + OfSelectedMfaType *AgentAuthInvocationSubmitParamsBodySelectedMfaType `json:",inline"` paramObj } func (u AgentAuthInvocationSubmitParams) MarshalJSON() ([]byte, error) { - return param.MarshalUnion(u, u.OfFieldValues, u.OfSSOButton) + return param.MarshalUnion(u, u.OfFieldValues, u.OfSSOButton, u.OfSelectedMfaType) } func (r *AgentAuthInvocationSubmitParams) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) @@ -185,3 +187,26 @@ func (r AgentAuthInvocationSubmitParamsBodySSOButton) MarshalJSON() (data []byte func (r *AgentAuthInvocationSubmitParamsBodySSOButton) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } + +// The property SelectedMfaType is required. +type AgentAuthInvocationSubmitParamsBodySelectedMfaType struct { + // The MFA delivery method type + // + // Any of "sms", "call", "email", "totp", "push", "security_key". + SelectedMfaType string `json:"selected_mfa_type,omitzero,required"` + paramObj +} + +func (r AgentAuthInvocationSubmitParamsBodySelectedMfaType) MarshalJSON() (data []byte, err error) { + type shadow AgentAuthInvocationSubmitParamsBodySelectedMfaType + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *AgentAuthInvocationSubmitParamsBodySelectedMfaType) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +func init() { + apijson.RegisterFieldValidator[AgentAuthInvocationSubmitParamsBodySelectedMfaType]( + "selected_mfa_type", "sms", "call", "email", "totp", "push", "security_key", + ) +} diff --git a/api.md b/api.md index e849839..d70728a 100644 --- a/api.md +++ b/api.md @@ -1,252 +1,256 @@ # Shared Params Types -- shared.BrowserExtensionParam -- shared.BrowserProfileParam -- shared.BrowserViewportParam +- shared.BrowserExtensionParam +- shared.BrowserProfileParam +- shared.BrowserViewportParam # Shared Response Types -- shared.AppAction -- shared.BrowserExtension -- shared.BrowserProfile -- shared.BrowserViewport -- shared.ErrorDetail -- shared.ErrorEvent -- shared.ErrorModel -- shared.HeartbeatEvent -- shared.LogEvent +- shared.AppAction +- shared.BrowserExtension +- shared.BrowserProfile +- shared.BrowserViewport +- shared.ErrorDetail +- shared.ErrorEvent +- shared.ErrorModel +- shared.HeartbeatEvent +- shared.LogEvent # Deployments Response Types: -- kernel.DeploymentStateEvent -- kernel.DeploymentNewResponse -- kernel.DeploymentGetResponse -- kernel.DeploymentListResponse -- kernel.DeploymentFollowResponseUnion +- kernel.DeploymentStateEvent +- kernel.DeploymentNewResponse +- kernel.DeploymentGetResponse +- kernel.DeploymentListResponse +- kernel.DeploymentFollowResponseUnion Methods: -- client.Deployments.New(ctx context.Context, body kernel.DeploymentNewParams) (kernel.DeploymentNewResponse, error) -- client.Deployments.Get(ctx context.Context, id string) (kernel.DeploymentGetResponse, error) -- client.Deployments.List(ctx context.Context, query kernel.DeploymentListParams) (pagination.OffsetPagination[kernel.DeploymentListResponse], error) -- client.Deployments.Follow(ctx context.Context, id string, query kernel.DeploymentFollowParams) (kernel.DeploymentFollowResponseUnion, error) +- client.Deployments.New(ctx context.Context, body kernel.DeploymentNewParams) (kernel.DeploymentNewResponse, error) +- client.Deployments.Get(ctx context.Context, id string) (kernel.DeploymentGetResponse, error) +- client.Deployments.List(ctx context.Context, query kernel.DeploymentListParams) (pagination.OffsetPagination[kernel.DeploymentListResponse], error) +- client.Deployments.Follow(ctx context.Context, id string, query kernel.DeploymentFollowParams) (kernel.DeploymentFollowResponseUnion, error) # Apps Response Types: -- kernel.AppListResponse +- kernel.AppListResponse Methods: -- client.Apps.List(ctx context.Context, query kernel.AppListParams) (pagination.OffsetPagination[kernel.AppListResponse], error) +- client.Apps.List(ctx context.Context, query kernel.AppListParams) (pagination.OffsetPagination[kernel.AppListResponse], error) # Invocations Response Types: -- kernel.InvocationStateEvent -- kernel.InvocationNewResponse -- kernel.InvocationGetResponse -- kernel.InvocationUpdateResponse -- kernel.InvocationListResponse -- kernel.InvocationFollowResponseUnion +- kernel.InvocationStateEvent +- kernel.InvocationNewResponse +- kernel.InvocationGetResponse +- kernel.InvocationUpdateResponse +- kernel.InvocationListResponse +- kernel.InvocationFollowResponseUnion Methods: -- client.Invocations.New(ctx context.Context, body kernel.InvocationNewParams) (kernel.InvocationNewResponse, error) -- client.Invocations.Get(ctx context.Context, id string) (kernel.InvocationGetResponse, error) -- client.Invocations.Update(ctx context.Context, id string, body kernel.InvocationUpdateParams) (kernel.InvocationUpdateResponse, error) -- client.Invocations.List(ctx context.Context, query kernel.InvocationListParams) (pagination.OffsetPagination[kernel.InvocationListResponse], error) -- client.Invocations.DeleteBrowsers(ctx context.Context, id string) error -- client.Invocations.Follow(ctx context.Context, id string, query kernel.InvocationFollowParams) (kernel.InvocationFollowResponseUnion, error) +- client.Invocations.New(ctx context.Context, body kernel.InvocationNewParams) (kernel.InvocationNewResponse, error) +- client.Invocations.Get(ctx context.Context, id string) (kernel.InvocationGetResponse, error) +- client.Invocations.Update(ctx context.Context, id string, body kernel.InvocationUpdateParams) (kernel.InvocationUpdateResponse, error) +- client.Invocations.List(ctx context.Context, query kernel.InvocationListParams) (pagination.OffsetPagination[kernel.InvocationListResponse], error) +- client.Invocations.DeleteBrowsers(ctx context.Context, id string) error +- client.Invocations.Follow(ctx context.Context, id string, query kernel.InvocationFollowParams) (kernel.InvocationFollowResponseUnion, error) # Browsers Params Types: -- kernel.BrowserPersistenceParam +- kernel.BrowserPersistenceParam Response Types: -- kernel.BrowserPersistence -- kernel.Profile -- kernel.BrowserNewResponse -- kernel.BrowserGetResponse -- kernel.BrowserListResponse +- kernel.BrowserPersistence +- kernel.Profile +- kernel.BrowserNewResponse +- kernel.BrowserGetResponse +- kernel.BrowserUpdateResponse +- kernel.BrowserListResponse Methods: -- client.Browsers.New(ctx context.Context, body kernel.BrowserNewParams) (kernel.BrowserNewResponse, error) -- client.Browsers.Get(ctx context.Context, id string) (kernel.BrowserGetResponse, error) -- client.Browsers.List(ctx context.Context, query kernel.BrowserListParams) (pagination.OffsetPagination[kernel.BrowserListResponse], error) -- client.Browsers.Delete(ctx context.Context, body kernel.BrowserDeleteParams) error -- client.Browsers.DeleteByID(ctx context.Context, id string) error -- client.Browsers.LoadExtensions(ctx context.Context, id string, body kernel.BrowserLoadExtensionsParams) error +- client.Browsers.New(ctx context.Context, body kernel.BrowserNewParams) (kernel.BrowserNewResponse, error) +- client.Browsers.Get(ctx context.Context, id string) (kernel.BrowserGetResponse, error) +- client.Browsers.Update(ctx context.Context, id string, body kernel.BrowserUpdateParams) (kernel.BrowserUpdateResponse, error) +- client.Browsers.List(ctx context.Context, query kernel.BrowserListParams) (pagination.OffsetPagination[kernel.BrowserListResponse], error) +- client.Browsers.Delete(ctx context.Context, body kernel.BrowserDeleteParams) error +- client.Browsers.DeleteByID(ctx context.Context, id string) error +- client.Browsers.LoadExtensions(ctx context.Context, id string, body kernel.BrowserLoadExtensionsParams) error ## Replays Response Types: -- kernel.BrowserReplayListResponse -- kernel.BrowserReplayStartResponse +- kernel.BrowserReplayListResponse +- kernel.BrowserReplayStartResponse Methods: -- client.Browsers.Replays.List(ctx context.Context, id string) ([]kernel.BrowserReplayListResponse, error) -- client.Browsers.Replays.Download(ctx context.Context, replayID string, query kernel.BrowserReplayDownloadParams) (http.Response, error) -- client.Browsers.Replays.Start(ctx context.Context, id string, body kernel.BrowserReplayStartParams) (kernel.BrowserReplayStartResponse, error) -- client.Browsers.Replays.Stop(ctx context.Context, replayID string, body kernel.BrowserReplayStopParams) error +- client.Browsers.Replays.List(ctx context.Context, id string) ([]kernel.BrowserReplayListResponse, error) +- client.Browsers.Replays.Download(ctx context.Context, replayID string, query kernel.BrowserReplayDownloadParams) (http.Response, error) +- client.Browsers.Replays.Start(ctx context.Context, id string, body kernel.BrowserReplayStartParams) (kernel.BrowserReplayStartResponse, error) +- client.Browsers.Replays.Stop(ctx context.Context, replayID string, body kernel.BrowserReplayStopParams) error ## Fs Response Types: -- kernel.BrowserFFileInfoResponse -- kernel.BrowserFListFilesResponse +- kernel.BrowserFFileInfoResponse +- kernel.BrowserFListFilesResponse Methods: -- client.Browsers.Fs.NewDirectory(ctx context.Context, id string, body kernel.BrowserFNewDirectoryParams) error -- client.Browsers.Fs.DeleteDirectory(ctx context.Context, id string, body kernel.BrowserFDeleteDirectoryParams) error -- client.Browsers.Fs.DeleteFile(ctx context.Context, id string, body kernel.BrowserFDeleteFileParams) error -- client.Browsers.Fs.DownloadDirZip(ctx context.Context, id string, query kernel.BrowserFDownloadDirZipParams) (http.Response, error) -- client.Browsers.Fs.FileInfo(ctx context.Context, id string, query kernel.BrowserFFileInfoParams) (kernel.BrowserFFileInfoResponse, error) -- client.Browsers.Fs.ListFiles(ctx context.Context, id string, query kernel.BrowserFListFilesParams) ([]kernel.BrowserFListFilesResponse, error) -- client.Browsers.Fs.Move(ctx context.Context, id string, body kernel.BrowserFMoveParams) error -- client.Browsers.Fs.ReadFile(ctx context.Context, id string, query kernel.BrowserFReadFileParams) (http.Response, error) -- client.Browsers.Fs.SetFilePermissions(ctx context.Context, id string, body kernel.BrowserFSetFilePermissionsParams) error -- client.Browsers.Fs.Upload(ctx context.Context, id string, body kernel.BrowserFUploadParams) error -- client.Browsers.Fs.UploadZip(ctx context.Context, id string, body kernel.BrowserFUploadZipParams) error -- client.Browsers.Fs.WriteFile(ctx context.Context, id string, contents io.Reader, params kernel.BrowserFWriteFileParams) error +- client.Browsers.Fs.NewDirectory(ctx context.Context, id string, body kernel.BrowserFNewDirectoryParams) error +- client.Browsers.Fs.DeleteDirectory(ctx context.Context, id string, body kernel.BrowserFDeleteDirectoryParams) error +- client.Browsers.Fs.DeleteFile(ctx context.Context, id string, body kernel.BrowserFDeleteFileParams) error +- client.Browsers.Fs.DownloadDirZip(ctx context.Context, id string, query kernel.BrowserFDownloadDirZipParams) (http.Response, error) +- client.Browsers.Fs.FileInfo(ctx context.Context, id string, query kernel.BrowserFFileInfoParams) (kernel.BrowserFFileInfoResponse, error) +- client.Browsers.Fs.ListFiles(ctx context.Context, id string, query kernel.BrowserFListFilesParams) ([]kernel.BrowserFListFilesResponse, error) +- client.Browsers.Fs.Move(ctx context.Context, id string, body kernel.BrowserFMoveParams) error +- client.Browsers.Fs.ReadFile(ctx context.Context, id string, query kernel.BrowserFReadFileParams) (http.Response, error) +- client.Browsers.Fs.SetFilePermissions(ctx context.Context, id string, body kernel.BrowserFSetFilePermissionsParams) error +- client.Browsers.Fs.Upload(ctx context.Context, id string, body kernel.BrowserFUploadParams) error +- client.Browsers.Fs.UploadZip(ctx context.Context, id string, body kernel.BrowserFUploadZipParams) error +- client.Browsers.Fs.WriteFile(ctx context.Context, id string, contents io.Reader, params kernel.BrowserFWriteFileParams) error ### Watch Response Types: -- kernel.BrowserFWatchEventsResponse -- kernel.BrowserFWatchStartResponse +- kernel.BrowserFWatchEventsResponse +- kernel.BrowserFWatchStartResponse Methods: -- client.Browsers.Fs.Watch.Events(ctx context.Context, watchID string, query kernel.BrowserFWatchEventsParams) (kernel.BrowserFWatchEventsResponse, error) -- client.Browsers.Fs.Watch.Start(ctx context.Context, id string, body kernel.BrowserFWatchStartParams) (kernel.BrowserFWatchStartResponse, error) -- client.Browsers.Fs.Watch.Stop(ctx context.Context, watchID string, body kernel.BrowserFWatchStopParams) error +- client.Browsers.Fs.Watch.Events(ctx context.Context, watchID string, query kernel.BrowserFWatchEventsParams) (kernel.BrowserFWatchEventsResponse, error) +- client.Browsers.Fs.Watch.Start(ctx context.Context, id string, body kernel.BrowserFWatchStartParams) (kernel.BrowserFWatchStartResponse, error) +- client.Browsers.Fs.Watch.Stop(ctx context.Context, watchID string, body kernel.BrowserFWatchStopParams) error ## Process Response Types: -- kernel.BrowserProcessExecResponse -- kernel.BrowserProcessKillResponse -- kernel.BrowserProcessSpawnResponse -- kernel.BrowserProcessStatusResponse -- kernel.BrowserProcessStdinResponse -- kernel.BrowserProcessStdoutStreamResponse +- kernel.BrowserProcessExecResponse +- kernel.BrowserProcessKillResponse +- kernel.BrowserProcessResizeResponse +- kernel.BrowserProcessSpawnResponse +- kernel.BrowserProcessStatusResponse +- kernel.BrowserProcessStdinResponse +- kernel.BrowserProcessStdoutStreamResponse Methods: -- client.Browsers.Process.Exec(ctx context.Context, id string, body kernel.BrowserProcessExecParams) (kernel.BrowserProcessExecResponse, error) -- client.Browsers.Process.Kill(ctx context.Context, processID string, params kernel.BrowserProcessKillParams) (kernel.BrowserProcessKillResponse, error) -- client.Browsers.Process.Spawn(ctx context.Context, id string, body kernel.BrowserProcessSpawnParams) (kernel.BrowserProcessSpawnResponse, error) -- client.Browsers.Process.Status(ctx context.Context, processID string, query kernel.BrowserProcessStatusParams) (kernel.BrowserProcessStatusResponse, error) -- client.Browsers.Process.Stdin(ctx context.Context, processID string, params kernel.BrowserProcessStdinParams) (kernel.BrowserProcessStdinResponse, error) -- client.Browsers.Process.StdoutStream(ctx context.Context, processID string, query kernel.BrowserProcessStdoutStreamParams) (kernel.BrowserProcessStdoutStreamResponse, error) +- client.Browsers.Process.Exec(ctx context.Context, id string, body kernel.BrowserProcessExecParams) (kernel.BrowserProcessExecResponse, error) +- client.Browsers.Process.Kill(ctx context.Context, processID string, params kernel.BrowserProcessKillParams) (kernel.BrowserProcessKillResponse, error) +- client.Browsers.Process.Resize(ctx context.Context, processID string, params kernel.BrowserProcessResizeParams) (kernel.BrowserProcessResizeResponse, error) +- client.Browsers.Process.Spawn(ctx context.Context, id string, body kernel.BrowserProcessSpawnParams) (kernel.BrowserProcessSpawnResponse, error) +- client.Browsers.Process.Status(ctx context.Context, processID string, query kernel.BrowserProcessStatusParams) (kernel.BrowserProcessStatusResponse, error) +- client.Browsers.Process.Stdin(ctx context.Context, processID string, params kernel.BrowserProcessStdinParams) (kernel.BrowserProcessStdinResponse, error) +- client.Browsers.Process.StdoutStream(ctx context.Context, processID string, query kernel.BrowserProcessStdoutStreamParams) (kernel.BrowserProcessStdoutStreamResponse, error) ## Logs Methods: -- client.Browsers.Logs.Stream(ctx context.Context, id string, query kernel.BrowserLogStreamParams) (shared.LogEvent, error) +- client.Browsers.Logs.Stream(ctx context.Context, id string, query kernel.BrowserLogStreamParams) (shared.LogEvent, error) ## Computer Response Types: -- kernel.BrowserComputerSetCursorVisibilityResponse +- kernel.BrowserComputerSetCursorVisibilityResponse Methods: -- client.Browsers.Computer.CaptureScreenshot(ctx context.Context, id string, body kernel.BrowserComputerCaptureScreenshotParams) (http.Response, error) -- client.Browsers.Computer.ClickMouse(ctx context.Context, id string, body kernel.BrowserComputerClickMouseParams) error -- client.Browsers.Computer.DragMouse(ctx context.Context, id string, body kernel.BrowserComputerDragMouseParams) error -- client.Browsers.Computer.MoveMouse(ctx context.Context, id string, body kernel.BrowserComputerMoveMouseParams) error -- client.Browsers.Computer.PressKey(ctx context.Context, id string, body kernel.BrowserComputerPressKeyParams) error -- client.Browsers.Computer.Scroll(ctx context.Context, id string, body kernel.BrowserComputerScrollParams) error -- client.Browsers.Computer.SetCursorVisibility(ctx context.Context, id string, body kernel.BrowserComputerSetCursorVisibilityParams) (kernel.BrowserComputerSetCursorVisibilityResponse, error) -- client.Browsers.Computer.TypeText(ctx context.Context, id string, body kernel.BrowserComputerTypeTextParams) error +- client.Browsers.Computer.CaptureScreenshot(ctx context.Context, id string, body kernel.BrowserComputerCaptureScreenshotParams) (http.Response, error) +- client.Browsers.Computer.ClickMouse(ctx context.Context, id string, body kernel.BrowserComputerClickMouseParams) error +- client.Browsers.Computer.DragMouse(ctx context.Context, id string, body kernel.BrowserComputerDragMouseParams) error +- client.Browsers.Computer.MoveMouse(ctx context.Context, id string, body kernel.BrowserComputerMoveMouseParams) error +- client.Browsers.Computer.PressKey(ctx context.Context, id string, body kernel.BrowserComputerPressKeyParams) error +- client.Browsers.Computer.Scroll(ctx context.Context, id string, body kernel.BrowserComputerScrollParams) error +- client.Browsers.Computer.SetCursorVisibility(ctx context.Context, id string, body kernel.BrowserComputerSetCursorVisibilityParams) (kernel.BrowserComputerSetCursorVisibilityResponse, error) +- client.Browsers.Computer.TypeText(ctx context.Context, id string, body kernel.BrowserComputerTypeTextParams) error ## Playwright Response Types: -- kernel.BrowserPlaywrightExecuteResponse +- kernel.BrowserPlaywrightExecuteResponse Methods: -- client.Browsers.Playwright.Execute(ctx context.Context, id string, body kernel.BrowserPlaywrightExecuteParams) (kernel.BrowserPlaywrightExecuteResponse, error) +- client.Browsers.Playwright.Execute(ctx context.Context, id string, body kernel.BrowserPlaywrightExecuteParams) (kernel.BrowserPlaywrightExecuteResponse, error) # Profiles Methods: -- client.Profiles.New(ctx context.Context, body kernel.ProfileNewParams) (kernel.Profile, error) -- client.Profiles.Get(ctx context.Context, idOrName string) (kernel.Profile, error) -- client.Profiles.List(ctx context.Context) ([]kernel.Profile, error) -- client.Profiles.Delete(ctx context.Context, idOrName string) error -- client.Profiles.Download(ctx context.Context, idOrName string) (http.Response, error) +- client.Profiles.New(ctx context.Context, body kernel.ProfileNewParams) (kernel.Profile, error) +- client.Profiles.Get(ctx context.Context, idOrName string) (kernel.Profile, error) +- client.Profiles.List(ctx context.Context) ([]kernel.Profile, error) +- client.Profiles.Delete(ctx context.Context, idOrName string) error +- client.Profiles.Download(ctx context.Context, idOrName string) (http.Response, error) # Proxies Response Types: -- kernel.ProxyNewResponse -- kernel.ProxyGetResponse -- kernel.ProxyListResponse -- kernel.ProxyCheckResponse +- kernel.ProxyNewResponse +- kernel.ProxyGetResponse +- kernel.ProxyListResponse +- kernel.ProxyCheckResponse Methods: -- client.Proxies.New(ctx context.Context, body kernel.ProxyNewParams) (kernel.ProxyNewResponse, error) -- client.Proxies.Get(ctx context.Context, id string) (kernel.ProxyGetResponse, error) -- client.Proxies.List(ctx context.Context) ([]kernel.ProxyListResponse, error) -- client.Proxies.Delete(ctx context.Context, id string) error -- client.Proxies.Check(ctx context.Context, id string) (kernel.ProxyCheckResponse, error) +- client.Proxies.New(ctx context.Context, body kernel.ProxyNewParams) (kernel.ProxyNewResponse, error) +- client.Proxies.Get(ctx context.Context, id string) (kernel.ProxyGetResponse, error) +- client.Proxies.List(ctx context.Context) ([]kernel.ProxyListResponse, error) +- client.Proxies.Delete(ctx context.Context, id string) error +- client.Proxies.Check(ctx context.Context, id string) (kernel.ProxyCheckResponse, error) # Extensions Response Types: -- kernel.ExtensionListResponse -- kernel.ExtensionUploadResponse +- kernel.ExtensionListResponse +- kernel.ExtensionUploadResponse Methods: -- client.Extensions.List(ctx context.Context) ([]kernel.ExtensionListResponse, error) -- client.Extensions.Delete(ctx context.Context, idOrName string) error -- client.Extensions.Download(ctx context.Context, idOrName string) (http.Response, error) -- client.Extensions.DownloadFromChromeStore(ctx context.Context, query kernel.ExtensionDownloadFromChromeStoreParams) (http.Response, error) -- client.Extensions.Upload(ctx context.Context, body kernel.ExtensionUploadParams) (kernel.ExtensionUploadResponse, error) +- client.Extensions.List(ctx context.Context) ([]kernel.ExtensionListResponse, error) +- client.Extensions.Delete(ctx context.Context, idOrName string) error +- client.Extensions.Download(ctx context.Context, idOrName string) (http.Response, error) +- client.Extensions.DownloadFromChromeStore(ctx context.Context, query kernel.ExtensionDownloadFromChromeStoreParams) (http.Response, error) +- client.Extensions.Upload(ctx context.Context, body kernel.ExtensionUploadParams) (kernel.ExtensionUploadResponse, error) # BrowserPools Response Types: -- kernel.BrowserPool -- kernel.BrowserPoolAcquireResponse +- kernel.BrowserPool +- kernel.BrowserPoolAcquireResponse Methods: -- client.BrowserPools.New(ctx context.Context, body kernel.BrowserPoolNewParams) (kernel.BrowserPool, error) -- client.BrowserPools.Get(ctx context.Context, idOrName string) (kernel.BrowserPool, error) -- client.BrowserPools.Update(ctx context.Context, idOrName string, body kernel.BrowserPoolUpdateParams) (kernel.BrowserPool, error) -- client.BrowserPools.List(ctx context.Context) ([]kernel.BrowserPool, error) -- client.BrowserPools.Delete(ctx context.Context, idOrName string, body kernel.BrowserPoolDeleteParams) error -- client.BrowserPools.Acquire(ctx context.Context, idOrName string, body kernel.BrowserPoolAcquireParams) (kernel.BrowserPoolAcquireResponse, error) -- client.BrowserPools.Flush(ctx context.Context, idOrName string) error -- client.BrowserPools.Release(ctx context.Context, idOrName string, body kernel.BrowserPoolReleaseParams) error +- client.BrowserPools.New(ctx context.Context, body kernel.BrowserPoolNewParams) (kernel.BrowserPool, error) +- client.BrowserPools.Get(ctx context.Context, idOrName string) (kernel.BrowserPool, error) +- client.BrowserPools.Update(ctx context.Context, idOrName string, body kernel.BrowserPoolUpdateParams) (kernel.BrowserPool, error) +- client.BrowserPools.List(ctx context.Context) ([]kernel.BrowserPool, error) +- client.BrowserPools.Delete(ctx context.Context, idOrName string, body kernel.BrowserPoolDeleteParams) error +- client.BrowserPools.Acquire(ctx context.Context, idOrName string, body kernel.BrowserPoolAcquireParams) (kernel.BrowserPoolAcquireResponse, error) +- client.BrowserPools.Flush(ctx context.Context, idOrName string) error +- client.BrowserPools.Release(ctx context.Context, idOrName string, body kernel.BrowserPoolReleaseParams) error # Agents @@ -254,54 +258,54 @@ Methods: Params Types: -- kernel.AuthAgentCreateRequestParam -- kernel.AuthAgentInvocationCreateRequestParam +- kernel.AuthAgentCreateRequestParam +- kernel.AuthAgentInvocationCreateRequestParam Response Types: -- kernel.AgentAuthInvocationResponse -- kernel.AgentAuthSubmitResponse -- kernel.AuthAgent -- kernel.AuthAgentInvocationCreateResponse -- kernel.DiscoveredField +- kernel.AgentAuthInvocationResponse +- kernel.AgentAuthSubmitResponse +- kernel.AuthAgent +- kernel.AuthAgentInvocationCreateResponse +- kernel.DiscoveredField Methods: -- client.Agents.Auth.New(ctx context.Context, body kernel.AgentAuthNewParams) (kernel.AuthAgent, error) -- client.Agents.Auth.Get(ctx context.Context, id string) (kernel.AuthAgent, error) -- client.Agents.Auth.List(ctx context.Context, query kernel.AgentAuthListParams) (pagination.OffsetPagination[kernel.AuthAgent], error) -- client.Agents.Auth.Delete(ctx context.Context, id string) error +- client.Agents.Auth.New(ctx context.Context, body kernel.AgentAuthNewParams) (kernel.AuthAgent, error) +- client.Agents.Auth.Get(ctx context.Context, id string) (kernel.AuthAgent, error) +- client.Agents.Auth.List(ctx context.Context, query kernel.AgentAuthListParams) (pagination.OffsetPagination[kernel.AuthAgent], error) +- client.Agents.Auth.Delete(ctx context.Context, id string) error ### Invocations Response Types: -- kernel.AgentAuthInvocationExchangeResponse +- kernel.AgentAuthInvocationExchangeResponse Methods: -- client.Agents.Auth.Invocations.New(ctx context.Context, body kernel.AgentAuthInvocationNewParams) (kernel.AuthAgentInvocationCreateResponse, error) -- client.Agents.Auth.Invocations.Get(ctx context.Context, invocationID string) (kernel.AgentAuthInvocationResponse, error) -- client.Agents.Auth.Invocations.Exchange(ctx context.Context, invocationID string, body kernel.AgentAuthInvocationExchangeParams) (kernel.AgentAuthInvocationExchangeResponse, error) -- client.Agents.Auth.Invocations.Submit(ctx context.Context, invocationID string, body kernel.AgentAuthInvocationSubmitParams) (kernel.AgentAuthSubmitResponse, error) +- client.Agents.Auth.Invocations.New(ctx context.Context, body kernel.AgentAuthInvocationNewParams) (kernel.AuthAgentInvocationCreateResponse, error) +- client.Agents.Auth.Invocations.Get(ctx context.Context, invocationID string) (kernel.AgentAuthInvocationResponse, error) +- client.Agents.Auth.Invocations.Exchange(ctx context.Context, invocationID string, body kernel.AgentAuthInvocationExchangeParams) (kernel.AgentAuthInvocationExchangeResponse, error) +- client.Agents.Auth.Invocations.Submit(ctx context.Context, invocationID string, body kernel.AgentAuthInvocationSubmitParams) (kernel.AgentAuthSubmitResponse, error) # Credentials Params Types: -- kernel.CreateCredentialRequestParam -- kernel.UpdateCredentialRequestParam +- kernel.CreateCredentialRequestParam +- kernel.UpdateCredentialRequestParam Response Types: -- kernel.Credential -- kernel.CredentialTotpCodeResponse +- kernel.Credential +- kernel.CredentialTotpCodeResponse Methods: -- client.Credentials.New(ctx context.Context, body kernel.CredentialNewParams) (kernel.Credential, error) -- client.Credentials.Get(ctx context.Context, idOrName string) (kernel.Credential, error) -- client.Credentials.Update(ctx context.Context, idOrName string, body kernel.CredentialUpdateParams) (kernel.Credential, error) -- client.Credentials.List(ctx context.Context, query kernel.CredentialListParams) (pagination.OffsetPagination[kernel.Credential], error) -- client.Credentials.Delete(ctx context.Context, idOrName string) error -- client.Credentials.TotpCode(ctx context.Context, idOrName string) (kernel.CredentialTotpCodeResponse, error) +- client.Credentials.New(ctx context.Context, body kernel.CredentialNewParams) (kernel.Credential, error) +- client.Credentials.Get(ctx context.Context, idOrName string) (kernel.Credential, error) +- client.Credentials.Update(ctx context.Context, idOrName string, body kernel.CredentialUpdateParams) (kernel.Credential, error) +- client.Credentials.List(ctx context.Context, query kernel.CredentialListParams) (pagination.OffsetPagination[kernel.Credential], error) +- client.Credentials.Delete(ctx context.Context, idOrName string) error +- client.Credentials.TotpCode(ctx context.Context, idOrName string) (kernel.CredentialTotpCodeResponse, error) diff --git a/browser.go b/browser.go index 0c024cd..c8da385 100644 --- a/browser.go +++ b/browser.go @@ -77,6 +77,18 @@ func (r *BrowserService) Get(ctx context.Context, id string, opts ...option.Requ return } +// Update a browser session. +func (r *BrowserService) Update(ctx context.Context, id string, body BrowserUpdateParams, opts ...option.RequestOption) (res *BrowserUpdateResponse, err error) { + opts = slices.Concat(r.Options, opts) + if id == "" { + err = errors.New("missing required id parameter") + return + } + path := fmt.Sprintf("browsers/%s", id) + err = requestconfig.ExecuteNewRequest(ctx, http.MethodPatch, path, body, &res, opts...) + return +} + // List all browser sessions with pagination support. Use include_deleted=true to // include soft-deleted sessions in the results. func (r *BrowserService) List(ctx context.Context, query BrowserListParams, opts ...option.RequestOption) (res *pagination.OffsetPagination[BrowserListResponse], err error) { @@ -345,6 +357,69 @@ func (r *BrowserGetResponse) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } +type BrowserUpdateResponse struct { + // Websocket URL for Chrome DevTools Protocol connections to the browser session + CdpWsURL string `json:"cdp_ws_url,required"` + // When the browser session was created. + CreatedAt time.Time `json:"created_at,required" format:"date-time"` + // Whether the browser session is running in headless mode. + Headless bool `json:"headless,required"` + // Unique identifier for the browser session + SessionID string `json:"session_id,required"` + // Whether the browser session is running in stealth mode. + Stealth bool `json:"stealth,required"` + // The number of seconds of inactivity before the browser session is terminated. + TimeoutSeconds int64 `json:"timeout_seconds,required"` + // Remote URL for live viewing the browser session. Only available for non-headless + // browsers. + BrowserLiveViewURL string `json:"browser_live_view_url"` + // When the browser session was soft-deleted. Only present for deleted sessions. + DeletedAt time.Time `json:"deleted_at" format:"date-time"` + // Whether the browser session is running in kiosk mode. + KioskMode bool `json:"kiosk_mode"` + // DEPRECATED: Use timeout_seconds (up to 72 hours) and Profiles instead. + // + // Deprecated: deprecated + Persistence BrowserPersistence `json:"persistence"` + // Browser profile metadata. + Profile Profile `json:"profile"` + // ID of the proxy associated with this browser session, if any. + ProxyID string `json:"proxy_id"` + // Initial browser window size in pixels with optional refresh rate. If omitted, + // image defaults apply (1920x1080@25). Only specific viewport configurations are + // supported. The server will reject unsupported combinations. Supported + // resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25, 1440x900@25, + // 1024x768@60, 1200x800@60 If refresh_rate is not provided, it will be + // automatically determined from the width and height if they match a supported + // configuration exactly. Note: Higher resolutions may affect the responsiveness of + // live view browser + Viewport shared.BrowserViewport `json:"viewport"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + CdpWsURL respjson.Field + CreatedAt respjson.Field + Headless respjson.Field + SessionID respjson.Field + Stealth respjson.Field + TimeoutSeconds respjson.Field + BrowserLiveViewURL respjson.Field + DeletedAt respjson.Field + KioskMode respjson.Field + Persistence respjson.Field + Profile respjson.Field + ProxyID respjson.Field + Viewport respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r BrowserUpdateResponse) RawJSON() string { return r.JSON.raw } +func (r *BrowserUpdateResponse) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + type BrowserListResponse struct { // Websocket URL for Chrome DevTools Protocol connections to the browser session CdpWsURL string `json:"cdp_ws_url,required"` @@ -457,6 +532,21 @@ func (r *BrowserNewParams) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } +type BrowserUpdateParams struct { + // ID of the proxy to use. Omit to leave unchanged, set to empty string to remove + // proxy. + ProxyID param.Opt[string] `json:"proxy_id,omitzero"` + paramObj +} + +func (r BrowserUpdateParams) MarshalJSON() (data []byte, err error) { + type shadow BrowserUpdateParams + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *BrowserUpdateParams) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + type BrowserListParams struct { // When true, includes soft-deleted browser sessions in the results alongside // active sessions. diff --git a/browser_test.go b/browser_test.go index 137b62f..d0ab6f5 100644 --- a/browser_test.go +++ b/browser_test.go @@ -86,6 +86,35 @@ func TestBrowserGet(t *testing.T) { } } +func TestBrowserUpdateWithOptionalParams(t *testing.T) { + t.Skip("Prism tests are disabled") + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := kernel.NewClient( + option.WithBaseURL(baseURL), + option.WithAPIKey("My API Key"), + ) + _, err := client.Browsers.Update( + context.TODO(), + "htzv5orfit78e1m2biiifpbv", + kernel.BrowserUpdateParams{ + ProxyID: kernel.String("proxy_id"), + }, + ) + if err != nil { + var apierr *kernel.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + func TestBrowserListWithOptionalParams(t *testing.T) { t.Skip("Prism tests are disabled") baseURL := "http://localhost:4010" diff --git a/browserprocess.go b/browserprocess.go index b3df23c..50bbbb4 100644 --- a/browserprocess.go +++ b/browserprocess.go @@ -65,6 +65,22 @@ func (r *BrowserProcessService) Kill(ctx context.Context, processID string, para return } +// Resize a PTY-backed process terminal +func (r *BrowserProcessService) Resize(ctx context.Context, processID string, params BrowserProcessResizeParams, opts ...option.RequestOption) (res *BrowserProcessResizeResponse, err error) { + opts = slices.Concat(r.Options, opts) + if params.ID == "" { + err = errors.New("missing required id parameter") + return + } + if processID == "" { + err = errors.New("missing required process_id parameter") + return + } + path := fmt.Sprintf("browsers/%s/process/%s/resize", params.ID, processID) + err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, params, &res, opts...) + return +} + // Execute a command asynchronously func (r *BrowserProcessService) Spawn(ctx context.Context, id string, body BrowserProcessSpawnParams, opts ...option.RequestOption) (res *BrowserProcessSpawnResponse, err error) { opts = slices.Concat(r.Options, opts) @@ -175,6 +191,24 @@ func (r *BrowserProcessKillResponse) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } +// Generic OK response. +type BrowserProcessResizeResponse struct { + // Indicates success. + Ok bool `json:"ok,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Ok respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r BrowserProcessResizeResponse) RawJSON() string { return r.JSON.raw } +func (r *BrowserProcessResizeResponse) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + // Information about a spawned process. type BrowserProcessSpawnResponse struct { // OS process ID. @@ -353,6 +387,23 @@ const ( BrowserProcessKillParamsSignalHup BrowserProcessKillParamsSignal = "HUP" ) +type BrowserProcessResizeParams struct { + ID string `path:"id,required" json:"-"` + // New terminal columns. + Cols int64 `json:"cols,required"` + // New terminal rows. + Rows int64 `json:"rows,required"` + paramObj +} + +func (r BrowserProcessResizeParams) MarshalJSON() (data []byte, err error) { + type shadow BrowserProcessResizeParams + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *BrowserProcessResizeParams) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + type BrowserProcessSpawnParams struct { // Executable or shell command to run. Command string `json:"command,required"` @@ -362,8 +413,14 @@ type BrowserProcessSpawnParams struct { Cwd param.Opt[string] `json:"cwd,omitzero"` // Maximum execution time in seconds. TimeoutSec param.Opt[int64] `json:"timeout_sec,omitzero"` + // Allocate a pseudo-terminal (PTY) for interactive shells. + AllocateTty param.Opt[bool] `json:"allocate_tty,omitzero"` // Run the process with root privileges. AsRoot param.Opt[bool] `json:"as_root,omitzero"` + // Initial terminal columns. Only used when allocate_tty is true. + Cols param.Opt[int64] `json:"cols,omitzero"` + // Initial terminal rows. Only used when allocate_tty is true. + Rows param.Opt[int64] `json:"rows,omitzero"` // Command arguments. Args []string `json:"args,omitzero"` // Environment variables to set for the process. diff --git a/browserprocess_test.go b/browserprocess_test.go index b6ca67d..1e5ecf2 100644 --- a/browserprocess_test.go +++ b/browserprocess_test.go @@ -80,6 +80,37 @@ func TestBrowserProcessKill(t *testing.T) { } } +func TestBrowserProcessResize(t *testing.T) { + t.Skip("Prism tests are disabled") + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := kernel.NewClient( + option.WithBaseURL(baseURL), + option.WithAPIKey("My API Key"), + ) + _, err := client.Browsers.Process.Resize( + context.TODO(), + "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + kernel.BrowserProcessResizeParams{ + ID: "id", + Cols: 1, + Rows: 1, + }, + ) + if err != nil { + var apierr *kernel.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + func TestBrowserProcessSpawnWithOptionalParams(t *testing.T) { t.Skip("Prism tests are disabled") baseURL := "http://localhost:4010" @@ -97,14 +128,17 @@ func TestBrowserProcessSpawnWithOptionalParams(t *testing.T) { context.TODO(), "id", kernel.BrowserProcessSpawnParams{ - Command: "command", - Args: []string{"string"}, - AsRoot: kernel.Bool(true), - AsUser: kernel.String("as_user"), - Cwd: kernel.String("/J!"), + Command: "command", + AllocateTty: kernel.Bool(true), + Args: []string{"string"}, + AsRoot: kernel.Bool(true), + AsUser: kernel.String("as_user"), + Cols: kernel.Int(1), + Cwd: kernel.String("/J!"), Env: map[string]string{ "foo": "string", }, + Rows: kernel.Int(1), TimeoutSec: kernel.Int(0), }, ) diff --git a/proxy.go b/proxy.go index 628f7d7..0cd6e66 100644 --- a/proxy.go +++ b/proxy.go @@ -100,6 +100,8 @@ type ProxyNewResponse struct { ID string `json:"id"` // Configuration specific to the selected proxy `type`. Config ProxyNewResponseConfigUnion `json:"config"` + // IP address that the proxy uses when making requests. + IPAddress string `json:"ip_address"` // Timestamp of the last health check performed on this proxy. LastChecked time.Time `json:"last_checked" format:"date-time"` // Readable name of the proxy. @@ -117,6 +119,7 @@ type ProxyNewResponse struct { Type respjson.Field ID respjson.Field Config respjson.Field + IPAddress respjson.Field LastChecked respjson.Field Name respjson.Field Protocol respjson.Field @@ -388,6 +391,8 @@ type ProxyGetResponse struct { ID string `json:"id"` // Configuration specific to the selected proxy `type`. Config ProxyGetResponseConfigUnion `json:"config"` + // IP address that the proxy uses when making requests. + IPAddress string `json:"ip_address"` // Timestamp of the last health check performed on this proxy. LastChecked time.Time `json:"last_checked" format:"date-time"` // Readable name of the proxy. @@ -405,6 +410,7 @@ type ProxyGetResponse struct { Type respjson.Field ID respjson.Field Config respjson.Field + IPAddress respjson.Field LastChecked respjson.Field Name respjson.Field Protocol respjson.Field @@ -676,6 +682,8 @@ type ProxyListResponse struct { ID string `json:"id"` // Configuration specific to the selected proxy `type`. Config ProxyListResponseConfigUnion `json:"config"` + // IP address that the proxy uses when making requests. + IPAddress string `json:"ip_address"` // Timestamp of the last health check performed on this proxy. LastChecked time.Time `json:"last_checked" format:"date-time"` // Readable name of the proxy. @@ -693,6 +701,7 @@ type ProxyListResponse struct { Type respjson.Field ID respjson.Field Config respjson.Field + IPAddress respjson.Field LastChecked respjson.Field Name respjson.Field Protocol respjson.Field @@ -964,6 +973,8 @@ type ProxyCheckResponse struct { ID string `json:"id"` // Configuration specific to the selected proxy `type`. Config ProxyCheckResponseConfigUnion `json:"config"` + // IP address that the proxy uses when making requests. + IPAddress string `json:"ip_address"` // Timestamp of the last health check performed on this proxy. LastChecked time.Time `json:"last_checked" format:"date-time"` // Readable name of the proxy. @@ -981,6 +992,7 @@ type ProxyCheckResponse struct { Type respjson.Field ID respjson.Field Config respjson.Field + IPAddress respjson.Field LastChecked respjson.Field Name respjson.Field Protocol respjson.Field