From ed1e751a40c18d03eb3ea7c2ac2d3b3e2e68d921 Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:34:47 +0000 Subject: [PATCH 01/10] Load unpacked extensions without restarting Chromium --- server/cmd/api/api/chromium.go | 65 +- server/cmd/api/api/chromium_configure.go | 3 +- server/e2e/e2e_chromium_test.go | 11 +- server/e2e/e2e_combined_flow_test.go | 15 +- server/lib/cdpclient/cdpclient.go | 19 + server/lib/cdpclient/cdpclient_test.go | 56 + server/lib/oapi/oapi.go | 9293 +++++++--------------- server/openapi.yaml | 12 +- 8 files changed, 2819 insertions(+), 6655 deletions(-) diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index bd4c4c7a..36cf7500 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -31,9 +31,9 @@ type extensionZipItem struct { // chromiumFlagsPath is the runtime flags file read by the chromium-launcher at startup. const chromiumFlagsPath = "/chromium/flags" -// UploadExtensionsAndRestart handles multipart upload of one or more extension zips, extracts -// them under /home/kernel/extensions/, writes /chromium/flags to enable them, restarts -// Chromium via supervisord, and waits (via UpstreamManager) until DevTools is ready. +// UploadExtensionsAndRestart handles multipart upload of one or more extension zips and extracts +// them under /home/kernel/extensions/. Unpacked extensions are loaded immediately over CDP; +// extensions that require enterprise policy restart Chromium after their policy is installed. func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oapi.UploadExtensionsAndRestartRequestObject) (oapi.UploadExtensionsAndRestartResponseObject, error) { log := logger.FromContext(ctx) start := time.Now() @@ -145,7 +145,7 @@ func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oap extItems = append(extItems, extensionZipItem{zipTemp: p.zipTemp, name: p.name}) } - reqMsg, err := s.applyExtensionZipItems(ctx, extItems) + requiresRestart, reqMsg, err := s.applyExtensionZipItems(ctx, extItems) if reqMsg != "" { return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: reqMsg}}, nil } @@ -153,33 +153,38 @@ func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oap return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}}, nil } - // Restart Chromium and wait for DevTools to be ready - if err := s.restartChromiumAndWait(ctx, "extension upload"); err != nil { + if requiresRestart { + if err := s.restartChromiumAndWait(ctx, "extension upload"); err != nil { + return oapi.UploadExtensionsAndRestart500JSONResponse{ + InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}, + }, nil + } + } else if err := s.loadUnpackedExtensions(ctx, extItems); err != nil { return oapi.UploadExtensionsAndRestart500JSONResponse{ InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}, }, nil } - log.Info("devtools ready", "elapsed", time.Since(start).String()) + log.Info("extensions ready", "restarted", requiresRestart, "elapsed", time.Since(start).String()) return oapi.UploadExtensionsAndRestart201Response{}, nil } -// applyExtensionZipItems applies name+zipTemp extension pairs (merge flags for --load-extension). -// On validation errors returns (reqMsg, nil); on internal errors returns ("", err). -func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensionZipItem) (reqMsg string, err error) { +// applyExtensionZipItems installs name+zipTemp extension pairs and persists their startup +// configuration. The boolean result reports whether enterprise policy requires a restart. +func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensionZipItem) (bool, string, error) { log := logger.FromContext(ctx) extBase := "/home/kernel/extensions" if err := os.MkdirAll(extBase, 0o755); err != nil { - return "", fmt.Errorf("failed to create extension base dir: %w", err) + return false, "", fmt.Errorf("failed to create extension base dir: %w", err) } for _, p := range items { dest := filepath.Join(extBase, p.name) if _, err := os.Stat(dest); err == nil { - return fmt.Sprintf("extension name already exists: %s", p.name), nil + return false, fmt.Sprintf("extension name already exists: %s", p.name), nil } else if !os.IsNotExist(err) { log.Error("failed to check extension dir", "error", err) - return "", fmt.Errorf("failed to check extension dir: %w", err) + return false, "", fmt.Errorf("failed to check extension dir: %w", err) } } @@ -200,12 +205,12 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi dest := filepath.Join(extBase, p.name) if err := os.MkdirAll(dest, 0o755); err != nil { log.Error("failed to create extension dir", "error", err) - return "", fmt.Errorf("failed to create extension dir: %w", err) + return false, "", fmt.Errorf("failed to create extension dir: %w", err) } createdDests = append(createdDests, dest) if err := ziputil.Unzip(p.zipTemp, dest); err != nil { log.Error("failed to unzip zip file", "error", err) - return "invalid zip file", nil + return false, "invalid zip file", nil } updateXMLPath := filepath.Join(dest, "update.xml") @@ -215,13 +220,14 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi if err := exec.Command("chown", "-R", "kernel:kernel", dest).Run(); err != nil { log.Error("failed to chown extension dir", "error", err) - return "", fmt.Errorf("failed to chown extension dir: %w", err) + return false, "", fmt.Errorf("failed to chown extension dir: %w", err) } log.Info("installed extension", "name", p.name) } var pathsNeedingFlags []string + requiresRestart := false for _, p := range items { extensionPath := filepath.Join(extBase, p.name) @@ -252,7 +258,7 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi if _, err := os.Stat(updateXMLPath); err == nil { if extractionErr != nil { - return fmt.Sprintf("extension %s requires enterprise policy but update.xml is invalid: %v", extensionName, extractionErr), nil + return false, fmt.Sprintf("extension %s requires enterprise policy but update.xml is invalid: %v", extensionName, extractionErr), nil } hasUpdateXML = true log.Info("found update.xml in extension zip", "name", extensionName) @@ -274,6 +280,8 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi "name", extensionName, "hasUpdateXML", hasUpdateXML, "hasCRX", hasCRX) requiresEntPolicy = false pathsNeedingFlags = append(pathsNeedingFlags, extensionPath) + } else { + requiresRestart = true } } else { pathsNeedingFlags = append(pathsNeedingFlags, extensionPath) @@ -281,7 +289,7 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi if err := s.policy.AddExtension(extensionName, chromeExtensionID, extensionPath, requiresEntPolicy); err != nil { log.Error("failed to update enterprise policy", "error", err, "extension", extensionName) - return "", fmt.Errorf("failed to update enterprise policy for %s: %w", extensionName, err) + return false, "", fmt.Errorf("failed to update enterprise policy for %s: %w", extensionName, err) } log.Info("updated enterprise policy", "extension", extensionName, "chromeExtensionID", chromeExtensionID, "requiresEnterprisePolicy", requiresEntPolicy) @@ -295,11 +303,28 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi } if _, err := s.mergeAndWriteChromiumFlags(ctx, newTokens); err != nil { - return "", err + return false, "", err } success = true - return "", nil + return requiresRestart, "", nil +} + +func (s *ApiService) loadUnpackedExtensions(ctx context.Context, items []extensionZipItem) error { + log := logger.FromContext(ctx) + for _, item := range items { + path := filepath.Join("/home/kernel/extensions", item.name) + var id string + if err := s.withCDPClient(ctx, func(cdpCtx context.Context, client *cdpclient.Client) error { + loadedID, err := client.LoadUnpackedExtension(cdpCtx, path) + id = loadedID + return err + }); err != nil { + return fmt.Errorf("failed to load extension %s: %w", item.name, err) + } + log.Info("loaded unpacked extension over CDP", "name", item.name, "id", id) + } + return nil } // mergeAndWriteChromiumFlags reads existing flags, merges them with new flags, diff --git a/server/cmd/api/api/chromium_configure.go b/server/cmd/api/api/chromium_configure.go index 928d3466..976e3b85 100644 --- a/server/cmd/api/api/chromium_configure.go +++ b/server/cmd/api/api/chromium_configure.go @@ -767,7 +767,8 @@ func chromiumApplyExtensions(ctx context.Context, s *ApiService, items []extensi if len(items) == 0 { return "", nil } - return s.applyExtensionZipItems(ctx, items) + _, reqMsg, err := s.applyExtensionZipItems(ctx, items) + return reqMsg, err } func chromiumValidateFlags(raw *string) (*chromiumFlagsPlan, error) { diff --git a/server/e2e/e2e_chromium_test.go b/server/e2e/e2e_chromium_test.go index 95e186ea..5dd3d029 100644 --- a/server/e2e/e2e_chromium_test.go +++ b/server/e2e/e2e_chromium_test.go @@ -20,6 +20,7 @@ import ( "time" _ "github.com/glebarez/sqlite" + "github.com/kernel/kernel-images/server/lib/cdpclient" instanceoapi "github.com/kernel/kernel-images/server/lib/oapi" "github.com/samber/lo" "github.com/stretchr/testify/require" @@ -258,7 +259,11 @@ func TestExtensionUploadAndActivation(t *testing.T) { extZip, err := zipDirToBytes(extDir) require.NoError(t, err, "zip ext") - // Use new API to upload extension and restart Chromium + versionURL := "http" + strings.TrimPrefix(c.CDPURL(), "ws") + "json/version" + browserWebSocketBefore, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) + require.NoError(t, err, "get browser WebSocket URL before extension upload") + + // Upload and activate the unpacked extension without restarting Chromium. { client, err := c.APIClient() require.NoError(t, err) @@ -280,6 +285,10 @@ func TestExtensionUploadAndActivation(t *testing.T) { t.Logf("/chromium/upload-extensions-and-restart completed in %s (%d ms)", elapsed.String(), elapsed.Milliseconds()) } + browserWebSocketAfter, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) + require.NoError(t, err, "get browser WebSocket URL after extension upload") + require.Equal(t, browserWebSocketBefore, browserWebSocketAfter, "Chromium restarted during unpacked extension upload") + // Verify the content script updated the title on an allowed URL { cmd := exec.CommandContext(ctx, "pnpm", "exec", "tsx", "index.ts", diff --git a/server/e2e/e2e_combined_flow_test.go b/server/e2e/e2e_combined_flow_test.go index 5ccdb391..3e0ef394 100644 --- a/server/e2e/e2e_combined_flow_test.go +++ b/server/e2e/e2e_combined_flow_test.go @@ -138,21 +138,30 @@ func TestMultipleCDPConnectionsAfterRestart(t *testing.T) { t.Log("[test] result: all CDP connections successful") } -// uploadExtension uploads a simple MV3 extension and waits for Chromium to restart. +// uploadExtension uploads an enterprise-policy extension and waits for Chromium to restart. func uploadExtension(t *testing.T, ctx context.Context, client *instanceoapi.ClientWithResponses) { t.Helper() - // Build simple MV3 extension zip in-memory extDir := t.TempDir() manifest := `{ "manifest_version": 3, "version": "1.0", "name": "Test Extension for Combined Flow", - "description": "Minimal extension for testing CDP connections after restart" + "description": "Extension for testing CDP connections after restart", + "permissions": ["webRequest"] }` err := os.WriteFile(filepath.Join(extDir, "manifest.json"), []byte(manifest), 0600) require.NoError(t, err, "write manifest") + updateXML := ` + + + + +` + require.NoError(t, os.WriteFile(filepath.Join(extDir, "update.xml"), []byte(updateXML), 0600), "write update.xml") + require.NoError(t, os.WriteFile(filepath.Join(extDir, "extension.crx"), []byte("test crx"), 0600), "write extension.crx") + extZip, err := zipDirToBytes(extDir) require.NoError(t, err, "zip ext") diff --git a/server/lib/cdpclient/cdpclient.go b/server/lib/cdpclient/cdpclient.go index a59073c5..ec1cbdff 100644 --- a/server/lib/cdpclient/cdpclient.go +++ b/server/lib/cdpclient/cdpclient.go @@ -162,6 +162,25 @@ func (c *Client) GetBrowserVersion(ctx context.Context) (*BrowserVersion, error) return &v, nil } +// LoadUnpackedExtension installs an unpacked extension from an absolute path +// visible to Chromium and returns its extension ID. +func (c *Client) LoadUnpackedExtension(ctx context.Context, path string) (string, error) { + raw, err := c.send(ctx, "Extensions.loadUnpacked", map[string]string{"path": path}, "") + if err != nil { + return "", fmt.Errorf("Extensions.loadUnpacked: %w", err) + } + var result struct { + ID string `json:"id"` + } + if err := json.Unmarshal(raw, &result); err != nil { + return "", fmt.Errorf("unmarshal Extensions.loadUnpacked: %w", err) + } + if result.ID == "" { + return "", fmt.Errorf("Extensions.loadUnpacked returned no extension ID") + } + return result.ID, nil +} + // Histogram is a snapshot of a Chrome UMA histogram as returned by // Browser.getHistograms. Values are cumulative since browser start and the // units follow the UMA definition of the histogram (PageLoad timings are diff --git a/server/lib/cdpclient/cdpclient_test.go b/server/lib/cdpclient/cdpclient_test.go index 8154b361..ac652492 100644 --- a/server/lib/cdpclient/cdpclient_test.go +++ b/server/lib/cdpclient/cdpclient_test.go @@ -31,6 +31,10 @@ type fakeCDP struct { getVersionCalled bool failGetVersion bool productResponse string + loadUnpackedCalled bool + loadUnpackedPath string + loadUnpackedID string + failLoadUnpacked bool navigateCalled bool navigateCalls int navigateURL string @@ -109,6 +113,16 @@ func (f *fakeCDP) handler(w http.ResponseWriter, r *http.Request) { "jsVersion": "1.2.3", } } + case "Extensions.loadUnpacked": + f.loadUnpackedCalled = true + var params map[string]string + _ = json.Unmarshal(req.Params, ¶ms) + f.loadUnpackedPath = params["path"] + if f.failLoadUnpacked { + cdpErr = &cdpError{Code: -4, Message: "invalid extension"} + } else { + result = map[string]string{"id": f.loadUnpackedID} + } case "Page.navigate": f.navigateCalled = true f.navigateCalls++ @@ -347,3 +361,45 @@ func TestGetBrowserVersion(t *testing.T) { assert.Contains(t, err.Error(), "Browser.getVersion") }) } + +func TestLoadUnpackedExtension(t *testing.T) { + t.Run("happy path", func(t *testing.T) { + f := &fakeCDP{loadUnpackedID: "abcdefghijklmnopabcdefghijklmnop"} + url := startFakeCDP(t, f) + + client, err := Dial(context.Background(), url) + require.NoError(t, err) + defer client.Close() + + id, err := client.LoadUnpackedExtension(context.Background(), "/home/kernel/extensions/test") + require.NoError(t, err) + assert.Equal(t, f.loadUnpackedID, id) + assert.True(t, f.loadUnpackedCalled) + assert.Equal(t, "/home/kernel/extensions/test", f.loadUnpackedPath) + }) + + t.Run("CDP error from chromium", func(t *testing.T) { + f := &fakeCDP{failLoadUnpacked: true} + url := startFakeCDP(t, f) + + client, err := Dial(context.Background(), url) + require.NoError(t, err) + defer client.Close() + + _, err = client.LoadUnpackedExtension(context.Background(), "/bad-extension") + require.Error(t, err) + assert.Contains(t, err.Error(), "Extensions.loadUnpacked") + }) + + t.Run("missing extension ID", func(t *testing.T) { + f := &fakeCDP{} + url := startFakeCDP(t, f) + + client, err := Dial(context.Background(), url) + require.NoError(t, err) + defer client.Close() + + _, err = client.LoadUnpackedExtension(context.Background(), "/home/kernel/extensions/test") + require.EqualError(t, err, "Extensions.loadUnpacked returned no extension ID") + }) +} diff --git a/server/lib/oapi/oapi.go b/server/lib/oapi/oapi.go index 6b16e727..c6432de3 100644 --- a/server/lib/oapi/oapi.go +++ b/server/lib/oapi/oapi.go @@ -140,4667 +140,1563 @@ func (e BrowserCaptchaSolveResultEventDataStatus) Valid() bool { } } -// Defines values for BrowserCdpAutofillMode. +// Defines values for BrowserCdpConnectEventCategory. const ( - Address BrowserCdpAutofillMode = "address" - Card BrowserCdpAutofillMode = "card" + BrowserCdpConnectEventCategoryConnection BrowserCdpConnectEventCategory = "connection" ) -// Valid indicates whether the value is a known member of the BrowserCdpAutofillMode enum. -func (e BrowserCdpAutofillMode) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpConnectEventCategory enum. +func (e BrowserCdpConnectEventCategory) Valid() bool { switch e { - case Address: - return true - case Card: + case BrowserCdpConnectEventCategoryConnection: return true default: return false } } -// Defines values for BrowserCdpAutofillTriggerCommandDataMethod. +// Defines values for BrowserCdpConnectEventType. const ( - BrowserCdpAutofillTriggerCommandDataMethodAutofillTrigger BrowserCdpAutofillTriggerCommandDataMethod = "Autofill.trigger" + CdpConnect BrowserCdpConnectEventType = "cdp_connect" ) -// Valid indicates whether the value is a known member of the BrowserCdpAutofillTriggerCommandDataMethod enum. -func (e BrowserCdpAutofillTriggerCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpConnectEventType enum. +func (e BrowserCdpConnectEventType) Valid() bool { switch e { - case BrowserCdpAutofillTriggerCommandDataMethodAutofillTrigger: + case CdpConnect: return true default: return false } } -// Defines values for BrowserCdpBrowserCancelDownloadCommandDataMethod. +// Defines values for BrowserCdpDisconnectEventCategory. const ( - BrowserCancelDownload BrowserCdpBrowserCancelDownloadCommandDataMethod = "Browser.cancelDownload" + BrowserCdpDisconnectEventCategoryConnection BrowserCdpDisconnectEventCategory = "connection" ) -// Valid indicates whether the value is a known member of the BrowserCdpBrowserCancelDownloadCommandDataMethod enum. -func (e BrowserCdpBrowserCancelDownloadCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventCategory enum. +func (e BrowserCdpDisconnectEventCategory) Valid() bool { switch e { - case BrowserCancelDownload: + case BrowserCdpDisconnectEventCategoryConnection: return true default: return false } } -// Defines values for BrowserCdpBrowserCloseCommandDataMethod. +// Defines values for BrowserCdpDisconnectEventType. const ( - BrowserClose BrowserCdpBrowserCloseCommandDataMethod = "Browser.close" + CdpDisconnect BrowserCdpDisconnectEventType = "cdp_disconnect" ) -// Valid indicates whether the value is a known member of the BrowserCdpBrowserCloseCommandDataMethod enum. -func (e BrowserCdpBrowserCloseCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventType enum. +func (e BrowserCdpDisconnectEventType) Valid() bool { switch e { - case BrowserClose: + case CdpDisconnect: return true default: return false } } -// Defines values for BrowserCdpBrowserSetContentsSizeCommandDataMethod. +// Defines values for BrowserCdpDisconnectEventDataReason. const ( - BrowserSetContentsSize BrowserCdpBrowserSetContentsSizeCommandDataMethod = "Browser.setContentsSize" + ClientClose BrowserCdpDisconnectEventDataReason = "client_close" + ContextCancelled BrowserCdpDisconnectEventDataReason = "context_cancelled" + UpstreamChanged BrowserCdpDisconnectEventDataReason = "upstream_changed" + UpstreamError BrowserCdpDisconnectEventDataReason = "upstream_error" ) -// Valid indicates whether the value is a known member of the BrowserCdpBrowserSetContentsSizeCommandDataMethod enum. -func (e BrowserCdpBrowserSetContentsSizeCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventDataReason enum. +func (e BrowserCdpDisconnectEventDataReason) Valid() bool { switch e { - case BrowserSetContentsSize: + case ClientClose: + return true + case ContextCancelled: + return true + case UpstreamChanged: + return true + case UpstreamError: return true default: return false } } -// Defines values for BrowserCdpBrowserSetWindowBoundsCommandDataMethod. +// Defines values for BrowserConsoleErrorEventCategory. const ( - BrowserSetWindowBounds BrowserCdpBrowserSetWindowBoundsCommandDataMethod = "Browser.setWindowBounds" + BrowserConsoleErrorEventCategoryConsole BrowserConsoleErrorEventCategory = "console" ) -// Valid indicates whether the value is a known member of the BrowserCdpBrowserSetWindowBoundsCommandDataMethod enum. -func (e BrowserCdpBrowserSetWindowBoundsCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserConsoleErrorEventCategory enum. +func (e BrowserConsoleErrorEventCategory) Valid() bool { switch e { - case BrowserSetWindowBounds: + case BrowserConsoleErrorEventCategoryConsole: return true default: return false } } -// Defines values for BrowserCdpCommandEventCategory. +// Defines values for BrowserConsoleErrorEventType. const ( - BrowserCdpCommandEventCategoryControl BrowserCdpCommandEventCategory = "control" + ConsoleError BrowserConsoleErrorEventType = "console_error" ) -// Valid indicates whether the value is a known member of the BrowserCdpCommandEventCategory enum. -func (e BrowserCdpCommandEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserConsoleErrorEventType enum. +func (e BrowserConsoleErrorEventType) Valid() bool { switch e { - case BrowserCdpCommandEventCategoryControl: + case ConsoleError: return true default: return false } } -// Defines values for BrowserCdpCommandEventType. +// Defines values for BrowserConsoleLogEventCategory. const ( - CdpCommand BrowserCdpCommandEventType = "cdp_command" + BrowserConsoleLogEventCategoryConsole BrowserConsoleLogEventCategory = "console" ) -// Valid indicates whether the value is a known member of the BrowserCdpCommandEventType enum. -func (e BrowserCdpCommandEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserConsoleLogEventCategory enum. +func (e BrowserConsoleLogEventCategory) Valid() bool { switch e { - case CdpCommand: + case BrowserConsoleLogEventCategoryConsole: return true default: return false } } -// Defines values for BrowserCdpCommandMethod. +// Defines values for BrowserConsoleLogEventType. const ( - BrowserCdpCommandMethodAutofillTrigger BrowserCdpCommandMethod = "Autofill.trigger" - BrowserCdpCommandMethodBrowserCancelDownload BrowserCdpCommandMethod = "Browser.cancelDownload" - BrowserCdpCommandMethodBrowserClose BrowserCdpCommandMethod = "Browser.close" - BrowserCdpCommandMethodBrowserSetContentsSize BrowserCdpCommandMethod = "Browser.setContentsSize" - BrowserCdpCommandMethodBrowserSetWindowBounds BrowserCdpCommandMethod = "Browser.setWindowBounds" - BrowserCdpCommandMethodDOMFocus BrowserCdpCommandMethod = "DOM.focus" - BrowserCdpCommandMethodDOMScrollIntoViewIfNeeded BrowserCdpCommandMethod = "DOM.scrollIntoViewIfNeeded" - BrowserCdpCommandMethodDOMSetFileInputFiles BrowserCdpCommandMethod = "DOM.setFileInputFiles" - BrowserCdpCommandMethodInputCancelDragging BrowserCdpCommandMethod = "Input.cancelDragging" - BrowserCdpCommandMethodInputDispatchDragEvent BrowserCdpCommandMethod = "Input.dispatchDragEvent" - BrowserCdpCommandMethodInputDispatchKeyEvent BrowserCdpCommandMethod = "Input.dispatchKeyEvent" - BrowserCdpCommandMethodInputDispatchMouseEvent BrowserCdpCommandMethod = "Input.dispatchMouseEvent" - BrowserCdpCommandMethodInputDispatchTouchEvent BrowserCdpCommandMethod = "Input.dispatchTouchEvent" - BrowserCdpCommandMethodInputEmulateTouchFromMouseEvent BrowserCdpCommandMethod = "Input.emulateTouchFromMouseEvent" - BrowserCdpCommandMethodInputImeSetComposition BrowserCdpCommandMethod = "Input.imeSetComposition" - BrowserCdpCommandMethodInputInsertText BrowserCdpCommandMethod = "Input.insertText" - BrowserCdpCommandMethodInputSynthesizePinchGesture BrowserCdpCommandMethod = "Input.synthesizePinchGesture" - BrowserCdpCommandMethodInputSynthesizeScrollGesture BrowserCdpCommandMethod = "Input.synthesizeScrollGesture" - BrowserCdpCommandMethodInputSynthesizeTapGesture BrowserCdpCommandMethod = "Input.synthesizeTapGesture" - BrowserCdpCommandMethodPageBringToFront BrowserCdpCommandMethod = "Page.bringToFront" - BrowserCdpCommandMethodPageCaptureScreenshot BrowserCdpCommandMethod = "Page.captureScreenshot" - BrowserCdpCommandMethodPageCaptureSnapshot BrowserCdpCommandMethod = "Page.captureSnapshot" - BrowserCdpCommandMethodPageClose BrowserCdpCommandMethod = "Page.close" - BrowserCdpCommandMethodPageHandleJavaScriptDialog BrowserCdpCommandMethod = "Page.handleJavaScriptDialog" - BrowserCdpCommandMethodPageNavigate BrowserCdpCommandMethod = "Page.navigate" - BrowserCdpCommandMethodPageNavigateToHistoryEntry BrowserCdpCommandMethod = "Page.navigateToHistoryEntry" - BrowserCdpCommandMethodPagePrintToPDF BrowserCdpCommandMethod = "Page.printToPDF" - BrowserCdpCommandMethodPageReload BrowserCdpCommandMethod = "Page.reload" - BrowserCdpCommandMethodPageSetWebLifecycleState BrowserCdpCommandMethod = "Page.setWebLifecycleState" - BrowserCdpCommandMethodPageStartScreencast BrowserCdpCommandMethod = "Page.startScreencast" - BrowserCdpCommandMethodPageStopLoading BrowserCdpCommandMethod = "Page.stopLoading" - BrowserCdpCommandMethodPageStopScreencast BrowserCdpCommandMethod = "Page.stopScreencast" - BrowserCdpCommandMethodTargetActivateTarget BrowserCdpCommandMethod = "Target.activateTarget" - BrowserCdpCommandMethodTargetCloseTarget BrowserCdpCommandMethod = "Target.closeTarget" - BrowserCdpCommandMethodTargetCreateBrowserContext BrowserCdpCommandMethod = "Target.createBrowserContext" - BrowserCdpCommandMethodTargetCreateTarget BrowserCdpCommandMethod = "Target.createTarget" - BrowserCdpCommandMethodTargetDisposeBrowserContext BrowserCdpCommandMethod = "Target.disposeBrowserContext" - BrowserCdpCommandMethodTargetOpenDevTools BrowserCdpCommandMethod = "Target.openDevTools" + ConsoleLog BrowserConsoleLogEventType = "console_log" ) -// Valid indicates whether the value is a known member of the BrowserCdpCommandMethod enum. -func (e BrowserCdpCommandMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserConsoleLogEventType enum. +func (e BrowserConsoleLogEventType) Valid() bool { switch e { - case BrowserCdpCommandMethodAutofillTrigger: - return true - case BrowserCdpCommandMethodBrowserCancelDownload: - return true - case BrowserCdpCommandMethodBrowserClose: - return true - case BrowserCdpCommandMethodBrowserSetContentsSize: - return true - case BrowserCdpCommandMethodBrowserSetWindowBounds: - return true - case BrowserCdpCommandMethodDOMFocus: - return true - case BrowserCdpCommandMethodDOMScrollIntoViewIfNeeded: - return true - case BrowserCdpCommandMethodDOMSetFileInputFiles: - return true - case BrowserCdpCommandMethodInputCancelDragging: - return true - case BrowserCdpCommandMethodInputDispatchDragEvent: - return true - case BrowserCdpCommandMethodInputDispatchKeyEvent: - return true - case BrowserCdpCommandMethodInputDispatchMouseEvent: - return true - case BrowserCdpCommandMethodInputDispatchTouchEvent: - return true - case BrowserCdpCommandMethodInputEmulateTouchFromMouseEvent: - return true - case BrowserCdpCommandMethodInputImeSetComposition: - return true - case BrowserCdpCommandMethodInputInsertText: - return true - case BrowserCdpCommandMethodInputSynthesizePinchGesture: - return true - case BrowserCdpCommandMethodInputSynthesizeScrollGesture: - return true - case BrowserCdpCommandMethodInputSynthesizeTapGesture: - return true - case BrowserCdpCommandMethodPageBringToFront: - return true - case BrowserCdpCommandMethodPageCaptureScreenshot: - return true - case BrowserCdpCommandMethodPageCaptureSnapshot: - return true - case BrowserCdpCommandMethodPageClose: - return true - case BrowserCdpCommandMethodPageHandleJavaScriptDialog: - return true - case BrowserCdpCommandMethodPageNavigate: - return true - case BrowserCdpCommandMethodPageNavigateToHistoryEntry: - return true - case BrowserCdpCommandMethodPagePrintToPDF: - return true - case BrowserCdpCommandMethodPageReload: - return true - case BrowserCdpCommandMethodPageSetWebLifecycleState: - return true - case BrowserCdpCommandMethodPageStartScreencast: - return true - case BrowserCdpCommandMethodPageStopLoading: - return true - case BrowserCdpCommandMethodPageStopScreencast: - return true - case BrowserCdpCommandMethodTargetActivateTarget: - return true - case BrowserCdpCommandMethodTargetCloseTarget: - return true - case BrowserCdpCommandMethodTargetCreateBrowserContext: - return true - case BrowserCdpCommandMethodTargetCreateTarget: - return true - case BrowserCdpCommandMethodTargetDisposeBrowserContext: - return true - case BrowserCdpCommandMethodTargetOpenDevTools: + case ConsoleLog: return true default: return false } } -// Defines values for BrowserCdpConnectEventCategory. +// Defines values for BrowserEventSourceKind. const ( - BrowserCdpConnectEventCategoryConnection BrowserCdpConnectEventCategory = "connection" + Cdp BrowserEventSourceKind = "cdp" + Extension BrowserEventSourceKind = "extension" + KernelApi BrowserEventSourceKind = "kernel_api" + LocalProcess BrowserEventSourceKind = "local_process" ) -// Valid indicates whether the value is a known member of the BrowserCdpConnectEventCategory enum. -func (e BrowserCdpConnectEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserEventSourceKind enum. +func (e BrowserEventSourceKind) Valid() bool { switch e { - case BrowserCdpConnectEventCategoryConnection: + case Cdp: + return true + case Extension: + return true + case KernelApi: + return true + case LocalProcess: return true default: return false } } -// Defines values for BrowserCdpConnectEventType. +// Defines values for BrowserInteractionClickEventCategory. const ( - CdpConnect BrowserCdpConnectEventType = "cdp_connect" + BrowserInteractionClickEventCategoryInteraction BrowserInteractionClickEventCategory = "interaction" ) -// Valid indicates whether the value is a known member of the BrowserCdpConnectEventType enum. -func (e BrowserCdpConnectEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionClickEventCategory enum. +func (e BrowserInteractionClickEventCategory) Valid() bool { switch e { - case CdpConnect: + case BrowserInteractionClickEventCategoryInteraction: return true default: return false } } -// Defines values for BrowserCdpDisconnectEventCategory. +// Defines values for BrowserInteractionClickEventType. const ( - BrowserCdpDisconnectEventCategoryConnection BrowserCdpDisconnectEventCategory = "connection" + InteractionClick BrowserInteractionClickEventType = "interaction_click" ) -// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventCategory enum. -func (e BrowserCdpDisconnectEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionClickEventType enum. +func (e BrowserInteractionClickEventType) Valid() bool { switch e { - case BrowserCdpDisconnectEventCategoryConnection: + case InteractionClick: return true default: return false } } -// Defines values for BrowserCdpDisconnectEventType. +// Defines values for BrowserInteractionKeyEventCategory. const ( - CdpDisconnect BrowserCdpDisconnectEventType = "cdp_disconnect" + BrowserInteractionKeyEventCategoryInteraction BrowserInteractionKeyEventCategory = "interaction" ) -// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventType enum. -func (e BrowserCdpDisconnectEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionKeyEventCategory enum. +func (e BrowserInteractionKeyEventCategory) Valid() bool { switch e { - case CdpDisconnect: + case BrowserInteractionKeyEventCategoryInteraction: return true default: return false } } -// Defines values for BrowserCdpDisconnectEventDataReason. +// Defines values for BrowserInteractionKeyEventType. const ( - ClientClose BrowserCdpDisconnectEventDataReason = "client_close" - ContextCancelled BrowserCdpDisconnectEventDataReason = "context_cancelled" - UpstreamChanged BrowserCdpDisconnectEventDataReason = "upstream_changed" - UpstreamError BrowserCdpDisconnectEventDataReason = "upstream_error" + InteractionKey BrowserInteractionKeyEventType = "interaction_key" ) -// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventDataReason enum. -func (e BrowserCdpDisconnectEventDataReason) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionKeyEventType enum. +func (e BrowserInteractionKeyEventType) Valid() bool { switch e { - case ClientClose: - return true - case ContextCancelled: - return true - case UpstreamChanged: - return true - case UpstreamError: + case InteractionKey: return true default: return false } } -// Defines values for BrowserCdpDomFocusCommandDataMethod. +// Defines values for BrowserInteractionScrollSettledEventCategory. const ( - DOMFocus BrowserCdpDomFocusCommandDataMethod = "DOM.focus" + Interaction BrowserInteractionScrollSettledEventCategory = "interaction" ) -// Valid indicates whether the value is a known member of the BrowserCdpDomFocusCommandDataMethod enum. -func (e BrowserCdpDomFocusCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionScrollSettledEventCategory enum. +func (e BrowserInteractionScrollSettledEventCategory) Valid() bool { switch e { - case DOMFocus: + case Interaction: return true default: return false } } -// Defines values for BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod. +// Defines values for BrowserInteractionScrollSettledEventType. const ( - DOMScrollIntoViewIfNeeded BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod = "DOM.scrollIntoViewIfNeeded" + InteractionScrollSettled BrowserInteractionScrollSettledEventType = "interaction_scroll_settled" ) -// Valid indicates whether the value is a known member of the BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod enum. -func (e BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionScrollSettledEventType enum. +func (e BrowserInteractionScrollSettledEventType) Valid() bool { switch e { - case DOMScrollIntoViewIfNeeded: + case InteractionScrollSettled: return true default: return false } } -// Defines values for BrowserCdpDomSetFileInputFilesCommandDataMethod. +// Defines values for BrowserLiveViewConnectEventCategory. const ( - DOMSetFileInputFiles BrowserCdpDomSetFileInputFilesCommandDataMethod = "DOM.setFileInputFiles" + BrowserLiveViewConnectEventCategoryConnection BrowserLiveViewConnectEventCategory = "connection" ) -// Valid indicates whether the value is a known member of the BrowserCdpDomSetFileInputFilesCommandDataMethod enum. -func (e BrowserCdpDomSetFileInputFilesCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserLiveViewConnectEventCategory enum. +func (e BrowserLiveViewConnectEventCategory) Valid() bool { switch e { - case DOMSetFileInputFiles: + case BrowserLiveViewConnectEventCategoryConnection: return true default: return false } } -// Defines values for BrowserCdpDragEventType. +// Defines values for BrowserLiveViewConnectEventType. const ( - BrowserCdpDragEventTypeDragCancel BrowserCdpDragEventType = "dragCancel" - BrowserCdpDragEventTypeDragEnter BrowserCdpDragEventType = "dragEnter" - BrowserCdpDragEventTypeDragOver BrowserCdpDragEventType = "dragOver" - BrowserCdpDragEventTypeDrop BrowserCdpDragEventType = "drop" - BrowserCdpDragEventTypeOther BrowserCdpDragEventType = "other" + LiveViewConnect BrowserLiveViewConnectEventType = "live_view_connect" ) -// Valid indicates whether the value is a known member of the BrowserCdpDragEventType enum. -func (e BrowserCdpDragEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserLiveViewConnectEventType enum. +func (e BrowserLiveViewConnectEventType) Valid() bool { switch e { - case BrowserCdpDragEventTypeDragCancel: - return true - case BrowserCdpDragEventTypeDragEnter: - return true - case BrowserCdpDragEventTypeDragOver: - return true - case BrowserCdpDragEventTypeDrop: - return true - case BrowserCdpDragEventTypeOther: + case LiveViewConnect: return true default: return false } } -// Defines values for BrowserCdpDragMimeCategory. +// Defines values for BrowserLiveViewDisconnectEventCategory. const ( - BrowserCdpDragMimeCategoryApplication BrowserCdpDragMimeCategory = "application" - BrowserCdpDragMimeCategoryAudio BrowserCdpDragMimeCategory = "audio" - BrowserCdpDragMimeCategoryFont BrowserCdpDragMimeCategory = "font" - BrowserCdpDragMimeCategoryImage BrowserCdpDragMimeCategory = "image" - BrowserCdpDragMimeCategoryMessage BrowserCdpDragMimeCategory = "message" - BrowserCdpDragMimeCategoryModel BrowserCdpDragMimeCategory = "model" - BrowserCdpDragMimeCategoryMultipart BrowserCdpDragMimeCategory = "multipart" - BrowserCdpDragMimeCategoryOther BrowserCdpDragMimeCategory = "other" - BrowserCdpDragMimeCategoryText BrowserCdpDragMimeCategory = "text" - BrowserCdpDragMimeCategoryVideo BrowserCdpDragMimeCategory = "video" + BrowserLiveViewDisconnectEventCategoryConnection BrowserLiveViewDisconnectEventCategory = "connection" ) -// Valid indicates whether the value is a known member of the BrowserCdpDragMimeCategory enum. -func (e BrowserCdpDragMimeCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserLiveViewDisconnectEventCategory enum. +func (e BrowserLiveViewDisconnectEventCategory) Valid() bool { switch e { - case BrowserCdpDragMimeCategoryApplication: - return true - case BrowserCdpDragMimeCategoryAudio: - return true - case BrowserCdpDragMimeCategoryFont: - return true - case BrowserCdpDragMimeCategoryImage: - return true - case BrowserCdpDragMimeCategoryMessage: - return true - case BrowserCdpDragMimeCategoryModel: - return true - case BrowserCdpDragMimeCategoryMultipart: - return true - case BrowserCdpDragMimeCategoryOther: - return true - case BrowserCdpDragMimeCategoryText: - return true - case BrowserCdpDragMimeCategoryVideo: + case BrowserLiveViewDisconnectEventCategoryConnection: return true default: return false } } -// Defines values for BrowserCdpGestureSourceType. +// Defines values for BrowserLiveViewDisconnectEventType. const ( - BrowserCdpGestureSourceTypeDefault BrowserCdpGestureSourceType = "default" - BrowserCdpGestureSourceTypeMouse BrowserCdpGestureSourceType = "mouse" - BrowserCdpGestureSourceTypeOther BrowserCdpGestureSourceType = "other" - BrowserCdpGestureSourceTypeTouch BrowserCdpGestureSourceType = "touch" + LiveViewDisconnect BrowserLiveViewDisconnectEventType = "live_view_disconnect" ) -// Valid indicates whether the value is a known member of the BrowserCdpGestureSourceType enum. -func (e BrowserCdpGestureSourceType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserLiveViewDisconnectEventType enum. +func (e BrowserLiveViewDisconnectEventType) Valid() bool { switch e { - case BrowserCdpGestureSourceTypeDefault: - return true - case BrowserCdpGestureSourceTypeMouse: - return true - case BrowserCdpGestureSourceTypeOther: - return true - case BrowserCdpGestureSourceTypeTouch: + case LiveViewDisconnect: return true default: return false } } -// Defines values for BrowserCdpInputCancelDraggingCommandDataMethod. +// Defines values for BrowserMonitorDisconnectedEventCategory. const ( - InputCancelDragging BrowserCdpInputCancelDraggingCommandDataMethod = "Input.cancelDragging" + BrowserMonitorDisconnectedEventCategoryMonitor BrowserMonitorDisconnectedEventCategory = "monitor" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputCancelDraggingCommandDataMethod enum. -func (e BrowserCdpInputCancelDraggingCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventCategory enum. +func (e BrowserMonitorDisconnectedEventCategory) Valid() bool { switch e { - case InputCancelDragging: + case BrowserMonitorDisconnectedEventCategoryMonitor: return true default: return false } } -// Defines values for BrowserCdpInputDispatchDragEventCommandDataMethod. +// Defines values for BrowserMonitorDisconnectedEventType. const ( - InputDispatchDragEvent BrowserCdpInputDispatchDragEventCommandDataMethod = "Input.dispatchDragEvent" + MonitorDisconnected BrowserMonitorDisconnectedEventType = "monitor_disconnected" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputDispatchDragEventCommandDataMethod enum. -func (e BrowserCdpInputDispatchDragEventCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventType enum. +func (e BrowserMonitorDisconnectedEventType) Valid() bool { switch e { - case InputDispatchDragEvent: + case MonitorDisconnected: return true default: return false } } -// Defines values for BrowserCdpInputDispatchKeyEventCommandDataMethod. +// Defines values for BrowserMonitorDisconnectedEventDataReason. const ( - InputDispatchKeyEvent BrowserCdpInputDispatchKeyEventCommandDataMethod = "Input.dispatchKeyEvent" + ChromeRestarted BrowserMonitorDisconnectedEventDataReason = "chrome_restarted" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputDispatchKeyEventCommandDataMethod enum. -func (e BrowserCdpInputDispatchKeyEventCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventDataReason enum. +func (e BrowserMonitorDisconnectedEventDataReason) Valid() bool { switch e { - case InputDispatchKeyEvent: + case ChromeRestarted: return true default: return false } } -// Defines values for BrowserCdpInputDispatchMouseEventCommandDataMethod. +// Defines values for BrowserMonitorInitFailedEventCategory. const ( - InputDispatchMouseEvent BrowserCdpInputDispatchMouseEventCommandDataMethod = "Input.dispatchMouseEvent" + BrowserMonitorInitFailedEventCategoryMonitor BrowserMonitorInitFailedEventCategory = "monitor" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputDispatchMouseEventCommandDataMethod enum. -func (e BrowserCdpInputDispatchMouseEventCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorInitFailedEventCategory enum. +func (e BrowserMonitorInitFailedEventCategory) Valid() bool { switch e { - case InputDispatchMouseEvent: + case BrowserMonitorInitFailedEventCategoryMonitor: return true default: return false } } -// Defines values for BrowserCdpInputDispatchTouchEventCommandDataMethod. +// Defines values for BrowserMonitorInitFailedEventType. const ( - InputDispatchTouchEvent BrowserCdpInputDispatchTouchEventCommandDataMethod = "Input.dispatchTouchEvent" + MonitorInitFailed BrowserMonitorInitFailedEventType = "monitor_init_failed" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputDispatchTouchEventCommandDataMethod enum. -func (e BrowserCdpInputDispatchTouchEventCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorInitFailedEventType enum. +func (e BrowserMonitorInitFailedEventType) Valid() bool { switch e { - case InputDispatchTouchEvent: + case MonitorInitFailed: return true default: return false } } -// Defines values for BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod. +// Defines values for BrowserMonitorReconnectFailedEventCategory. const ( - InputEmulateTouchFromMouseEvent BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod = "Input.emulateTouchFromMouseEvent" + BrowserMonitorReconnectFailedEventCategoryMonitor BrowserMonitorReconnectFailedEventCategory = "monitor" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod enum. -func (e BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventCategory enum. +func (e BrowserMonitorReconnectFailedEventCategory) Valid() bool { switch e { - case InputEmulateTouchFromMouseEvent: + case BrowserMonitorReconnectFailedEventCategoryMonitor: return true default: return false } } -// Defines values for BrowserCdpInputImeSetCompositionCommandDataMethod. +// Defines values for BrowserMonitorReconnectFailedEventType. const ( - InputImeSetComposition BrowserCdpInputImeSetCompositionCommandDataMethod = "Input.imeSetComposition" + MonitorReconnectFailed BrowserMonitorReconnectFailedEventType = "monitor_reconnect_failed" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputImeSetCompositionCommandDataMethod enum. -func (e BrowserCdpInputImeSetCompositionCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventType enum. +func (e BrowserMonitorReconnectFailedEventType) Valid() bool { switch e { - case InputImeSetComposition: + case MonitorReconnectFailed: return true default: return false } } -// Defines values for BrowserCdpInputInsertTextCommandDataMethod. +// Defines values for BrowserMonitorReconnectFailedEventDataReason. const ( - InputInsertText BrowserCdpInputInsertTextCommandDataMethod = "Input.insertText" + ReconnectExhausted BrowserMonitorReconnectFailedEventDataReason = "reconnect_exhausted" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputInsertTextCommandDataMethod enum. -func (e BrowserCdpInputInsertTextCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventDataReason enum. +func (e BrowserMonitorReconnectFailedEventDataReason) Valid() bool { switch e { - case InputInsertText: + case ReconnectExhausted: return true default: return false } } -// Defines values for BrowserCdpInputSynthesizePinchGestureCommandDataMethod. +// Defines values for BrowserMonitorReconnectedEventCategory. const ( - InputSynthesizePinchGesture BrowserCdpInputSynthesizePinchGestureCommandDataMethod = "Input.synthesizePinchGesture" + BrowserMonitorReconnectedEventCategoryMonitor BrowserMonitorReconnectedEventCategory = "monitor" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputSynthesizePinchGestureCommandDataMethod enum. -func (e BrowserCdpInputSynthesizePinchGestureCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectedEventCategory enum. +func (e BrowserMonitorReconnectedEventCategory) Valid() bool { switch e { - case InputSynthesizePinchGesture: + case BrowserMonitorReconnectedEventCategoryMonitor: return true default: return false } } -// Defines values for BrowserCdpInputSynthesizeScrollGestureCommandDataMethod. +// Defines values for BrowserMonitorReconnectedEventType. const ( - InputSynthesizeScrollGesture BrowserCdpInputSynthesizeScrollGestureCommandDataMethod = "Input.synthesizeScrollGesture" + MonitorReconnected BrowserMonitorReconnectedEventType = "monitor_reconnected" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputSynthesizeScrollGestureCommandDataMethod enum. -func (e BrowserCdpInputSynthesizeScrollGestureCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectedEventType enum. +func (e BrowserMonitorReconnectedEventType) Valid() bool { switch e { - case InputSynthesizeScrollGesture: + case MonitorReconnected: return true default: return false } } -// Defines values for BrowserCdpInputSynthesizeTapGestureCommandDataMethod. +// Defines values for BrowserMonitorScreenshotEventCategory. const ( - InputSynthesizeTapGesture BrowserCdpInputSynthesizeTapGestureCommandDataMethod = "Input.synthesizeTapGesture" + Screenshot BrowserMonitorScreenshotEventCategory = "screenshot" ) -// Valid indicates whether the value is a known member of the BrowserCdpInputSynthesizeTapGestureCommandDataMethod enum. -func (e BrowserCdpInputSynthesizeTapGestureCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorScreenshotEventCategory enum. +func (e BrowserMonitorScreenshotEventCategory) Valid() bool { switch e { - case InputSynthesizeTapGesture: + case Screenshot: return true default: return false } } -// Defines values for BrowserCdpKeyEventType. +// Defines values for BrowserMonitorScreenshotEventType. const ( - BrowserCdpKeyEventTypeChar BrowserCdpKeyEventType = "char" - BrowserCdpKeyEventTypeKeyDown BrowserCdpKeyEventType = "keyDown" - BrowserCdpKeyEventTypeKeyUp BrowserCdpKeyEventType = "keyUp" - BrowserCdpKeyEventTypeOther BrowserCdpKeyEventType = "other" - BrowserCdpKeyEventTypeRawKeyDown BrowserCdpKeyEventType = "rawKeyDown" + MonitorScreenshot BrowserMonitorScreenshotEventType = "monitor_screenshot" ) -// Valid indicates whether the value is a known member of the BrowserCdpKeyEventType enum. -func (e BrowserCdpKeyEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorScreenshotEventType enum. +func (e BrowserMonitorScreenshotEventType) Valid() bool { switch e { - case BrowserCdpKeyEventTypeChar: - return true - case BrowserCdpKeyEventTypeKeyDown: - return true - case BrowserCdpKeyEventTypeKeyUp: - return true - case BrowserCdpKeyEventTypeOther: - return true - case BrowserCdpKeyEventTypeRawKeyDown: + case MonitorScreenshot: return true default: return false } } -// Defines values for BrowserCdpMouseButton. +// Defines values for BrowserNetworkIdleEventCategory. const ( - BrowserCdpMouseButtonBack BrowserCdpMouseButton = "back" - BrowserCdpMouseButtonForward BrowserCdpMouseButton = "forward" - BrowserCdpMouseButtonLeft BrowserCdpMouseButton = "left" - BrowserCdpMouseButtonMiddle BrowserCdpMouseButton = "middle" - BrowserCdpMouseButtonNone BrowserCdpMouseButton = "none" - BrowserCdpMouseButtonOther BrowserCdpMouseButton = "other" - BrowserCdpMouseButtonRight BrowserCdpMouseButton = "right" + BrowserNetworkIdleEventCategoryNetwork BrowserNetworkIdleEventCategory = "network" ) -// Valid indicates whether the value is a known member of the BrowserCdpMouseButton enum. -func (e BrowserCdpMouseButton) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserNetworkIdleEventCategory enum. +func (e BrowserNetworkIdleEventCategory) Valid() bool { switch e { - case BrowserCdpMouseButtonBack: - return true - case BrowserCdpMouseButtonForward: - return true - case BrowserCdpMouseButtonLeft: - return true - case BrowserCdpMouseButtonMiddle: - return true - case BrowserCdpMouseButtonNone: - return true - case BrowserCdpMouseButtonOther: - return true - case BrowserCdpMouseButtonRight: + case BrowserNetworkIdleEventCategoryNetwork: return true default: return false } } -// Defines values for BrowserCdpMouseEventType. +// Defines values for BrowserNetworkIdleEventType. const ( - BrowserCdpMouseEventTypeMouseMoved BrowserCdpMouseEventType = "mouseMoved" - BrowserCdpMouseEventTypeMousePressed BrowserCdpMouseEventType = "mousePressed" - BrowserCdpMouseEventTypeMouseReleased BrowserCdpMouseEventType = "mouseReleased" - BrowserCdpMouseEventTypeMouseWheel BrowserCdpMouseEventType = "mouseWheel" - BrowserCdpMouseEventTypeOther BrowserCdpMouseEventType = "other" + NetworkIdle BrowserNetworkIdleEventType = "network_idle" ) -// Valid indicates whether the value is a known member of the BrowserCdpMouseEventType enum. -func (e BrowserCdpMouseEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserNetworkIdleEventType enum. +func (e BrowserNetworkIdleEventType) Valid() bool { switch e { - case BrowserCdpMouseEventTypeMouseMoved: - return true - case BrowserCdpMouseEventTypeMousePressed: - return true - case BrowserCdpMouseEventTypeMouseReleased: - return true - case BrowserCdpMouseEventTypeMouseWheel: - return true - case BrowserCdpMouseEventTypeOther: + case NetworkIdle: return true default: return false } } -// Defines values for BrowserCdpPageBringToFrontCommandDataMethod. +// Defines values for BrowserNetworkLoadingFailedEventCategory. const ( - PageBringToFront BrowserCdpPageBringToFrontCommandDataMethod = "Page.bringToFront" + BrowserNetworkLoadingFailedEventCategoryNetwork BrowserNetworkLoadingFailedEventCategory = "network" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageBringToFrontCommandDataMethod enum. -func (e BrowserCdpPageBringToFrontCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserNetworkLoadingFailedEventCategory enum. +func (e BrowserNetworkLoadingFailedEventCategory) Valid() bool { switch e { - case PageBringToFront: + case BrowserNetworkLoadingFailedEventCategoryNetwork: return true default: return false } } -// Defines values for BrowserCdpPageCaptureScreenshotCommandDataMethod. +// Defines values for BrowserNetworkLoadingFailedEventType. const ( - PageCaptureScreenshot BrowserCdpPageCaptureScreenshotCommandDataMethod = "Page.captureScreenshot" + NetworkLoadingFailed BrowserNetworkLoadingFailedEventType = "network_loading_failed" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageCaptureScreenshotCommandDataMethod enum. -func (e BrowserCdpPageCaptureScreenshotCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserNetworkLoadingFailedEventType enum. +func (e BrowserNetworkLoadingFailedEventType) Valid() bool { switch e { - case PageCaptureScreenshot: + case NetworkLoadingFailed: return true default: return false } } -// Defines values for BrowserCdpPageCaptureSnapshotCommandDataMethod. +// Defines values for BrowserNetworkRequestEventCategory. const ( - PageCaptureSnapshot BrowserCdpPageCaptureSnapshotCommandDataMethod = "Page.captureSnapshot" + BrowserNetworkRequestEventCategoryNetwork BrowserNetworkRequestEventCategory = "network" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageCaptureSnapshotCommandDataMethod enum. -func (e BrowserCdpPageCaptureSnapshotCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserNetworkRequestEventCategory enum. +func (e BrowserNetworkRequestEventCategory) Valid() bool { switch e { - case PageCaptureSnapshot: + case BrowserNetworkRequestEventCategoryNetwork: return true default: return false } } -// Defines values for BrowserCdpPageCloseCommandDataMethod. +// Defines values for BrowserNetworkRequestEventType. const ( - PageClose BrowserCdpPageCloseCommandDataMethod = "Page.close" + NetworkRequest BrowserNetworkRequestEventType = "network_request" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageCloseCommandDataMethod enum. -func (e BrowserCdpPageCloseCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserNetworkRequestEventType enum. +func (e BrowserNetworkRequestEventType) Valid() bool { switch e { - case PageClose: + case NetworkRequest: return true default: return false } } -// Defines values for BrowserCdpPageHandleJavaScriptDialogCommandDataMethod. +// Defines values for BrowserNetworkResponseEventCategory. const ( - PageHandleJavaScriptDialog BrowserCdpPageHandleJavaScriptDialogCommandDataMethod = "Page.handleJavaScriptDialog" + BrowserNetworkResponseEventCategoryNetwork BrowserNetworkResponseEventCategory = "network" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageHandleJavaScriptDialogCommandDataMethod enum. -func (e BrowserCdpPageHandleJavaScriptDialogCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserNetworkResponseEventCategory enum. +func (e BrowserNetworkResponseEventCategory) Valid() bool { switch e { - case PageHandleJavaScriptDialog: + case BrowserNetworkResponseEventCategoryNetwork: return true default: return false } } -// Defines values for BrowserCdpPageNavigateCommandDataMethod. +// Defines values for BrowserNetworkResponseEventType. const ( - PageNavigate BrowserCdpPageNavigateCommandDataMethod = "Page.navigate" + NetworkResponse BrowserNetworkResponseEventType = "network_response" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageNavigateCommandDataMethod enum. -func (e BrowserCdpPageNavigateCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserNetworkResponseEventType enum. +func (e BrowserNetworkResponseEventType) Valid() bool { switch e { - case PageNavigate: + case NetworkResponse: return true default: return false } } -// Defines values for BrowserCdpPageNavigateToHistoryEntryCommandDataMethod. +// Defines values for BrowserPageCrashedEventCategory. const ( - PageNavigateToHistoryEntry BrowserCdpPageNavigateToHistoryEntryCommandDataMethod = "Page.navigateToHistoryEntry" + BrowserPageCrashedEventCategoryPage BrowserPageCrashedEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageNavigateToHistoryEntryCommandDataMethod enum. -func (e BrowserCdpPageNavigateToHistoryEntryCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageCrashedEventCategory enum. +func (e BrowserPageCrashedEventCategory) Valid() bool { switch e { - case PageNavigateToHistoryEntry: + case BrowserPageCrashedEventCategoryPage: return true default: return false } } -// Defines values for BrowserCdpPagePrintToPdfCommandDataMethod. +// Defines values for BrowserPageCrashedEventType. const ( - PagePrintToPDF BrowserCdpPagePrintToPdfCommandDataMethod = "Page.printToPDF" + PageCrashed BrowserPageCrashedEventType = "page_crashed" ) -// Valid indicates whether the value is a known member of the BrowserCdpPagePrintToPdfCommandDataMethod enum. -func (e BrowserCdpPagePrintToPdfCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageCrashedEventType enum. +func (e BrowserPageCrashedEventType) Valid() bool { switch e { - case PagePrintToPDF: + case PageCrashed: return true default: return false } } -// Defines values for BrowserCdpPageReloadCommandDataMethod. +// Defines values for BrowserPageDomContentLoadedEventCategory. const ( - PageReload BrowserCdpPageReloadCommandDataMethod = "Page.reload" + BrowserPageDomContentLoadedEventCategoryPage BrowserPageDomContentLoadedEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageReloadCommandDataMethod enum. -func (e BrowserCdpPageReloadCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageDomContentLoadedEventCategory enum. +func (e BrowserPageDomContentLoadedEventCategory) Valid() bool { switch e { - case PageReload: + case BrowserPageDomContentLoadedEventCategoryPage: return true default: return false } } -// Defines values for BrowserCdpPageSetWebLifecycleStateCommandDataMethod. +// Defines values for BrowserPageDomContentLoadedEventType. const ( - PageSetWebLifecycleState BrowserCdpPageSetWebLifecycleStateCommandDataMethod = "Page.setWebLifecycleState" + PageDomContentLoaded BrowserPageDomContentLoadedEventType = "page_dom_content_loaded" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageSetWebLifecycleStateCommandDataMethod enum. -func (e BrowserCdpPageSetWebLifecycleStateCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageDomContentLoadedEventType enum. +func (e BrowserPageDomContentLoadedEventType) Valid() bool { switch e { - case PageSetWebLifecycleState: + case PageDomContentLoaded: return true default: return false } } -// Defines values for BrowserCdpPageStartScreencastCommandDataMethod. +// Defines values for BrowserPageLayoutSettledEventCategory. const ( - PageStartScreencast BrowserCdpPageStartScreencastCommandDataMethod = "Page.startScreencast" + BrowserPageLayoutSettledEventCategoryPage BrowserPageLayoutSettledEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageStartScreencastCommandDataMethod enum. -func (e BrowserCdpPageStartScreencastCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageLayoutSettledEventCategory enum. +func (e BrowserPageLayoutSettledEventCategory) Valid() bool { switch e { - case PageStartScreencast: + case BrowserPageLayoutSettledEventCategoryPage: return true default: return false } } -// Defines values for BrowserCdpPageStopLoadingCommandDataMethod. +// Defines values for BrowserPageLayoutSettledEventType. const ( - PageStopLoading BrowserCdpPageStopLoadingCommandDataMethod = "Page.stopLoading" + PageLayoutSettled BrowserPageLayoutSettledEventType = "page_layout_settled" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageStopLoadingCommandDataMethod enum. -func (e BrowserCdpPageStopLoadingCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageLayoutSettledEventType enum. +func (e BrowserPageLayoutSettledEventType) Valid() bool { switch e { - case PageStopLoading: + case PageLayoutSettled: return true default: return false } } -// Defines values for BrowserCdpPageStopScreencastCommandDataMethod. +// Defines values for BrowserPageLayoutShiftEventCategory. const ( - PageStopScreencast BrowserCdpPageStopScreencastCommandDataMethod = "Page.stopScreencast" + BrowserPageLayoutShiftEventCategoryPage BrowserPageLayoutShiftEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpPageStopScreencastCommandDataMethod enum. -func (e BrowserCdpPageStopScreencastCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageLayoutShiftEventCategory enum. +func (e BrowserPageLayoutShiftEventCategory) Valid() bool { switch e { - case PageStopScreencast: + case BrowserPageLayoutShiftEventCategoryPage: return true default: return false } } -// Defines values for BrowserCdpPdfTransferMode. +// Defines values for BrowserPageLayoutShiftEventType. const ( - BrowserCdpPdfTransferModeOther BrowserCdpPdfTransferMode = "other" - BrowserCdpPdfTransferModeReturnAsBase64 BrowserCdpPdfTransferMode = "ReturnAsBase64" - BrowserCdpPdfTransferModeReturnAsStream BrowserCdpPdfTransferMode = "ReturnAsStream" + PageLayoutShift BrowserPageLayoutShiftEventType = "page_layout_shift" ) -// Valid indicates whether the value is a known member of the BrowserCdpPdfTransferMode enum. -func (e BrowserCdpPdfTransferMode) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageLayoutShiftEventType enum. +func (e BrowserPageLayoutShiftEventType) Valid() bool { switch e { - case BrowserCdpPdfTransferModeOther: - return true - case BrowserCdpPdfTransferModeReturnAsBase64: - return true - case BrowserCdpPdfTransferModeReturnAsStream: + case PageLayoutShift: return true default: return false } } -// Defines values for BrowserCdpPointerType. +// Defines values for BrowserPageLcpEventCategory. const ( - BrowserCdpPointerTypeMouse BrowserCdpPointerType = "mouse" - BrowserCdpPointerTypeOther BrowserCdpPointerType = "other" - BrowserCdpPointerTypePen BrowserCdpPointerType = "pen" + BrowserPageLcpEventCategoryPage BrowserPageLcpEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpPointerType enum. -func (e BrowserCdpPointerType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageLcpEventCategory enum. +func (e BrowserPageLcpEventCategory) Valid() bool { switch e { - case BrowserCdpPointerTypeMouse: - return true - case BrowserCdpPointerTypeOther: - return true - case BrowserCdpPointerTypePen: + case BrowserPageLcpEventCategoryPage: return true default: return false } } -// Defines values for BrowserCdpReferrerPolicy. +// Defines values for BrowserPageLcpEventType. const ( - BrowserCdpReferrerPolicyNoReferrer BrowserCdpReferrerPolicy = "noReferrer" - BrowserCdpReferrerPolicyNoReferrerWhenDowngrade BrowserCdpReferrerPolicy = "noReferrerWhenDowngrade" - BrowserCdpReferrerPolicyOrigin BrowserCdpReferrerPolicy = "origin" - BrowserCdpReferrerPolicyOriginWhenCrossOrigin BrowserCdpReferrerPolicy = "originWhenCrossOrigin" - BrowserCdpReferrerPolicyOther BrowserCdpReferrerPolicy = "other" - BrowserCdpReferrerPolicySameOrigin BrowserCdpReferrerPolicy = "sameOrigin" - BrowserCdpReferrerPolicyStrictOrigin BrowserCdpReferrerPolicy = "strictOrigin" - BrowserCdpReferrerPolicyStrictOriginWhenCrossOrigin BrowserCdpReferrerPolicy = "strictOriginWhenCrossOrigin" - BrowserCdpReferrerPolicyUnsafeUrl BrowserCdpReferrerPolicy = "unsafeUrl" + PageLcp BrowserPageLcpEventType = "page_lcp" ) -// Valid indicates whether the value is a known member of the BrowserCdpReferrerPolicy enum. -func (e BrowserCdpReferrerPolicy) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageLcpEventType enum. +func (e BrowserPageLcpEventType) Valid() bool { switch e { - case BrowserCdpReferrerPolicyNoReferrer: - return true - case BrowserCdpReferrerPolicyNoReferrerWhenDowngrade: - return true - case BrowserCdpReferrerPolicyOrigin: - return true - case BrowserCdpReferrerPolicyOriginWhenCrossOrigin: - return true - case BrowserCdpReferrerPolicyOther: - return true - case BrowserCdpReferrerPolicySameOrigin: - return true - case BrowserCdpReferrerPolicyStrictOrigin: - return true - case BrowserCdpReferrerPolicyStrictOriginWhenCrossOrigin: - return true - case BrowserCdpReferrerPolicyUnsafeUrl: + case PageLcp: return true default: return false } } -// Defines values for BrowserCdpScreencastFormat. +// Defines values for BrowserPageLoadEventCategory. const ( - BrowserCdpScreencastFormatJpeg BrowserCdpScreencastFormat = "jpeg" - BrowserCdpScreencastFormatOther BrowserCdpScreencastFormat = "other" - BrowserCdpScreencastFormatPng BrowserCdpScreencastFormat = "png" + BrowserPageLoadEventCategoryPage BrowserPageLoadEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpScreencastFormat enum. -func (e BrowserCdpScreencastFormat) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageLoadEventCategory enum. +func (e BrowserPageLoadEventCategory) Valid() bool { switch e { - case BrowserCdpScreencastFormatJpeg: - return true - case BrowserCdpScreencastFormatOther: - return true - case BrowserCdpScreencastFormatPng: + case BrowserPageLoadEventCategoryPage: return true default: return false } } -// Defines values for BrowserCdpScreenshotFormat. +// Defines values for BrowserPageLoadEventType. const ( - BrowserCdpScreenshotFormatJpeg BrowserCdpScreenshotFormat = "jpeg" - BrowserCdpScreenshotFormatOther BrowserCdpScreenshotFormat = "other" - BrowserCdpScreenshotFormatPng BrowserCdpScreenshotFormat = "png" - BrowserCdpScreenshotFormatWebp BrowserCdpScreenshotFormat = "webp" + PageLoad BrowserPageLoadEventType = "page_load" ) -// Valid indicates whether the value is a known member of the BrowserCdpScreenshotFormat enum. -func (e BrowserCdpScreenshotFormat) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageLoadEventType enum. +func (e BrowserPageLoadEventType) Valid() bool { switch e { - case BrowserCdpScreenshotFormatJpeg: - return true - case BrowserCdpScreenshotFormatOther: - return true - case BrowserCdpScreenshotFormatPng: - return true - case BrowserCdpScreenshotFormatWebp: + case PageLoad: return true default: return false } } -// Defines values for BrowserCdpSnapshotFormat. +// Defines values for BrowserPageNavigationEventCategory. const ( - BrowserCdpSnapshotFormatMhtml BrowserCdpSnapshotFormat = "mhtml" - BrowserCdpSnapshotFormatOther BrowserCdpSnapshotFormat = "other" + BrowserPageNavigationEventCategoryPage BrowserPageNavigationEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpSnapshotFormat enum. -func (e BrowserCdpSnapshotFormat) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageNavigationEventCategory enum. +func (e BrowserPageNavigationEventCategory) Valid() bool { switch e { - case BrowserCdpSnapshotFormatMhtml: - return true - case BrowserCdpSnapshotFormatOther: + case BrowserPageNavigationEventCategoryPage: return true default: return false } } -// Defines values for BrowserCdpTargetActivateTargetCommandDataMethod. +// Defines values for BrowserPageNavigationEventType. const ( - TargetActivateTarget BrowserCdpTargetActivateTargetCommandDataMethod = "Target.activateTarget" + PageNavigation BrowserPageNavigationEventType = "page_navigation" ) -// Valid indicates whether the value is a known member of the BrowserCdpTargetActivateTargetCommandDataMethod enum. -func (e BrowserCdpTargetActivateTargetCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageNavigationEventType enum. +func (e BrowserPageNavigationEventType) Valid() bool { switch e { - case TargetActivateTarget: + case PageNavigation: return true default: return false } } -// Defines values for BrowserCdpTargetCloseTargetCommandDataMethod. +// Defines values for BrowserPageNavigationSettledEventCategory. const ( - TargetCloseTarget BrowserCdpTargetCloseTargetCommandDataMethod = "Target.closeTarget" + BrowserPageNavigationSettledEventCategoryPage BrowserPageNavigationSettledEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpTargetCloseTargetCommandDataMethod enum. -func (e BrowserCdpTargetCloseTargetCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageNavigationSettledEventCategory enum. +func (e BrowserPageNavigationSettledEventCategory) Valid() bool { switch e { - case TargetCloseTarget: + case BrowserPageNavigationSettledEventCategoryPage: return true default: return false } } -// Defines values for BrowserCdpTargetCreateBrowserContextCommandDataMethod. +// Defines values for BrowserPageNavigationSettledEventType. const ( - TargetCreateBrowserContext BrowserCdpTargetCreateBrowserContextCommandDataMethod = "Target.createBrowserContext" + PageNavigationSettled BrowserPageNavigationSettledEventType = "page_navigation_settled" ) -// Valid indicates whether the value is a known member of the BrowserCdpTargetCreateBrowserContextCommandDataMethod enum. -func (e BrowserCdpTargetCreateBrowserContextCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageNavigationSettledEventType enum. +func (e BrowserPageNavigationSettledEventType) Valid() bool { switch e { - case TargetCreateBrowserContext: + case PageNavigationSettled: return true default: return false } } -// Defines values for BrowserCdpTargetCreateTargetCommandDataMethod. +// Defines values for BrowserPageTabOpenedEventCategory. const ( - TargetCreateTarget BrowserCdpTargetCreateTargetCommandDataMethod = "Target.createTarget" + Page BrowserPageTabOpenedEventCategory = "page" ) -// Valid indicates whether the value is a known member of the BrowserCdpTargetCreateTargetCommandDataMethod enum. -func (e BrowserCdpTargetCreateTargetCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageTabOpenedEventCategory enum. +func (e BrowserPageTabOpenedEventCategory) Valid() bool { switch e { - case TargetCreateTarget: + case Page: return true default: return false } } -// Defines values for BrowserCdpTargetDisposeBrowserContextCommandDataMethod. +// Defines values for BrowserPageTabOpenedEventType. const ( - TargetDisposeBrowserContext BrowserCdpTargetDisposeBrowserContextCommandDataMethod = "Target.disposeBrowserContext" + PageTabOpened BrowserPageTabOpenedEventType = "page_tab_opened" ) -// Valid indicates whether the value is a known member of the BrowserCdpTargetDisposeBrowserContextCommandDataMethod enum. -func (e BrowserCdpTargetDisposeBrowserContextCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPageTabOpenedEventType enum. +func (e BrowserPageTabOpenedEventType) Valid() bool { switch e { - case TargetDisposeBrowserContext: + case PageTabOpened: return true default: return false } } -// Defines values for BrowserCdpTargetOpenDevToolsCommandDataMethod. +// Defines values for BrowserPlatformApiCallEventCategory. const ( - TargetOpenDevTools BrowserCdpTargetOpenDevToolsCommandDataMethod = "Target.openDevTools" + Platform BrowserPlatformApiCallEventCategory = "platform" ) -// Valid indicates whether the value is a known member of the BrowserCdpTargetOpenDevToolsCommandDataMethod enum. -func (e BrowserCdpTargetOpenDevToolsCommandDataMethod) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPlatformApiCallEventCategory enum. +func (e BrowserPlatformApiCallEventCategory) Valid() bool { switch e { - case TargetOpenDevTools: + case Platform: return true default: return false } } -// Defines values for BrowserCdpTouchEventType. +// Defines values for BrowserPlatformApiCallEventType. const ( - BrowserCdpTouchEventTypeOther BrowserCdpTouchEventType = "other" - BrowserCdpTouchEventTypeTouchCancel BrowserCdpTouchEventType = "touchCancel" - BrowserCdpTouchEventTypeTouchEnd BrowserCdpTouchEventType = "touchEnd" - BrowserCdpTouchEventTypeTouchMove BrowserCdpTouchEventType = "touchMove" - BrowserCdpTouchEventTypeTouchStart BrowserCdpTouchEventType = "touchStart" + PlatformApiCall BrowserPlatformApiCallEventType = "platform_api_call" ) -// Valid indicates whether the value is a known member of the BrowserCdpTouchEventType enum. -func (e BrowserCdpTouchEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserPlatformApiCallEventType enum. +func (e BrowserPlatformApiCallEventType) Valid() bool { switch e { - case BrowserCdpTouchEventTypeOther: - return true - case BrowserCdpTouchEventTypeTouchCancel: - return true - case BrowserCdpTouchEventTypeTouchEnd: - return true - case BrowserCdpTouchEventTypeTouchMove: - return true - case BrowserCdpTouchEventTypeTouchStart: + case PlatformApiCall: return true default: return false } } -// Defines values for BrowserCdpTransitionType. +// Defines values for BrowserServiceCrashedEventCategory. const ( - BrowserCdpTransitionTypeAddressBar BrowserCdpTransitionType = "address_bar" - BrowserCdpTransitionTypeAutoBookmark BrowserCdpTransitionType = "auto_bookmark" - BrowserCdpTransitionTypeAutoSubframe BrowserCdpTransitionType = "auto_subframe" - BrowserCdpTransitionTypeAutoToplevel BrowserCdpTransitionType = "auto_toplevel" - BrowserCdpTransitionTypeFormSubmit BrowserCdpTransitionType = "form_submit" - BrowserCdpTransitionTypeGenerated BrowserCdpTransitionType = "generated" - BrowserCdpTransitionTypeKeyword BrowserCdpTransitionType = "keyword" - BrowserCdpTransitionTypeKeywordGenerated BrowserCdpTransitionType = "keyword_generated" - BrowserCdpTransitionTypeLink BrowserCdpTransitionType = "link" - BrowserCdpTransitionTypeManualSubframe BrowserCdpTransitionType = "manual_subframe" - BrowserCdpTransitionTypeOther BrowserCdpTransitionType = "other" - BrowserCdpTransitionTypeReload BrowserCdpTransitionType = "reload" - BrowserCdpTransitionTypeTyped BrowserCdpTransitionType = "typed" + BrowserServiceCrashedEventCategorySystem BrowserServiceCrashedEventCategory = "system" ) -// Valid indicates whether the value is a known member of the BrowserCdpTransitionType enum. -func (e BrowserCdpTransitionType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventCategory enum. +func (e BrowserServiceCrashedEventCategory) Valid() bool { switch e { - case BrowserCdpTransitionTypeAddressBar: - return true - case BrowserCdpTransitionTypeAutoBookmark: - return true - case BrowserCdpTransitionTypeAutoSubframe: - return true - case BrowserCdpTransitionTypeAutoToplevel: - return true - case BrowserCdpTransitionTypeFormSubmit: - return true - case BrowserCdpTransitionTypeGenerated: - return true - case BrowserCdpTransitionTypeKeyword: - return true - case BrowserCdpTransitionTypeKeywordGenerated: - return true - case BrowserCdpTransitionTypeLink: - return true - case BrowserCdpTransitionTypeManualSubframe: - return true - case BrowserCdpTransitionTypeOther: - return true - case BrowserCdpTransitionTypeReload: - return true - case BrowserCdpTransitionTypeTyped: + case BrowserServiceCrashedEventCategorySystem: return true default: return false } } -// Defines values for BrowserCdpWebLifecycleState. +// Defines values for BrowserServiceCrashedEventType. const ( - BrowserCdpWebLifecycleStateActive BrowserCdpWebLifecycleState = "active" - BrowserCdpWebLifecycleStateFrozen BrowserCdpWebLifecycleState = "frozen" - BrowserCdpWebLifecycleStateOther BrowserCdpWebLifecycleState = "other" + ServiceCrashed BrowserServiceCrashedEventType = "service_crashed" ) -// Valid indicates whether the value is a known member of the BrowserCdpWebLifecycleState enum. -func (e BrowserCdpWebLifecycleState) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventType enum. +func (e BrowserServiceCrashedEventType) Valid() bool { switch e { - case BrowserCdpWebLifecycleStateActive: - return true - case BrowserCdpWebLifecycleStateFrozen: - return true - case BrowserCdpWebLifecycleStateOther: + case ServiceCrashed: return true default: return false } } -// Defines values for BrowserCdpWindowState. +// Defines values for BrowserServiceCrashedEventDataPhase. const ( - BrowserCdpWindowStateFullscreen BrowserCdpWindowState = "fullscreen" - BrowserCdpWindowStateMaximized BrowserCdpWindowState = "maximized" - BrowserCdpWindowStateMinimized BrowserCdpWindowState = "minimized" - BrowserCdpWindowStateNormal BrowserCdpWindowState = "normal" - BrowserCdpWindowStateOther BrowserCdpWindowState = "other" + BrowserServiceCrashedEventDataPhaseGaveUp BrowserServiceCrashedEventDataPhase = "gave_up" + BrowserServiceCrashedEventDataPhaseRunning BrowserServiceCrashedEventDataPhase = "running" + BrowserServiceCrashedEventDataPhaseStartup BrowserServiceCrashedEventDataPhase = "startup" ) -// Valid indicates whether the value is a known member of the BrowserCdpWindowState enum. -func (e BrowserCdpWindowState) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventDataPhase enum. +func (e BrowserServiceCrashedEventDataPhase) Valid() bool { switch e { - case BrowserCdpWindowStateFullscreen: - return true - case BrowserCdpWindowStateMaximized: - return true - case BrowserCdpWindowStateMinimized: + case BrowserServiceCrashedEventDataPhaseGaveUp: return true - case BrowserCdpWindowStateNormal: + case BrowserServiceCrashedEventDataPhaseRunning: return true - case BrowserCdpWindowStateOther: + case BrowserServiceCrashedEventDataPhaseStartup: return true default: return false } } -// Defines values for BrowserConsoleErrorEventCategory. +// Defines values for BrowserSystemOomKillEventCategory. const ( - BrowserConsoleErrorEventCategoryConsole BrowserConsoleErrorEventCategory = "console" + BrowserSystemOomKillEventCategorySystem BrowserSystemOomKillEventCategory = "system" ) -// Valid indicates whether the value is a known member of the BrowserConsoleErrorEventCategory enum. -func (e BrowserConsoleErrorEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventCategory enum. +func (e BrowserSystemOomKillEventCategory) Valid() bool { switch e { - case BrowserConsoleErrorEventCategoryConsole: + case BrowserSystemOomKillEventCategorySystem: return true default: return false } } -// Defines values for BrowserConsoleErrorEventType. +// Defines values for BrowserSystemOomKillEventType. const ( - ConsoleError BrowserConsoleErrorEventType = "console_error" + SystemOomKill BrowserSystemOomKillEventType = "system_oom_kill" ) -// Valid indicates whether the value is a known member of the BrowserConsoleErrorEventType enum. -func (e BrowserConsoleErrorEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventType enum. +func (e BrowserSystemOomKillEventType) Valid() bool { switch e { - case ConsoleError: + case SystemOomKill: return true default: return false } } -// Defines values for BrowserConsoleLogEventCategory. +// Defines values for BrowserSystemOomKillEventDataConstraint. const ( - BrowserConsoleLogEventCategoryConsole BrowserConsoleLogEventCategory = "console" + Cpuset BrowserSystemOomKillEventDataConstraint = "cpuset" + Memcg BrowserSystemOomKillEventDataConstraint = "memcg" + MemoryPolicy BrowserSystemOomKillEventDataConstraint = "memory_policy" + None BrowserSystemOomKillEventDataConstraint = "none" ) -// Valid indicates whether the value is a known member of the BrowserConsoleLogEventCategory enum. -func (e BrowserConsoleLogEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventDataConstraint enum. +func (e BrowserSystemOomKillEventDataConstraint) Valid() bool { switch e { - case BrowserConsoleLogEventCategoryConsole: + case Cpuset: return true - default: - return false - } -} - -// Defines values for BrowserConsoleLogEventType. -const ( - ConsoleLog BrowserConsoleLogEventType = "console_log" -) - -// Valid indicates whether the value is a known member of the BrowserConsoleLogEventType enum. -func (e BrowserConsoleLogEventType) Valid() bool { - switch e { - case ConsoleLog: + case Memcg: + return true + case MemoryPolicy: + return true + case None: return true default: return false } } -// Defines values for BrowserEventSourceKind. +// Defines values for BrowserTargetType. const ( - Cdp BrowserEventSourceKind = "cdp" - Extension BrowserEventSourceKind = "extension" - KernelApi BrowserEventSourceKind = "kernel_api" - LocalProcess BrowserEventSourceKind = "local_process" + BrowserTargetTypeBackgroundPage BrowserTargetType = "background_page" + BrowserTargetTypeOther BrowserTargetType = "other" + BrowserTargetTypePage BrowserTargetType = "page" + BrowserTargetTypeServiceWorker BrowserTargetType = "service_worker" + BrowserTargetTypeSharedWorker BrowserTargetType = "shared_worker" ) -// Valid indicates whether the value is a known member of the BrowserEventSourceKind enum. -func (e BrowserEventSourceKind) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserTargetType enum. +func (e BrowserTargetType) Valid() bool { switch e { - case Cdp: + case BrowserTargetTypeBackgroundPage: return true - case Extension: + case BrowserTargetTypeOther: return true - case KernelApi: + case BrowserTargetTypePage: return true - case LocalProcess: + case BrowserTargetTypeServiceWorker: + return true + case BrowserTargetTypeSharedWorker: return true default: return false } } -// Defines values for BrowserInteractionClickEventCategory. +// Defines values for ChromiumConfigureErrorPhase. const ( - BrowserInteractionClickEventCategoryInteraction BrowserInteractionClickEventCategory = "interaction" + ConfigurePhase ChromiumConfigureErrorPhase = "configure_phase" + NavigatePhase ChromiumConfigureErrorPhase = "navigate_phase" ) -// Valid indicates whether the value is a known member of the BrowserInteractionClickEventCategory enum. -func (e BrowserInteractionClickEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the ChromiumConfigureErrorPhase enum. +func (e ChromiumConfigureErrorPhase) Valid() bool { switch e { - case BrowserInteractionClickEventCategoryInteraction: + case ConfigurePhase: + return true + case NavigatePhase: return true default: return false } } -// Defines values for BrowserInteractionClickEventType. +// Defines values for ChromiumConfigureErrorStep. const ( - InteractionClick BrowserInteractionClickEventType = "interaction_click" + ChromePolicies ChromiumConfigureErrorStep = "chrome_policies" + ChromiumFlags ChromiumConfigureErrorStep = "chromium_flags" + Display ChromiumConfigureErrorStep = "display" + Extensions ChromiumConfigureErrorStep = "extensions" + Profile ChromiumConfigureErrorStep = "profile" + StartChromium ChromiumConfigureErrorStep = "start_chromium" + StopChromium ChromiumConfigureErrorStep = "stop_chromium" ) -// Valid indicates whether the value is a known member of the BrowserInteractionClickEventType enum. -func (e BrowserInteractionClickEventType) Valid() bool { +// Valid indicates whether the value is a known member of the ChromiumConfigureErrorStep enum. +func (e ChromiumConfigureErrorStep) Valid() bool { switch e { - case InteractionClick: + case ChromePolicies: + return true + case ChromiumFlags: + return true + case Display: + return true + case Extensions: + return true + case Profile: + return true + case StartChromium: + return true + case StopChromium: return true default: return false } } -// Defines values for BrowserInteractionKeyEventCategory. +// Defines values for ClickMouseRequestButton. const ( - BrowserInteractionKeyEventCategoryInteraction BrowserInteractionKeyEventCategory = "interaction" + ClickMouseRequestButtonBack ClickMouseRequestButton = "back" + ClickMouseRequestButtonForward ClickMouseRequestButton = "forward" + ClickMouseRequestButtonLeft ClickMouseRequestButton = "left" + ClickMouseRequestButtonMiddle ClickMouseRequestButton = "middle" + ClickMouseRequestButtonRight ClickMouseRequestButton = "right" ) -// Valid indicates whether the value is a known member of the BrowserInteractionKeyEventCategory enum. -func (e BrowserInteractionKeyEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the ClickMouseRequestButton enum. +func (e ClickMouseRequestButton) Valid() bool { switch e { - case BrowserInteractionKeyEventCategoryInteraction: + case ClickMouseRequestButtonBack: + return true + case ClickMouseRequestButtonForward: + return true + case ClickMouseRequestButtonLeft: + return true + case ClickMouseRequestButtonMiddle: + return true + case ClickMouseRequestButtonRight: return true default: return false } } -// Defines values for BrowserInteractionKeyEventType. +// Defines values for ClickMouseRequestClickType. const ( - InteractionKey BrowserInteractionKeyEventType = "interaction_key" + Click ClickMouseRequestClickType = "click" + Down ClickMouseRequestClickType = "down" + Up ClickMouseRequestClickType = "up" ) -// Valid indicates whether the value is a known member of the BrowserInteractionKeyEventType enum. -func (e BrowserInteractionKeyEventType) Valid() bool { +// Valid indicates whether the value is a known member of the ClickMouseRequestClickType enum. +func (e ClickMouseRequestClickType) Valid() bool { switch e { - case InteractionKey: + case Click: + return true + case Down: + return true + case Up: return true default: return false } } -// Defines values for BrowserInteractionScrollSettledEventCategory. +// Defines values for ComputerActionType. const ( - BrowserInteractionScrollSettledEventCategoryInteraction BrowserInteractionScrollSettledEventCategory = "interaction" + ClickMouse ComputerActionType = "click_mouse" + DragMouse ComputerActionType = "drag_mouse" + MoveMouse ComputerActionType = "move_mouse" + PressKey ComputerActionType = "press_key" + Scroll ComputerActionType = "scroll" + SetCursor ComputerActionType = "set_cursor" + Sleep ComputerActionType = "sleep" + TypeText ComputerActionType = "type_text" ) -// Valid indicates whether the value is a known member of the BrowserInteractionScrollSettledEventCategory enum. -func (e BrowserInteractionScrollSettledEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the ComputerActionType enum. +func (e ComputerActionType) Valid() bool { switch e { - case BrowserInteractionScrollSettledEventCategoryInteraction: + case ClickMouse: + return true + case DragMouse: + return true + case MoveMouse: + return true + case PressKey: + return true + case Scroll: + return true + case SetCursor: + return true + case Sleep: + return true + case TypeText: return true default: return false } } -// Defines values for BrowserInteractionScrollSettledEventType. +// Defines values for DragMouseRequestButton. const ( - InteractionScrollSettled BrowserInteractionScrollSettledEventType = "interaction_scroll_settled" + DragMouseRequestButtonLeft DragMouseRequestButton = "left" + DragMouseRequestButtonMiddle DragMouseRequestButton = "middle" + DragMouseRequestButtonRight DragMouseRequestButton = "right" ) -// Valid indicates whether the value is a known member of the BrowserInteractionScrollSettledEventType enum. -func (e BrowserInteractionScrollSettledEventType) Valid() bool { +// Valid indicates whether the value is a known member of the DragMouseRequestButton enum. +func (e DragMouseRequestButton) Valid() bool { switch e { - case InteractionScrollSettled: + case DragMouseRequestButtonLeft: + return true + case DragMouseRequestButtonMiddle: + return true + case DragMouseRequestButtonRight: return true default: return false } } -// Defines values for BrowserLiveViewConnectEventCategory. +// Defines values for FileSystemEventType. const ( - BrowserLiveViewConnectEventCategoryConnection BrowserLiveViewConnectEventCategory = "connection" + CREATE FileSystemEventType = "CREATE" + DELETE FileSystemEventType = "DELETE" + RENAME FileSystemEventType = "RENAME" + WRITE FileSystemEventType = "WRITE" ) -// Valid indicates whether the value is a known member of the BrowserLiveViewConnectEventCategory enum. -func (e BrowserLiveViewConnectEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the FileSystemEventType enum. +func (e FileSystemEventType) Valid() bool { switch e { - case BrowserLiveViewConnectEventCategoryConnection: + case CREATE: + return true + case DELETE: + return true + case RENAME: + return true + case WRITE: return true default: return false } } -// Defines values for BrowserLiveViewConnectEventType. +// Defines values for PatchDisplayRequestRefreshRate. const ( - LiveViewConnect BrowserLiveViewConnectEventType = "live_view_connect" + N10 PatchDisplayRequestRefreshRate = 10 + N25 PatchDisplayRequestRefreshRate = 25 + N30 PatchDisplayRequestRefreshRate = 30 + N60 PatchDisplayRequestRefreshRate = 60 ) -// Valid indicates whether the value is a known member of the BrowserLiveViewConnectEventType enum. -func (e BrowserLiveViewConnectEventType) Valid() bool { +// Valid indicates whether the value is a known member of the PatchDisplayRequestRefreshRate enum. +func (e PatchDisplayRequestRefreshRate) Valid() bool { switch e { - case LiveViewConnect: + case N10: + return true + case N25: + return true + case N30: + return true + case N60: return true default: return false } } -// Defines values for BrowserLiveViewDisconnectEventCategory. +// Defines values for ProcessKillRequestSignal. const ( - BrowserLiveViewDisconnectEventCategoryConnection BrowserLiveViewDisconnectEventCategory = "connection" + HUP ProcessKillRequestSignal = "HUP" + INT ProcessKillRequestSignal = "INT" + KILL ProcessKillRequestSignal = "KILL" + TERM ProcessKillRequestSignal = "TERM" ) -// Valid indicates whether the value is a known member of the BrowserLiveViewDisconnectEventCategory enum. -func (e BrowserLiveViewDisconnectEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the ProcessKillRequestSignal enum. +func (e ProcessKillRequestSignal) Valid() bool { switch e { - case BrowserLiveViewDisconnectEventCategoryConnection: + case HUP: + return true + case INT: + return true + case KILL: + return true + case TERM: return true default: return false } } -// Defines values for BrowserLiveViewDisconnectEventType. +// Defines values for ProcessStatusState. const ( - LiveViewDisconnect BrowserLiveViewDisconnectEventType = "live_view_disconnect" + ProcessStatusStateExited ProcessStatusState = "exited" + ProcessStatusStateRunning ProcessStatusState = "running" ) -// Valid indicates whether the value is a known member of the BrowserLiveViewDisconnectEventType enum. -func (e BrowserLiveViewDisconnectEventType) Valid() bool { +// Valid indicates whether the value is a known member of the ProcessStatusState enum. +func (e ProcessStatusState) Valid() bool { switch e { - case LiveViewDisconnect: + case ProcessStatusStateExited: + return true + case ProcessStatusStateRunning: return true default: return false } } -// Defines values for BrowserMonitorDisconnectedEventCategory. +// Defines values for ProcessStreamEventEvent. const ( - BrowserMonitorDisconnectedEventCategoryMonitor BrowserMonitorDisconnectedEventCategory = "monitor" + Exit ProcessStreamEventEvent = "exit" ) -// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventCategory enum. -func (e BrowserMonitorDisconnectedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the ProcessStreamEventEvent enum. +func (e ProcessStreamEventEvent) Valid() bool { switch e { - case BrowserMonitorDisconnectedEventCategoryMonitor: + case Exit: return true default: return false } } -// Defines values for BrowserMonitorDisconnectedEventType. +// Defines values for ProcessStreamEventStream. const ( - MonitorDisconnected BrowserMonitorDisconnectedEventType = "monitor_disconnected" + Stderr ProcessStreamEventStream = "stderr" + Stdout ProcessStreamEventStream = "stdout" ) -// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventType enum. -func (e BrowserMonitorDisconnectedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the ProcessStreamEventStream enum. +func (e ProcessStreamEventStream) Valid() bool { switch e { - case MonitorDisconnected: + case Stderr: return true - default: - return false - } -} - -// Defines values for BrowserMonitorDisconnectedEventDataReason. -const ( - ChromeRestarted BrowserMonitorDisconnectedEventDataReason = "chrome_restarted" -) - -// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventDataReason enum. -func (e BrowserMonitorDisconnectedEventDataReason) Valid() bool { - switch e { - case ChromeRestarted: + case Stdout: return true default: return false } } -// Defines values for BrowserMonitorInitFailedEventCategory. +// Defines values for PublishEventRequestCategory. const ( - BrowserMonitorInitFailedEventCategoryMonitor BrowserMonitorInitFailedEventCategory = "monitor" + PublishEventRequestCategoryCaptcha PublishEventRequestCategory = "captcha" + PublishEventRequestCategoryConnection PublishEventRequestCategory = "connection" + PublishEventRequestCategoryConsole PublishEventRequestCategory = "console" + PublishEventRequestCategoryControl PublishEventRequestCategory = "control" + PublishEventRequestCategoryInteraction PublishEventRequestCategory = "interaction" + PublishEventRequestCategoryMonitor PublishEventRequestCategory = "monitor" + PublishEventRequestCategoryNetwork PublishEventRequestCategory = "network" + PublishEventRequestCategoryPage PublishEventRequestCategory = "page" + PublishEventRequestCategoryPlatform PublishEventRequestCategory = "platform" + PublishEventRequestCategoryScreenshot PublishEventRequestCategory = "screenshot" + PublishEventRequestCategorySystem PublishEventRequestCategory = "system" ) -// Valid indicates whether the value is a known member of the BrowserMonitorInitFailedEventCategory enum. -func (e BrowserMonitorInitFailedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the PublishEventRequestCategory enum. +func (e PublishEventRequestCategory) Valid() bool { switch e { - case BrowserMonitorInitFailedEventCategoryMonitor: + case PublishEventRequestCategoryCaptcha: + return true + case PublishEventRequestCategoryConnection: + return true + case PublishEventRequestCategoryConsole: + return true + case PublishEventRequestCategoryControl: + return true + case PublishEventRequestCategoryInteraction: + return true + case PublishEventRequestCategoryMonitor: + return true + case PublishEventRequestCategoryNetwork: + return true + case PublishEventRequestCategoryPage: + return true + case PublishEventRequestCategoryPlatform: + return true + case PublishEventRequestCategoryScreenshot: + return true + case PublishEventRequestCategorySystem: return true default: return false } } -// Defines values for BrowserMonitorInitFailedEventType. +// Defines values for TelemetryEventCategory. const ( - MonitorInitFailed BrowserMonitorInitFailedEventType = "monitor_init_failed" + TelemetryEventCategoryCaptcha TelemetryEventCategory = "captcha" + TelemetryEventCategoryConnection TelemetryEventCategory = "connection" + TelemetryEventCategoryConsole TelemetryEventCategory = "console" + TelemetryEventCategoryControl TelemetryEventCategory = "control" + TelemetryEventCategoryInteraction TelemetryEventCategory = "interaction" + TelemetryEventCategoryMonitor TelemetryEventCategory = "monitor" + TelemetryEventCategoryNetwork TelemetryEventCategory = "network" + TelemetryEventCategoryPage TelemetryEventCategory = "page" + TelemetryEventCategoryPlatform TelemetryEventCategory = "platform" + TelemetryEventCategoryScreenshot TelemetryEventCategory = "screenshot" + TelemetryEventCategorySystem TelemetryEventCategory = "system" ) -// Valid indicates whether the value is a known member of the BrowserMonitorInitFailedEventType enum. -func (e BrowserMonitorInitFailedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the TelemetryEventCategory enum. +func (e TelemetryEventCategory) Valid() bool { switch e { - case MonitorInitFailed: + case TelemetryEventCategoryCaptcha: + return true + case TelemetryEventCategoryConnection: + return true + case TelemetryEventCategoryConsole: + return true + case TelemetryEventCategoryControl: + return true + case TelemetryEventCategoryInteraction: + return true + case TelemetryEventCategoryMonitor: + return true + case TelemetryEventCategoryNetwork: + return true + case TelemetryEventCategoryPage: + return true + case TelemetryEventCategoryPlatform: + return true + case TelemetryEventCategoryScreenshot: + return true + case TelemetryEventCategorySystem: return true default: return false } } -// Defines values for BrowserMonitorReconnectFailedEventCategory. +// Defines values for DownloadDirZstdParamsCompressionLevel. const ( - BrowserMonitorReconnectFailedEventCategoryMonitor BrowserMonitorReconnectFailedEventCategory = "monitor" + Best DownloadDirZstdParamsCompressionLevel = "best" + Better DownloadDirZstdParamsCompressionLevel = "better" + Default DownloadDirZstdParamsCompressionLevel = "default" + Fastest DownloadDirZstdParamsCompressionLevel = "fastest" ) -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventCategory enum. -func (e BrowserMonitorReconnectFailedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the DownloadDirZstdParamsCompressionLevel enum. +func (e DownloadDirZstdParamsCompressionLevel) Valid() bool { switch e { - case BrowserMonitorReconnectFailedEventCategoryMonitor: + case Best: + return true + case Better: + return true + case Default: + return true + case Fastest: return true default: return false } } -// Defines values for BrowserMonitorReconnectFailedEventType. +// Defines values for LogsStreamParamsSource. const ( - MonitorReconnectFailed BrowserMonitorReconnectFailedEventType = "monitor_reconnect_failed" + Path LogsStreamParamsSource = "path" + Supervisor LogsStreamParamsSource = "supervisor" ) -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventType enum. -func (e BrowserMonitorReconnectFailedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the LogsStreamParamsSource enum. +func (e LogsStreamParamsSource) Valid() bool { switch e { - case MonitorReconnectFailed: + case Path: + return true + case Supervisor: return true default: return false } } -// Defines values for BrowserMonitorReconnectFailedEventDataReason. +// Defines values for StreamTelemetryEventsParamsReplay. const ( - ReconnectExhausted BrowserMonitorReconnectFailedEventDataReason = "reconnect_exhausted" + All StreamTelemetryEventsParamsReplay = "all" ) -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventDataReason enum. -func (e BrowserMonitorReconnectFailedEventDataReason) Valid() bool { +// Valid indicates whether the value is a known member of the StreamTelemetryEventsParamsReplay enum. +func (e StreamTelemetryEventsParamsReplay) Valid() bool { switch e { - case ReconnectExhausted: + case All: return true default: return false } } -// Defines values for BrowserMonitorReconnectedEventCategory. -const ( - BrowserMonitorReconnectedEventCategoryMonitor BrowserMonitorReconnectedEventCategory = "monitor" -) - -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectedEventCategory enum. -func (e BrowserMonitorReconnectedEventCategory) Valid() bool { - switch e { - case BrowserMonitorReconnectedEventCategoryMonitor: - return true - default: - return false - } +// BatchComputerActionRequest A batch of computer actions to execute sequentially. +type BatchComputerActionRequest struct { + // Actions Ordered list of actions to execute. Execution stops on the first error. + Actions []ComputerAction `json:"actions"` } -// Defines values for BrowserMonitorReconnectedEventType. -const ( - MonitorReconnected BrowserMonitorReconnectedEventType = "monitor_reconnected" -) +// BrowserApiCallEvent A call that drives the browser, handled by the kernel-images-api server: computer-control actions, Playwright code execution, screenshots and clipboard access. Calls that manage the VM instead emit `platform_api_call`. +type BrowserApiCallEvent struct { + Category BrowserApiCallEventCategory `json:"category"` -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectedEventType enum. -func (e BrowserMonitorReconnectedEventType) Valid() bool { - switch e { - case MonitorReconnected: - return true - default: - return false - } -} + // Data Per-call payload for `api_call` events. + Data *BrowserApiCallEventData `json:"data,omitempty"` -// Defines values for BrowserMonitorScreenshotEventCategory. -const ( - Screenshot BrowserMonitorScreenshotEventCategory = "screenshot" -) + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` -// Valid indicates whether the value is a known member of the BrowserMonitorScreenshotEventCategory enum. -func (e BrowserMonitorScreenshotEventCategory) Valid() bool { - switch e { - case Screenshot: - return true - default: - return false - } + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserApiCallEventType `json:"type"` } -// Defines values for BrowserMonitorScreenshotEventType. -const ( - MonitorScreenshot BrowserMonitorScreenshotEventType = "monitor_screenshot" -) +// BrowserApiCallEventCategory defines model for BrowserApiCallEvent.Category. +type BrowserApiCallEventCategory string -// Valid indicates whether the value is a known member of the BrowserMonitorScreenshotEventType enum. -func (e BrowserMonitorScreenshotEventType) Valid() bool { - switch e { - case MonitorScreenshot: - return true - default: - return false - } -} +// BrowserApiCallEventType defines model for BrowserApiCallEvent.Type. +type BrowserApiCallEventType string -// Defines values for BrowserNetworkIdleEventCategory. -const ( - BrowserNetworkIdleEventCategoryNetwork BrowserNetworkIdleEventCategory = "network" -) +// BrowserApiCallEventData Per-call payload for `api_call` events. +type BrowserApiCallEventData struct { + // Code Source submitted to `executePlaywrightCode`, capped at 8192 bytes like every other captured string. A capped value is cut on a character boundary and ends in `...[truncated]`. Absent for every other operation. + Code *string `json:"code,omitempty"` -// Valid indicates whether the value is a known member of the BrowserNetworkIdleEventCategory enum. -func (e BrowserNetworkIdleEventCategory) Valid() bool { - switch e { - case BrowserNetworkIdleEventCategoryNetwork: - return true - default: - return false - } -} + // DurationMs Wall-clock duration of the handler in milliseconds. + DurationMs float32 `json:"duration_ms"` -// Defines values for BrowserNetworkIdleEventType. -const ( - NetworkIdle BrowserNetworkIdleEventType = "network_idle" -) + // OperationId Matched route's operation, named as the server names its handler (e.g. `TakeScreenshot`, `ExecutePlaywrightCode`). + OperationId string `json:"operation_id"` -// Valid indicates whether the value is a known member of the BrowserNetworkIdleEventType enum. -func (e BrowserNetworkIdleEventType) Valid() bool { - switch e { - case NetworkIdle: - return true - default: - return false - } + // RequestId Per-request identifier from the kernel-images-api request middleware. + RequestId string `json:"request_id"` + + // Status HTTP response status code. + Status int `json:"status"` } -// Defines values for BrowserNetworkLoadingFailedEventCategory. -const ( - BrowserNetworkLoadingFailedEventCategoryNetwork BrowserNetworkLoadingFailedEventCategory = "network" -) +// BrowserCallStack CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. +type BrowserCallStack struct { + // CallFrames Ordered list of call frames, outermost first. + CallFrames []struct { + // ColumnNumber Zero-based column number within the line. + ColumnNumber int `json:"columnNumber"` -// Valid indicates whether the value is a known member of the BrowserNetworkLoadingFailedEventCategory enum. -func (e BrowserNetworkLoadingFailedEventCategory) Valid() bool { - switch e { - case BrowserNetworkLoadingFailedEventCategoryNetwork: - return true - default: - return false - } -} - -// Defines values for BrowserNetworkLoadingFailedEventType. -const ( - NetworkLoadingFailed BrowserNetworkLoadingFailedEventType = "network_loading_failed" -) - -// Valid indicates whether the value is a known member of the BrowserNetworkLoadingFailedEventType enum. -func (e BrowserNetworkLoadingFailedEventType) Valid() bool { - switch e { - case NetworkLoadingFailed: - return true - default: - return false - } -} - -// Defines values for BrowserNetworkRequestEventCategory. -const ( - BrowserNetworkRequestEventCategoryNetwork BrowserNetworkRequestEventCategory = "network" -) - -// Valid indicates whether the value is a known member of the BrowserNetworkRequestEventCategory enum. -func (e BrowserNetworkRequestEventCategory) Valid() bool { - switch e { - case BrowserNetworkRequestEventCategoryNetwork: - return true - default: - return false - } -} - -// Defines values for BrowserNetworkRequestEventType. -const ( - NetworkRequest BrowserNetworkRequestEventType = "network_request" -) - -// Valid indicates whether the value is a known member of the BrowserNetworkRequestEventType enum. -func (e BrowserNetworkRequestEventType) Valid() bool { - switch e { - case NetworkRequest: - return true - default: - return false - } -} - -// Defines values for BrowserNetworkResponseEventCategory. -const ( - BrowserNetworkResponseEventCategoryNetwork BrowserNetworkResponseEventCategory = "network" -) - -// Valid indicates whether the value is a known member of the BrowserNetworkResponseEventCategory enum. -func (e BrowserNetworkResponseEventCategory) Valid() bool { - switch e { - case BrowserNetworkResponseEventCategoryNetwork: - return true - default: - return false - } -} - -// Defines values for BrowserNetworkResponseEventType. -const ( - NetworkResponse BrowserNetworkResponseEventType = "network_response" -) - -// Valid indicates whether the value is a known member of the BrowserNetworkResponseEventType enum. -func (e BrowserNetworkResponseEventType) Valid() bool { - switch e { - case NetworkResponse: - return true - default: - return false - } -} - -// Defines values for BrowserPageCrashedEventCategory. -const ( - BrowserPageCrashedEventCategoryPage BrowserPageCrashedEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageCrashedEventCategory enum. -func (e BrowserPageCrashedEventCategory) Valid() bool { - switch e { - case BrowserPageCrashedEventCategoryPage: - return true - default: - return false - } -} - -// Defines values for BrowserPageCrashedEventType. -const ( - PageCrashed BrowserPageCrashedEventType = "page_crashed" -) - -// Valid indicates whether the value is a known member of the BrowserPageCrashedEventType enum. -func (e BrowserPageCrashedEventType) Valid() bool { - switch e { - case PageCrashed: - return true - default: - return false - } -} - -// Defines values for BrowserPageDomContentLoadedEventCategory. -const ( - BrowserPageDomContentLoadedEventCategoryPage BrowserPageDomContentLoadedEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageDomContentLoadedEventCategory enum. -func (e BrowserPageDomContentLoadedEventCategory) Valid() bool { - switch e { - case BrowserPageDomContentLoadedEventCategoryPage: - return true - default: - return false - } -} - -// Defines values for BrowserPageDomContentLoadedEventType. -const ( - PageDomContentLoaded BrowserPageDomContentLoadedEventType = "page_dom_content_loaded" -) - -// Valid indicates whether the value is a known member of the BrowserPageDomContentLoadedEventType enum. -func (e BrowserPageDomContentLoadedEventType) Valid() bool { - switch e { - case PageDomContentLoaded: - return true - default: - return false - } -} - -// Defines values for BrowserPageLayoutSettledEventCategory. -const ( - BrowserPageLayoutSettledEventCategoryPage BrowserPageLayoutSettledEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageLayoutSettledEventCategory enum. -func (e BrowserPageLayoutSettledEventCategory) Valid() bool { - switch e { - case BrowserPageLayoutSettledEventCategoryPage: - return true - default: - return false - } -} - -// Defines values for BrowserPageLayoutSettledEventType. -const ( - PageLayoutSettled BrowserPageLayoutSettledEventType = "page_layout_settled" -) - -// Valid indicates whether the value is a known member of the BrowserPageLayoutSettledEventType enum. -func (e BrowserPageLayoutSettledEventType) Valid() bool { - switch e { - case PageLayoutSettled: - return true - default: - return false - } -} - -// Defines values for BrowserPageLayoutShiftEventCategory. -const ( - BrowserPageLayoutShiftEventCategoryPage BrowserPageLayoutShiftEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageLayoutShiftEventCategory enum. -func (e BrowserPageLayoutShiftEventCategory) Valid() bool { - switch e { - case BrowserPageLayoutShiftEventCategoryPage: - return true - default: - return false - } -} - -// Defines values for BrowserPageLayoutShiftEventType. -const ( - PageLayoutShift BrowserPageLayoutShiftEventType = "page_layout_shift" -) - -// Valid indicates whether the value is a known member of the BrowserPageLayoutShiftEventType enum. -func (e BrowserPageLayoutShiftEventType) Valid() bool { - switch e { - case PageLayoutShift: - return true - default: - return false - } -} - -// Defines values for BrowserPageLcpEventCategory. -const ( - BrowserPageLcpEventCategoryPage BrowserPageLcpEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageLcpEventCategory enum. -func (e BrowserPageLcpEventCategory) Valid() bool { - switch e { - case BrowserPageLcpEventCategoryPage: - return true - default: - return false - } -} - -// Defines values for BrowserPageLcpEventType. -const ( - PageLcp BrowserPageLcpEventType = "page_lcp" -) - -// Valid indicates whether the value is a known member of the BrowserPageLcpEventType enum. -func (e BrowserPageLcpEventType) Valid() bool { - switch e { - case PageLcp: - return true - default: - return false - } -} - -// Defines values for BrowserPageLoadEventCategory. -const ( - BrowserPageLoadEventCategoryPage BrowserPageLoadEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageLoadEventCategory enum. -func (e BrowserPageLoadEventCategory) Valid() bool { - switch e { - case BrowserPageLoadEventCategoryPage: - return true - default: - return false - } -} - -// Defines values for BrowserPageLoadEventType. -const ( - PageLoad BrowserPageLoadEventType = "page_load" -) - -// Valid indicates whether the value is a known member of the BrowserPageLoadEventType enum. -func (e BrowserPageLoadEventType) Valid() bool { - switch e { - case PageLoad: - return true - default: - return false - } -} - -// Defines values for BrowserPageNavigationEventCategory. -const ( - BrowserPageNavigationEventCategoryPage BrowserPageNavigationEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageNavigationEventCategory enum. -func (e BrowserPageNavigationEventCategory) Valid() bool { - switch e { - case BrowserPageNavigationEventCategoryPage: - return true - default: - return false - } -} - -// Defines values for BrowserPageNavigationEventType. -const ( - PageNavigation BrowserPageNavigationEventType = "page_navigation" -) - -// Valid indicates whether the value is a known member of the BrowserPageNavigationEventType enum. -func (e BrowserPageNavigationEventType) Valid() bool { - switch e { - case PageNavigation: - return true - default: - return false - } -} - -// Defines values for BrowserPageNavigationSettledEventCategory. -const ( - BrowserPageNavigationSettledEventCategoryPage BrowserPageNavigationSettledEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageNavigationSettledEventCategory enum. -func (e BrowserPageNavigationSettledEventCategory) Valid() bool { - switch e { - case BrowserPageNavigationSettledEventCategoryPage: - return true - default: - return false - } -} - -// Defines values for BrowserPageNavigationSettledEventType. -const ( - PageNavigationSettled BrowserPageNavigationSettledEventType = "page_navigation_settled" -) - -// Valid indicates whether the value is a known member of the BrowserPageNavigationSettledEventType enum. -func (e BrowserPageNavigationSettledEventType) Valid() bool { - switch e { - case PageNavigationSettled: - return true - default: - return false - } -} - -// Defines values for BrowserPageTabOpenedEventCategory. -const ( - Page BrowserPageTabOpenedEventCategory = "page" -) - -// Valid indicates whether the value is a known member of the BrowserPageTabOpenedEventCategory enum. -func (e BrowserPageTabOpenedEventCategory) Valid() bool { - switch e { - case Page: - return true - default: - return false - } -} - -// Defines values for BrowserPageTabOpenedEventType. -const ( - PageTabOpened BrowserPageTabOpenedEventType = "page_tab_opened" -) - -// Valid indicates whether the value is a known member of the BrowserPageTabOpenedEventType enum. -func (e BrowserPageTabOpenedEventType) Valid() bool { - switch e { - case PageTabOpened: - return true - default: - return false - } -} - -// Defines values for BrowserPlatformApiCallEventCategory. -const ( - Platform BrowserPlatformApiCallEventCategory = "platform" -) - -// Valid indicates whether the value is a known member of the BrowserPlatformApiCallEventCategory enum. -func (e BrowserPlatformApiCallEventCategory) Valid() bool { - switch e { - case Platform: - return true - default: - return false - } -} - -// Defines values for BrowserPlatformApiCallEventType. -const ( - PlatformApiCall BrowserPlatformApiCallEventType = "platform_api_call" -) - -// Valid indicates whether the value is a known member of the BrowserPlatformApiCallEventType enum. -func (e BrowserPlatformApiCallEventType) Valid() bool { - switch e { - case PlatformApiCall: - return true - default: - return false - } -} - -// Defines values for BrowserProxyErrorEventCategory. -const ( - Network BrowserProxyErrorEventCategory = "network" -) - -// Valid indicates whether the value is a known member of the BrowserProxyErrorEventCategory enum. -func (e BrowserProxyErrorEventCategory) Valid() bool { - switch e { - case Network: - return true - default: - return false - } -} - -// Defines values for BrowserProxyErrorEventType. -const ( - ProxyError BrowserProxyErrorEventType = "proxy_error" -) - -// Valid indicates whether the value is a known member of the BrowserProxyErrorEventType enum. -func (e BrowserProxyErrorEventType) Valid() bool { - switch e { - case ProxyError: - return true - default: - return false - } -} - -// Defines values for BrowserProxyErrorEventDataCode. -const ( - DestinationBlocked BrowserProxyErrorEventDataCode = "destination_blocked" - ProviderBlacklisted BrowserProxyErrorEventDataCode = "provider_blacklisted" - ProviderUnreachable BrowserProxyErrorEventDataCode = "provider_unreachable" - ProxyUnavailable BrowserProxyErrorEventDataCode = "proxy_unavailable" - UpstreamConnectFailed BrowserProxyErrorEventDataCode = "upstream_connect_failed" - UpstreamDnsFailure BrowserProxyErrorEventDataCode = "upstream_dns_failure" - UpstreamTimeout BrowserProxyErrorEventDataCode = "upstream_timeout" -) - -// Valid indicates whether the value is a known member of the BrowserProxyErrorEventDataCode enum. -func (e BrowserProxyErrorEventDataCode) Valid() bool { - switch e { - case DestinationBlocked: - return true - case ProviderBlacklisted: - return true - case ProviderUnreachable: - return true - case ProxyUnavailable: - return true - case UpstreamConnectFailed: - return true - case UpstreamDnsFailure: - return true - case UpstreamTimeout: - return true - default: - return false - } -} - -// Defines values for BrowserServiceCrashedEventCategory. -const ( - BrowserServiceCrashedEventCategorySystem BrowserServiceCrashedEventCategory = "system" -) - -// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventCategory enum. -func (e BrowserServiceCrashedEventCategory) Valid() bool { - switch e { - case BrowserServiceCrashedEventCategorySystem: - return true - default: - return false - } -} - -// Defines values for BrowserServiceCrashedEventType. -const ( - ServiceCrashed BrowserServiceCrashedEventType = "service_crashed" -) - -// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventType enum. -func (e BrowserServiceCrashedEventType) Valid() bool { - switch e { - case ServiceCrashed: - return true - default: - return false - } -} - -// Defines values for BrowserServiceCrashedEventDataPhase. -const ( - BrowserServiceCrashedEventDataPhaseGaveUp BrowserServiceCrashedEventDataPhase = "gave_up" - BrowserServiceCrashedEventDataPhaseRunning BrowserServiceCrashedEventDataPhase = "running" - BrowserServiceCrashedEventDataPhaseStartup BrowserServiceCrashedEventDataPhase = "startup" -) - -// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventDataPhase enum. -func (e BrowserServiceCrashedEventDataPhase) Valid() bool { - switch e { - case BrowserServiceCrashedEventDataPhaseGaveUp: - return true - case BrowserServiceCrashedEventDataPhaseRunning: - return true - case BrowserServiceCrashedEventDataPhaseStartup: - return true - default: - return false - } -} - -// Defines values for BrowserSystemOomKillEventCategory. -const ( - BrowserSystemOomKillEventCategorySystem BrowserSystemOomKillEventCategory = "system" -) - -// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventCategory enum. -func (e BrowserSystemOomKillEventCategory) Valid() bool { - switch e { - case BrowserSystemOomKillEventCategorySystem: - return true - default: - return false - } -} - -// Defines values for BrowserSystemOomKillEventType. -const ( - SystemOomKill BrowserSystemOomKillEventType = "system_oom_kill" -) - -// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventType enum. -func (e BrowserSystemOomKillEventType) Valid() bool { - switch e { - case SystemOomKill: - return true - default: - return false - } -} - -// Defines values for BrowserSystemOomKillEventDataConstraint. -const ( - Cpuset BrowserSystemOomKillEventDataConstraint = "cpuset" - Memcg BrowserSystemOomKillEventDataConstraint = "memcg" - MemoryPolicy BrowserSystemOomKillEventDataConstraint = "memory_policy" - None BrowserSystemOomKillEventDataConstraint = "none" -) - -// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventDataConstraint enum. -func (e BrowserSystemOomKillEventDataConstraint) Valid() bool { - switch e { - case Cpuset: - return true - case Memcg: - return true - case MemoryPolicy: - return true - case None: - return true - default: - return false - } -} - -// Defines values for BrowserTargetType. -const ( - BrowserTargetTypeBackgroundPage BrowserTargetType = "background_page" - BrowserTargetTypeOther BrowserTargetType = "other" - BrowserTargetTypePage BrowserTargetType = "page" - BrowserTargetTypeServiceWorker BrowserTargetType = "service_worker" - BrowserTargetTypeSharedWorker BrowserTargetType = "shared_worker" -) - -// Valid indicates whether the value is a known member of the BrowserTargetType enum. -func (e BrowserTargetType) Valid() bool { - switch e { - case BrowserTargetTypeBackgroundPage: - return true - case BrowserTargetTypeOther: - return true - case BrowserTargetTypePage: - return true - case BrowserTargetTypeServiceWorker: - return true - case BrowserTargetTypeSharedWorker: - return true - default: - return false - } -} - -// Defines values for ChromiumConfigureErrorPhase. -const ( - ConfigurePhase ChromiumConfigureErrorPhase = "configure_phase" - NavigatePhase ChromiumConfigureErrorPhase = "navigate_phase" -) - -// Valid indicates whether the value is a known member of the ChromiumConfigureErrorPhase enum. -func (e ChromiumConfigureErrorPhase) Valid() bool { - switch e { - case ConfigurePhase: - return true - case NavigatePhase: - return true - default: - return false - } -} - -// Defines values for ChromiumConfigureErrorStep. -const ( - ChromePolicies ChromiumConfigureErrorStep = "chrome_policies" - ChromiumFlags ChromiumConfigureErrorStep = "chromium_flags" - Display ChromiumConfigureErrorStep = "display" - Extensions ChromiumConfigureErrorStep = "extensions" - Profile ChromiumConfigureErrorStep = "profile" - StartChromium ChromiumConfigureErrorStep = "start_chromium" - StopChromium ChromiumConfigureErrorStep = "stop_chromium" -) - -// Valid indicates whether the value is a known member of the ChromiumConfigureErrorStep enum. -func (e ChromiumConfigureErrorStep) Valid() bool { - switch e { - case ChromePolicies: - return true - case ChromiumFlags: - return true - case Display: - return true - case Extensions: - return true - case Profile: - return true - case StartChromium: - return true - case StopChromium: - return true - default: - return false - } -} - -// Defines values for ClickMouseRequestButton. -const ( - ClickMouseRequestButtonBack ClickMouseRequestButton = "back" - ClickMouseRequestButtonForward ClickMouseRequestButton = "forward" - ClickMouseRequestButtonLeft ClickMouseRequestButton = "left" - ClickMouseRequestButtonMiddle ClickMouseRequestButton = "middle" - ClickMouseRequestButtonRight ClickMouseRequestButton = "right" -) - -// Valid indicates whether the value is a known member of the ClickMouseRequestButton enum. -func (e ClickMouseRequestButton) Valid() bool { - switch e { - case ClickMouseRequestButtonBack: - return true - case ClickMouseRequestButtonForward: - return true - case ClickMouseRequestButtonLeft: - return true - case ClickMouseRequestButtonMiddle: - return true - case ClickMouseRequestButtonRight: - return true - default: - return false - } -} - -// Defines values for ClickMouseRequestClickType. -const ( - Click ClickMouseRequestClickType = "click" - Down ClickMouseRequestClickType = "down" - Up ClickMouseRequestClickType = "up" -) - -// Valid indicates whether the value is a known member of the ClickMouseRequestClickType enum. -func (e ClickMouseRequestClickType) Valid() bool { - switch e { - case Click: - return true - case Down: - return true - case Up: - return true - default: - return false - } -} - -// Defines values for ComputerActionType. -const ( - ClickMouse ComputerActionType = "click_mouse" - DragMouse ComputerActionType = "drag_mouse" - MoveMouse ComputerActionType = "move_mouse" - PressKey ComputerActionType = "press_key" - Scroll ComputerActionType = "scroll" - SetCursor ComputerActionType = "set_cursor" - Sleep ComputerActionType = "sleep" - TypeText ComputerActionType = "type_text" -) - -// Valid indicates whether the value is a known member of the ComputerActionType enum. -func (e ComputerActionType) Valid() bool { - switch e { - case ClickMouse: - return true - case DragMouse: - return true - case MoveMouse: - return true - case PressKey: - return true - case Scroll: - return true - case SetCursor: - return true - case Sleep: - return true - case TypeText: - return true - default: - return false - } -} - -// Defines values for DragMouseRequestButton. -const ( - DragMouseRequestButtonLeft DragMouseRequestButton = "left" - DragMouseRequestButtonMiddle DragMouseRequestButton = "middle" - DragMouseRequestButtonRight DragMouseRequestButton = "right" -) - -// Valid indicates whether the value is a known member of the DragMouseRequestButton enum. -func (e DragMouseRequestButton) Valid() bool { - switch e { - case DragMouseRequestButtonLeft: - return true - case DragMouseRequestButtonMiddle: - return true - case DragMouseRequestButtonRight: - return true - default: - return false - } -} - -// Defines values for FileSystemEventType. -const ( - CREATE FileSystemEventType = "CREATE" - DELETE FileSystemEventType = "DELETE" - RENAME FileSystemEventType = "RENAME" - WRITE FileSystemEventType = "WRITE" -) - -// Valid indicates whether the value is a known member of the FileSystemEventType enum. -func (e FileSystemEventType) Valid() bool { - switch e { - case CREATE: - return true - case DELETE: - return true - case RENAME: - return true - case WRITE: - return true - default: - return false - } -} - -// Defines values for PatchDisplayRequestRefreshRate. -const ( - N10 PatchDisplayRequestRefreshRate = 10 - N25 PatchDisplayRequestRefreshRate = 25 - N30 PatchDisplayRequestRefreshRate = 30 - N60 PatchDisplayRequestRefreshRate = 60 -) - -// Valid indicates whether the value is a known member of the PatchDisplayRequestRefreshRate enum. -func (e PatchDisplayRequestRefreshRate) Valid() bool { - switch e { - case N10: - return true - case N25: - return true - case N30: - return true - case N60: - return true - default: - return false - } -} - -// Defines values for ProcessKillRequestSignal. -const ( - HUP ProcessKillRequestSignal = "HUP" - INT ProcessKillRequestSignal = "INT" - KILL ProcessKillRequestSignal = "KILL" - TERM ProcessKillRequestSignal = "TERM" -) - -// Valid indicates whether the value is a known member of the ProcessKillRequestSignal enum. -func (e ProcessKillRequestSignal) Valid() bool { - switch e { - case HUP: - return true - case INT: - return true - case KILL: - return true - case TERM: - return true - default: - return false - } -} - -// Defines values for ProcessStatusState. -const ( - ProcessStatusStateExited ProcessStatusState = "exited" - ProcessStatusStateRunning ProcessStatusState = "running" -) - -// Valid indicates whether the value is a known member of the ProcessStatusState enum. -func (e ProcessStatusState) Valid() bool { - switch e { - case ProcessStatusStateExited: - return true - case ProcessStatusStateRunning: - return true - default: - return false - } -} - -// Defines values for ProcessStreamEventEvent. -const ( - Exit ProcessStreamEventEvent = "exit" -) - -// Valid indicates whether the value is a known member of the ProcessStreamEventEvent enum. -func (e ProcessStreamEventEvent) Valid() bool { - switch e { - case Exit: - return true - default: - return false - } -} - -// Defines values for ProcessStreamEventStream. -const ( - Stderr ProcessStreamEventStream = "stderr" - Stdout ProcessStreamEventStream = "stdout" -) - -// Valid indicates whether the value is a known member of the ProcessStreamEventStream enum. -func (e ProcessStreamEventStream) Valid() bool { - switch e { - case Stderr: - return true - case Stdout: - return true - default: - return false - } -} - -// Defines values for PublishEventRequestCategory. -const ( - PublishEventRequestCategoryCaptcha PublishEventRequestCategory = "captcha" - PublishEventRequestCategoryConnection PublishEventRequestCategory = "connection" - PublishEventRequestCategoryConsole PublishEventRequestCategory = "console" - PublishEventRequestCategoryControl PublishEventRequestCategory = "control" - PublishEventRequestCategoryInteraction PublishEventRequestCategory = "interaction" - PublishEventRequestCategoryMonitor PublishEventRequestCategory = "monitor" - PublishEventRequestCategoryNetwork PublishEventRequestCategory = "network" - PublishEventRequestCategoryPage PublishEventRequestCategory = "page" - PublishEventRequestCategoryPlatform PublishEventRequestCategory = "platform" - PublishEventRequestCategoryScreenshot PublishEventRequestCategory = "screenshot" - PublishEventRequestCategorySystem PublishEventRequestCategory = "system" -) - -// Valid indicates whether the value is a known member of the PublishEventRequestCategory enum. -func (e PublishEventRequestCategory) Valid() bool { - switch e { - case PublishEventRequestCategoryCaptcha: - return true - case PublishEventRequestCategoryConnection: - return true - case PublishEventRequestCategoryConsole: - return true - case PublishEventRequestCategoryControl: - return true - case PublishEventRequestCategoryInteraction: - return true - case PublishEventRequestCategoryMonitor: - return true - case PublishEventRequestCategoryNetwork: - return true - case PublishEventRequestCategoryPage: - return true - case PublishEventRequestCategoryPlatform: - return true - case PublishEventRequestCategoryScreenshot: - return true - case PublishEventRequestCategorySystem: - return true - default: - return false - } -} - -// Defines values for TelemetryEventCategory. -const ( - TelemetryEventCategoryCaptcha TelemetryEventCategory = "captcha" - TelemetryEventCategoryConnection TelemetryEventCategory = "connection" - TelemetryEventCategoryConsole TelemetryEventCategory = "console" - TelemetryEventCategoryControl TelemetryEventCategory = "control" - TelemetryEventCategoryInteraction TelemetryEventCategory = "interaction" - TelemetryEventCategoryMonitor TelemetryEventCategory = "monitor" - TelemetryEventCategoryNetwork TelemetryEventCategory = "network" - TelemetryEventCategoryPage TelemetryEventCategory = "page" - TelemetryEventCategoryPlatform TelemetryEventCategory = "platform" - TelemetryEventCategoryScreenshot TelemetryEventCategory = "screenshot" - TelemetryEventCategorySystem TelemetryEventCategory = "system" -) - -// Valid indicates whether the value is a known member of the TelemetryEventCategory enum. -func (e TelemetryEventCategory) Valid() bool { - switch e { - case TelemetryEventCategoryCaptcha: - return true - case TelemetryEventCategoryConnection: - return true - case TelemetryEventCategoryConsole: - return true - case TelemetryEventCategoryControl: - return true - case TelemetryEventCategoryInteraction: - return true - case TelemetryEventCategoryMonitor: - return true - case TelemetryEventCategoryNetwork: - return true - case TelemetryEventCategoryPage: - return true - case TelemetryEventCategoryPlatform: - return true - case TelemetryEventCategoryScreenshot: - return true - case TelemetryEventCategorySystem: - return true - default: - return false - } -} - -// Defines values for DownloadDirZstdParamsCompressionLevel. -const ( - Best DownloadDirZstdParamsCompressionLevel = "best" - Better DownloadDirZstdParamsCompressionLevel = "better" - Default DownloadDirZstdParamsCompressionLevel = "default" - Fastest DownloadDirZstdParamsCompressionLevel = "fastest" -) - -// Valid indicates whether the value is a known member of the DownloadDirZstdParamsCompressionLevel enum. -func (e DownloadDirZstdParamsCompressionLevel) Valid() bool { - switch e { - case Best: - return true - case Better: - return true - case Default: - return true - case Fastest: - return true - default: - return false - } -} - -// Defines values for LogsStreamParamsSource. -const ( - Path LogsStreamParamsSource = "path" - Supervisor LogsStreamParamsSource = "supervisor" -) - -// Valid indicates whether the value is a known member of the LogsStreamParamsSource enum. -func (e LogsStreamParamsSource) Valid() bool { - switch e { - case Path: - return true - case Supervisor: - return true - default: - return false - } -} - -// Defines values for StreamTelemetryEventsParamsReplay. -const ( - All StreamTelemetryEventsParamsReplay = "all" -) - -// Valid indicates whether the value is a known member of the StreamTelemetryEventsParamsReplay enum. -func (e StreamTelemetryEventsParamsReplay) Valid() bool { - switch e { - case All: - return true - default: - return false - } -} - -// BatchComputerActionRequest A batch of computer actions to execute sequentially. -type BatchComputerActionRequest struct { - // Actions Ordered list of actions to execute. Execution stops on the first error. - Actions []ComputerAction `json:"actions"` -} - -// BrowserApiCallEvent A call that drives the browser, handled by the kernel-images-api server: computer-control actions, Playwright code execution, screenshots and clipboard access. Calls that manage the VM instead emit `platform_api_call`. -type BrowserApiCallEvent struct { - Category BrowserApiCallEventCategory `json:"category"` - - // Data Per-call payload for `api_call` events. - Data *BrowserApiCallEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserApiCallEventType `json:"type"` -} - -// BrowserApiCallEventCategory defines model for BrowserApiCallEvent.Category. -type BrowserApiCallEventCategory string - -// BrowserApiCallEventType defines model for BrowserApiCallEvent.Type. -type BrowserApiCallEventType string - -// BrowserApiCallEventData Per-call payload for `api_call` events. -type BrowserApiCallEventData struct { - // Code Source submitted to `executePlaywrightCode`, capped at 8192 bytes like every other captured string. A capped value is cut on a character boundary and ends in `...[truncated]`. Absent for every other operation. - Code *string `json:"code,omitempty"` - - // DurationMs Wall-clock duration of the handler in milliseconds. - DurationMs float32 `json:"duration_ms"` - - // OperationId Matched route's operation, named as the server names its handler (e.g. `TakeScreenshot`, `ExecutePlaywrightCode`). - OperationId string `json:"operation_id"` - - // RequestId Per-request identifier from the kernel-images-api request middleware. - RequestId string `json:"request_id"` - - // Status HTTP response status code. - Status int `json:"status"` -} - -// BrowserCallStack CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. -type BrowserCallStack struct { - // CallFrames Ordered list of call frames, outermost first. - CallFrames []struct { - // ColumnNumber Zero-based column number within the line. - ColumnNumber int `json:"columnNumber"` - - // FunctionName JavaScript function name, or empty string for anonymous functions. - FunctionName string `json:"functionName"` - - // LineNumber Zero-based line number within the script. - LineNumber int `json:"lineNumber"` - - // ScriptId CDP script identifier. - ScriptId string `json:"scriptId"` - - // Url URL or name of the script file. - Url string `json:"url"` - } `json:"callFrames"` - - // Description Optional label for the stack trace (e.g. async cause). - Description *string `json:"description,omitempty"` - - // Parent Parent stack trace for async stacks. - Parent *BrowserCallStack `json:"parent,omitempty"` -} - -// BrowserCaptchaSolveResultEvent A captcha solve attempt reached a terminal outcome. -type BrowserCaptchaSolveResultEvent struct { - Category BrowserCaptchaSolveResultEventCategory `json:"category"` - - // Data Per-attempt payload for `captcha_solve_result` events. - Data *BrowserCaptchaSolveResultEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserCaptchaSolveResultEventType `json:"type"` -} - -// BrowserCaptchaSolveResultEventCategory defines model for BrowserCaptchaSolveResultEvent.Category. -type BrowserCaptchaSolveResultEventCategory string - -// BrowserCaptchaSolveResultEventType defines model for BrowserCaptchaSolveResultEvent.Type. -type BrowserCaptchaSolveResultEventType string - -// BrowserCaptchaSolveResultEventData Per-attempt payload for `captcha_solve_result` events. -type BrowserCaptchaSolveResultEventData struct { - // CaptchaType Captcha vendor family. Producers normalize provider-specific task names into this set: enterprise variants of recaptcha collapse into their version bucket (v2 / v3), and anything not covered (e.g. DataDome, MtCaptcha, plain OCR) is reported as `other`. - CaptchaType BrowserCaptchaSolveResultEventDataCaptchaType `json:"captcha_type"` - - // DurationMs Wall-clock duration from solve start to terminal outcome. - DurationMs float32 `json:"duration_ms"` - - // ErrorCode Solver-specific error code on failure (e.g. `ERROR_CAPTCHA_UNSOLVABLE`). Absent on success. - ErrorCode *string `json:"error_code,omitempty"` - - // Status Terminal outcome. `success`: solver returned a usable solution. `failure`: solver returned an error (see `error_code`). `timeout`: solver did not return within the caller's wait budget. `abandoned`: caller cancelled or the page navigated away mid-solve. - Status BrowserCaptchaSolveResultEventDataStatus `json:"status"` - - // TaskId Solver-assigned identifier. Opaque, useful for support cross-references. - TaskId *string `json:"task_id,omitempty"` - - // WebsiteHost Host of the page where the captcha was solved. - WebsiteHost *string `json:"website_host,omitempty"` - - // WebsitePath Path of the page where the captcha was solved. Query string excluded. - WebsitePath *string `json:"website_path,omitempty"` -} - -// BrowserCaptchaSolveResultEventDataCaptchaType Captcha vendor family. Producers normalize provider-specific task names into this set: enterprise variants of recaptcha collapse into their version bucket (v2 / v3), and anything not covered (e.g. DataDome, MtCaptcha, plain OCR) is reported as `other`. -type BrowserCaptchaSolveResultEventDataCaptchaType string - -// BrowserCaptchaSolveResultEventDataStatus Terminal outcome. `success`: solver returned a usable solution. `failure`: solver returned an error (see `error_code`). `timeout`: solver did not return within the caller's wait budget. `abandoned`: caller cancelled or the page navigated away mid-solve. -type BrowserCaptchaSolveResultEventDataStatus string - -// BrowserCdpAutofillMode Which kind of value autofill filled. Canonical values from devtools-protocol@2d019e73. -type BrowserCdpAutofillMode string - -// BrowserCdpAutofillTriggerCommandData Sanitized `Autofill.trigger` arguments. Canonical input: `Autofill.trigger` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpAutofillTriggerCommandData struct { - // AddressFieldCount Number of address fields the command filled. Their names and values are never captured. - AddressFieldCount *int `json:"address_field_count,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // FieldId Opaque backend node identifier of the field that was autofilled. - FieldId int `json:"field_id"` - - // FrameId Opaque frame identifier. Clipped to 128 characters; a longer value is not a real identifier. - FrameId *string `json:"frame_id,omitempty"` - Method BrowserCdpAutofillTriggerCommandDataMethod `json:"method"` - - // Mode What was filled: `card` or `address`. The values themselves are never captured. - Mode *BrowserCdpAutofillMode `json:"mode,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpAutofillTriggerCommandDataMethod defines model for BrowserCdpAutofillTriggerCommandData.Method. -type BrowserCdpAutofillTriggerCommandDataMethod string - -// BrowserCdpBrowserCancelDownloadCommandData Sanitized `Browser.cancelDownload` arguments. Canonical input: `Browser.cancelDownload` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpBrowserCancelDownloadCommandData struct { - // BrowserContextId Opaque browser context identifier. Clipped to 128 characters; a longer value is not a real identifier. - BrowserContextId *string `json:"browser_context_id,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // DownloadGuid Opaque identifier of the download that was cancelled. Clipped to 128 characters; a longer value is not a real identifier. - DownloadGuid string `json:"download_guid"` - Method BrowserCdpBrowserCancelDownloadCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpBrowserCancelDownloadCommandDataMethod defines model for BrowserCdpBrowserCancelDownloadCommandData.Method. -type BrowserCdpBrowserCancelDownloadCommandDataMethod string - -// BrowserCdpBrowserCloseCommandData Sanitized `Browser.close` arguments. Canonical input: `Browser.close` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpBrowserCloseCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpBrowserCloseCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpBrowserCloseCommandDataMethod defines model for BrowserCdpBrowserCloseCommandData.Method. -type BrowserCdpBrowserCloseCommandDataMethod string - -// BrowserCdpBrowserSetContentsSizeCommandData Sanitized `Browser.setContentsSize` arguments. Canonical input: `Browser.setContentsSize` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpBrowserSetContentsSizeCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // Height Contents height in DIP. - Height *int `json:"height,omitempty"` - Method BrowserCdpBrowserSetContentsSizeCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // Width Contents width in DIP. - Width *int `json:"width,omitempty"` - - // WindowId Browser window identifier. - WindowId int `json:"window_id"` -} - -// BrowserCdpBrowserSetContentsSizeCommandDataMethod defines model for BrowserCdpBrowserSetContentsSizeCommandData.Method. -type BrowserCdpBrowserSetContentsSizeCommandDataMethod string - -// BrowserCdpBrowserSetWindowBoundsCommandData Sanitized `Browser.setWindowBounds` arguments. Canonical input: `Browser.setWindowBounds` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpBrowserSetWindowBoundsCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // Height Window height in DIP. - Height *int `json:"height,omitempty"` - - // Left Window x position in screen coordinates. - Left *int `json:"left,omitempty"` - Method BrowserCdpBrowserSetWindowBoundsCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // Top Window y position in screen coordinates. - Top *int `json:"top,omitempty"` - - // Width Window width in DIP. - Width *int `json:"width,omitempty"` - - // WindowId Browser window identifier. - WindowId int `json:"window_id"` - - // WindowState Window state requested (`normal`, `minimized`, `maximized`, `fullscreen`). A value the protocol does not define is reported as `other`. - WindowState *BrowserCdpWindowState `json:"window_state,omitempty"` -} - -// BrowserCdpBrowserSetWindowBoundsCommandDataMethod defines model for BrowserCdpBrowserSetWindowBoundsCommandData.Method. -type BrowserCdpBrowserSetWindowBoundsCommandDataMethod string - -// BrowserCdpCommandEvent A browser-control command a client sent over the CDP WebSocket proxy: input gestures, navigation, dialog handling, file selection and screenshots. Configuration commands and the DOM/Runtime traffic a client library issues on the caller's behalf are not reported. -// One event per browser-control command that reached the browser. The command stream is not sampled, coalesced or reordered. An event is lost only when the method is excluded by telemetry configuration, when the command's arguments do not decode, or when classification cannot keep up. Exclusions are counted in `cdp_disconnect.telemetry_excluded`; the rest in `cdp_disconnect.telemetry_dropped`. -type BrowserCdpCommandEvent struct { - Category BrowserCdpCommandEventCategory `json:"category"` - - // Data Per-command payload for `cdp_command` events, discriminated by `method`. Each variant carries only the arguments approved for that command: values that could hold a secret — typed and composition text, URLs, referrers, scripts, templates, file paths, drag contents and autofill values — are replaced by a length, a count, a presence flag, an enum or a URL scheme and host. - Data BrowserCdpCommandEventData `json:"data"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserCdpCommandEventType `json:"type"` -} - -// BrowserCdpCommandEventCategory defines model for BrowserCdpCommandEvent.Category. -type BrowserCdpCommandEventCategory string - -// BrowserCdpCommandEventType defines model for BrowserCdpCommandEvent.Type. -type BrowserCdpCommandEventType string - -// BrowserCdpCommandEventData Per-command payload for `cdp_command` events, discriminated by `method`. Each variant carries only the arguments approved for that command: values that could hold a secret — typed and composition text, URLs, referrers, scripts, templates, file paths, drag contents and autofill values — are replaced by a length, a count, a presence flag, an enum or a URL scheme and host. -type BrowserCdpCommandEventData struct { - union json.RawMessage -} - -// BrowserCdpCommandMethod A browser-control CDP method the proxy reports. The set covers the commands an agent drives the browser with; configuration, DOM and Runtime bookkeeping, and Chrome-specific UI commands are outside it. Canonical definitions: devtools-protocol@2d019e73. -type BrowserCdpCommandMethod string - -// BrowserCdpConnectEvent An external client (e.g. customer SDK, Playwright, Puppeteer) connected to the CDP WebSocket proxy on this VM. -type BrowserCdpConnectEvent struct { - Category BrowserCdpConnectEventCategory `json:"category"` - - // Data Per-connection payload for `cdp_connect` events. - Data *BrowserCdpConnectEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserCdpConnectEventType `json:"type"` -} - -// BrowserCdpConnectEventCategory defines model for BrowserCdpConnectEvent.Category. -type BrowserCdpConnectEventCategory string - -// BrowserCdpConnectEventType defines model for BrowserCdpConnectEvent.Type. -type BrowserCdpConnectEventType string - -// BrowserCdpConnectEventData Per-connection payload for `cdp_connect` events. -type BrowserCdpConnectEventData struct { - // ConnectionId Identifies this CDP proxy connection, matching the `connection_id` on the `cdp_command` events that arrived on it. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` -} - -// BrowserCdpDisconnectEvent An external client disconnected from the CDP WebSocket proxy on this VM. Pair with the immediately preceding `cdp_connect` on the same stream. -type BrowserCdpDisconnectEvent struct { - Category BrowserCdpDisconnectEventCategory `json:"category"` - - // Data Per-disconnect payload for `cdp_disconnect` events. - Data *BrowserCdpDisconnectEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserCdpDisconnectEventType `json:"type"` -} - -// BrowserCdpDisconnectEventCategory defines model for BrowserCdpDisconnectEvent.Category. -type BrowserCdpDisconnectEventCategory string - -// BrowserCdpDisconnectEventType defines model for BrowserCdpDisconnectEvent.Type. -type BrowserCdpDisconnectEventType string - -// BrowserCdpDisconnectEventData Per-disconnect payload for `cdp_disconnect` events. -type BrowserCdpDisconnectEventData struct { - // ConnectionId Identifies this CDP proxy connection, matching the `connection_id` on the `cdp_command` events that arrived on it. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // DurationMs Wall-clock duration of the connection in milliseconds. - DurationMs float32 `json:"duration_ms"` - - // MessageCount Number of CDP messages relayed across the connection in either direction. - MessageCount int `json:"message_count"` - - // Reason Why the connection ended. `client_close`: the client initiated the close. `upstream_changed`: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. `upstream_error`: upstream dial or message pump errored. `context_cancelled`: the request context was cancelled (typically server shutdown). - Reason BrowserCdpDisconnectEventDataReason `json:"reason"` - - // TelemetryDropped Number of supported browser-control commands that were forwarded to the browser but never classified, because the queue was full or classification panicked. Every increment is a real lost command — unsupported and excluded methods are filtered before admission and never count toward this total. Telemetry loss only; every command was still relayed to the browser. Always present on images that report it; absent on images predating the field, which is not the same as zero. - TelemetryDropped *int `json:"telemetry_dropped,omitempty"` - - // TelemetryExcluded Number of forwarded client commands that produced no `cdp_command` event because their method is listed in `control.cdp.excluded_methods`. Configuration rather than loss, so it is counted apart from `telemetry_dropped`. - TelemetryExcluded *int `json:"telemetry_excluded,omitempty"` -} - -// BrowserCdpDisconnectEventDataReason Why the connection ended. `client_close`: the client initiated the close. `upstream_changed`: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. `upstream_error`: upstream dial or message pump errored. `context_cancelled`: the request context was cancelled (typically server shutdown). -type BrowserCdpDisconnectEventDataReason string - -// BrowserCdpDomFocusCommandData Sanitized `DOM.focus` arguments. Canonical input: `DOM.focus` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpDomFocusCommandData struct { - // BackendNodeId Opaque backend DOM node identifier the command targeted. - BackendNodeId *int `json:"backend_node_id,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpDomFocusCommandDataMethod `json:"method"` - - // NodeId Opaque DOM node identifier the command targeted. - NodeId *int `json:"node_id,omitempty"` - - // ObjectId Opaque Runtime remote object identifier the command targeted. Clipped to 128 characters; a longer value is not a real identifier. - ObjectId *string `json:"object_id,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpDomFocusCommandDataMethod defines model for BrowserCdpDomFocusCommandData.Method. -type BrowserCdpDomFocusCommandDataMethod string - -// BrowserCdpDomScrollIntoViewIfNeededCommandData Sanitized `DOM.scrollIntoViewIfNeeded` arguments. Canonical input: `DOM.scrollIntoViewIfNeeded` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpDomScrollIntoViewIfNeededCommandData struct { - // BackendNodeId Opaque backend DOM node identifier the command targeted. - BackendNodeId *int `json:"backend_node_id,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod `json:"method"` - - // NodeId Opaque DOM node identifier the command targeted. - NodeId *int `json:"node_id,omitempty"` - - // ObjectId Opaque Runtime remote object identifier the command targeted. Clipped to 128 characters; a longer value is not a real identifier. - ObjectId *string `json:"object_id,omitempty"` - - // RectHeight Height of the rect the command scrolled to. - RectHeight *float64 `json:"rect_height,omitempty"` - - // RectWidth Width of the rect the command scrolled to. - RectWidth *float64 `json:"rect_width,omitempty"` - - // RectX X offset of the rect the command scrolled to, relative to the node. - RectX *float64 `json:"rect_x,omitempty"` - - // RectY Y offset of the rect the command scrolled to, relative to the node. - RectY *float64 `json:"rect_y,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod defines model for BrowserCdpDomScrollIntoViewIfNeededCommandData.Method. -type BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod string - -// BrowserCdpDomSetFileInputFilesCommandData Sanitized `DOM.setFileInputFiles` arguments. Canonical input: `DOM.setFileInputFiles` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpDomSetFileInputFilesCommandData struct { - // BackendNodeId Opaque backend DOM node identifier the command targeted. - BackendNodeId *int `json:"backend_node_id,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // FileCount Number of files handed to the input. File paths are never captured. - FileCount int `json:"file_count"` - Method BrowserCdpDomSetFileInputFilesCommandDataMethod `json:"method"` - - // NodeId Opaque DOM node identifier the command targeted. - NodeId *int `json:"node_id,omitempty"` - - // ObjectId Opaque Runtime remote object identifier the command targeted. Clipped to 128 characters; a longer value is not a real identifier. - ObjectId *string `json:"object_id,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpDomSetFileInputFilesCommandDataMethod defines model for BrowserCdpDomSetFileInputFilesCommandData.Method. -type BrowserCdpDomSetFileInputFilesCommandDataMethod string - -// BrowserCdpDragEventType Drag event phase. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpDragEventType string - -// BrowserCdpDragMimeCategory Top-level MIME category of a drag item, from the IANA registry rather than the protocol; a drag item's subtype names the file, so only the category is reported. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpDragMimeCategory string - -// BrowserCdpGestureSourceType Input source a synthesized gesture emulates. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpGestureSourceType string - -// BrowserCdpInputCancelDraggingCommandData Sanitized `Input.cancelDragging` arguments. Canonical input: `Input.cancelDragging` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputCancelDraggingCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpInputCancelDraggingCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpInputCancelDraggingCommandDataMethod defines model for BrowserCdpInputCancelDraggingCommandData.Method. -type BrowserCdpInputCancelDraggingCommandDataMethod string - -// BrowserCdpInputDispatchDragEventCommandData Sanitized `Input.dispatchDragEvent` arguments. Canonical input: `Input.dispatchDragEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputDispatchDragEventCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // DragFileCount Number of files in the drag payload. File paths are never captured. - DragFileCount *int `json:"drag_file_count,omitempty"` - - // DragItemCount Number of items in the drag payload. Item contents are never captured. - DragItemCount *int `json:"drag_item_count,omitempty"` - - // DragMimeCategories Distinct top-level MIME categories of the drag items (e.g. `text`, `image`, `application`). Subtypes and contents are never captured. A value the protocol does not define is reported as `other`. - DragMimeCategories *[]BrowserCdpDragMimeCategory `json:"drag_mime_categories,omitempty"` - - // DragOperationsMask Bit field of allowed drag operations (1=copy, 2=link, 16=move). - DragOperationsMask *int `json:"drag_operations_mask,omitempty"` - - // EventType Drag event phase: `dragEnter`, `dragOver`, `drop` or `dragCancel`. A value the protocol does not define is reported as `other`. - EventType BrowserCdpDragEventType `json:"event_type"` - Method BrowserCdpInputDispatchDragEventCommandDataMethod `json:"method"` - - // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). - Modifiers *int `json:"modifiers,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // X Viewport x coordinate in CSS pixels. - X *float64 `json:"x,omitempty"` - - // Y Viewport y coordinate in CSS pixels. - Y *float64 `json:"y,omitempty"` -} - -// BrowserCdpInputDispatchDragEventCommandDataMethod defines model for BrowserCdpInputDispatchDragEventCommandData.Method. -type BrowserCdpInputDispatchDragEventCommandDataMethod string - -// BrowserCdpInputDispatchKeyEventCommandData Sanitized `Input.dispatchKeyEvent` arguments. Canonical input: `Input.dispatchKeyEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputDispatchKeyEventCommandData struct { - // AutoRepeat Whether the event was generated by key repeat. - AutoRepeat *bool `json:"auto_repeat,omitempty"` - - // CommandCount Number of editing commands (e.g. `selectAll`) carried by the event. - CommandCount *int `json:"command_count,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // EventType Key event phase: `keyDown`, `keyUp`, `rawKeyDown` or `char`. A value the protocol does not define is reported as `other`. - EventType BrowserCdpKeyEventType `json:"event_type"` - - // IsKeypad Whether the key is on the numeric keypad. - IsKeypad *bool `json:"is_keypad,omitempty"` - - // IsSystemKey Whether the event is a system key event. - IsSystemKey *bool `json:"is_system_key,omitempty"` - - // Location Keyboard location (1=left, 2=right, 3=numpad). - Location *int `json:"location,omitempty"` - Method BrowserCdpInputDispatchKeyEventCommandDataMethod `json:"method"` - - // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). - Modifiers *int `json:"modifiers,omitempty"` - - // NamedKey Key that commands the page rather than typing into it (e.g. `Enter`, `Tab`, `ArrowDown`, `F5`). Keys that produce a character are never captured; those are counted by `text_length`. - NamedKey *string `json:"named_key,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TextLength Number of characters the command submitted. The text itself is never captured. - TextLength *int `json:"text_length,omitempty"` -} - -// BrowserCdpInputDispatchKeyEventCommandDataMethod defines model for BrowserCdpInputDispatchKeyEventCommandData.Method. -type BrowserCdpInputDispatchKeyEventCommandDataMethod string - -// BrowserCdpInputDispatchMouseEventCommandData Sanitized `Input.dispatchMouseEvent` arguments. Canonical input: `Input.dispatchMouseEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputDispatchMouseEventCommandData struct { - // Button Button named by the command (`none`, `left`, `middle`, `right`, `back`, `forward`). A value the protocol does not define is reported as `other`. - Button *BrowserCdpMouseButton `json:"button,omitempty"` - - // Buttons Bit field of buttons held down. Non-zero on a `mouseMoved` means the move is a drag path. - Buttons *int `json:"buttons,omitempty"` - - // ClickCount Number of times the button was clicked (2 is a double click). - ClickCount *int `json:"click_count,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // DeltaX Horizontal scroll delta, for `mouseWheel`. - DeltaX *float64 `json:"delta_x,omitempty"` - - // DeltaY Vertical scroll delta, for `mouseWheel`. - DeltaY *float64 `json:"delta_y,omitempty"` - - // EventType Mouse event phase: `mousePressed`, `mouseReleased`, `mouseMoved` or `mouseWheel`. A value the protocol does not define is reported as `other`. - EventType BrowserCdpMouseEventType `json:"event_type"` - - // Force Normalized pressure, 0 to 1. - Force *float64 `json:"force,omitempty"` - Method BrowserCdpInputDispatchMouseEventCommandDataMethod `json:"method"` - - // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). - Modifiers *int `json:"modifiers,omitempty"` - - // PointerType Pointer that generated the event (`mouse` or `pen`). A value the protocol does not define is reported as `other`. - PointerType *BrowserCdpPointerType `json:"pointer_type,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TangentialPressure Normalized tangential pressure, -1 to 1. - TangentialPressure *float64 `json:"tangential_pressure,omitempty"` - - // TiltX Pen tilt from the Y-Z plane, in degrees. - TiltX *float64 `json:"tilt_x,omitempty"` - - // TiltY Pen tilt from the X-Z plane, in degrees. - TiltY *float64 `json:"tilt_y,omitempty"` - - // Twist Pen clockwise rotation, in degrees. - Twist *int `json:"twist,omitempty"` - - // X Viewport x coordinate in CSS pixels. - X *float64 `json:"x,omitempty"` - - // Y Viewport y coordinate in CSS pixels. - Y *float64 `json:"y,omitempty"` -} - -// BrowserCdpInputDispatchMouseEventCommandDataMethod defines model for BrowserCdpInputDispatchMouseEventCommandData.Method. -type BrowserCdpInputDispatchMouseEventCommandDataMethod string - -// BrowserCdpInputDispatchTouchEventCommandData Sanitized `Input.dispatchTouchEvent` arguments. Canonical input: `Input.dispatchTouchEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputDispatchTouchEventCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // EventType Touch event phase: `touchStart`, `touchEnd`, `touchMove` or `touchCancel`. A value the protocol does not define is reported as `other`. - EventType BrowserCdpTouchEventType `json:"event_type"` - - // Force Normalized pressure of the first touch point, 0 to 1. - Force *float64 `json:"force,omitempty"` - Method BrowserCdpInputDispatchTouchEventCommandDataMethod `json:"method"` - - // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). - Modifiers *int `json:"modifiers,omitempty"` - - // RadiusX Horizontal radius of the first touch point. - RadiusX *float64 `json:"radius_x,omitempty"` - - // RadiusY Vertical radius of the first touch point. - RadiusY *float64 `json:"radius_y,omitempty"` - - // RotationAngle Rotation of the first touch point, in degrees. - RotationAngle *float64 `json:"rotation_angle,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TangentialPressure Normalized tangential pressure of the first touch point, -1 to 1. - TangentialPressure *float64 `json:"tangential_pressure,omitempty"` - - // TiltX Tilt of the first touch point from the Y-Z plane, in degrees. - TiltX *float64 `json:"tilt_x,omitempty"` - - // TiltY Tilt of the first touch point from the X-Z plane, in degrees. - TiltY *float64 `json:"tilt_y,omitempty"` - - // TouchPointCount Number of active touch points the command carried. - TouchPointCount int `json:"touch_point_count"` - - // Twist Clockwise rotation of the first touch point, in degrees. - Twist *int `json:"twist,omitempty"` - - // X Viewport x coordinate of the first touch point. Touch coordinates live inside `touchPoints`, so this is the primary point rather than a command-level argument. - X *float64 `json:"x,omitempty"` - - // Y Viewport y coordinate of the first touch point. - Y *float64 `json:"y,omitempty"` -} - -// BrowserCdpInputDispatchTouchEventCommandDataMethod defines model for BrowserCdpInputDispatchTouchEventCommandData.Method. -type BrowserCdpInputDispatchTouchEventCommandDataMethod string - -// BrowserCdpInputEmulateTouchFromMouseEventCommandData Sanitized `Input.emulateTouchFromMouseEvent` arguments. Canonical input: `Input.emulateTouchFromMouseEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputEmulateTouchFromMouseEventCommandData struct { - // Button Button named by the command. A value the protocol does not define is reported as `other`. - Button *BrowserCdpMouseButton `json:"button,omitempty"` - - // ClickCount Number of times the button was clicked. - ClickCount *int `json:"click_count,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // DeltaX Horizontal scroll delta. - DeltaX *float64 `json:"delta_x,omitempty"` - - // DeltaY Vertical scroll delta. - DeltaY *float64 `json:"delta_y,omitempty"` - - // EventType Mouse event phase being emulated as touch. A value the protocol does not define is reported as `other`. - EventType BrowserCdpMouseEventType `json:"event_type"` - Method BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod `json:"method"` - - // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). - Modifiers *int `json:"modifiers,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // X Viewport x coordinate in CSS pixels. - X *float64 `json:"x,omitempty"` - - // Y Viewport y coordinate in CSS pixels. - Y *float64 `json:"y,omitempty"` -} - -// BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod defines model for BrowserCdpInputEmulateTouchFromMouseEventCommandData.Method. -type BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod string - -// BrowserCdpInputImeSetCompositionCommandData Sanitized `Input.imeSetComposition` arguments. Canonical input: `Input.imeSetComposition` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputImeSetCompositionCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpInputImeSetCompositionCommandDataMethod `json:"method"` - - // ReplacementEnd Replacement range end offset. - ReplacementEnd *int `json:"replacement_end,omitempty"` - - // ReplacementStart Replacement range start offset. - ReplacementStart *int `json:"replacement_start,omitempty"` - - // SelectionEnd Selection end offset within the composition. - SelectionEnd *int `json:"selection_end,omitempty"` - - // SelectionStart Selection start offset within the composition. - SelectionStart *int `json:"selection_start,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TextLength Number of characters in the composition. The text itself is never captured. - TextLength int `json:"text_length"` -} - -// BrowserCdpInputImeSetCompositionCommandDataMethod defines model for BrowserCdpInputImeSetCompositionCommandData.Method. -type BrowserCdpInputImeSetCompositionCommandDataMethod string - -// BrowserCdpInputInsertTextCommandData Sanitized `Input.insertText` arguments. Canonical input: `Input.insertText` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputInsertTextCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpInputInsertTextCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TextLength Number of characters inserted. The text itself is never captured. - TextLength int `json:"text_length"` -} - -// BrowserCdpInputInsertTextCommandDataMethod defines model for BrowserCdpInputInsertTextCommandData.Method. -type BrowserCdpInputInsertTextCommandDataMethod string - -// BrowserCdpInputSynthesizePinchGestureCommandData Sanitized `Input.synthesizePinchGesture` arguments. Canonical input: `Input.synthesizePinchGesture` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputSynthesizePinchGestureCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // GestureSourceType Input source the synthesized gesture emulates. A value the protocol does not define is reported as `other`. - GestureSourceType *BrowserCdpGestureSourceType `json:"gesture_source_type,omitempty"` - Method BrowserCdpInputSynthesizePinchGestureCommandDataMethod `json:"method"` - - // RelativeSpeed Relative pointer speed, in pixels per second. - RelativeSpeed *int `json:"relative_speed,omitempty"` - - // ScaleFactor Relative scale of the pinch (>1 zooms in). - ScaleFactor *float64 `json:"scale_factor,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // X Viewport x coordinate in CSS pixels. - X *float64 `json:"x,omitempty"` - - // Y Viewport y coordinate in CSS pixels. - Y *float64 `json:"y,omitempty"` -} - -// BrowserCdpInputSynthesizePinchGestureCommandDataMethod defines model for BrowserCdpInputSynthesizePinchGestureCommandData.Method. -type BrowserCdpInputSynthesizePinchGestureCommandDataMethod string - -// BrowserCdpInputSynthesizeScrollGestureCommandData Sanitized `Input.synthesizeScrollGesture` arguments. Canonical input: `Input.synthesizeScrollGesture` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputSynthesizeScrollGestureCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // GestureSourceType Input source the synthesized gesture emulates. A value the protocol does not define is reported as `other`. - GestureSourceType *BrowserCdpGestureSourceType `json:"gesture_source_type,omitempty"` - Method BrowserCdpInputSynthesizeScrollGestureCommandDataMethod `json:"method"` - - // PreventFling Whether fling was suppressed. - PreventFling *bool `json:"prevent_fling,omitempty"` - - // RepeatCount Number of additional repeats of the scroll. - RepeatCount *int `json:"repeat_count,omitempty"` - - // RepeatDelayMs Delay between repeats, in milliseconds. - RepeatDelayMs *int `json:"repeat_delay_ms,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // Speed Swipe speed in pixels per second. - Speed *int `json:"speed,omitempty"` - - // X Viewport x coordinate in CSS pixels. - X *float64 `json:"x,omitempty"` - - // XDistance Horizontal scroll distance in CSS pixels; positive scrolls left. - XDistance *float64 `json:"x_distance,omitempty"` - - // XOverscroll Additional horizontal distance scrolled past the end. - XOverscroll *float64 `json:"x_overscroll,omitempty"` - - // Y Viewport y coordinate in CSS pixels. - Y *float64 `json:"y,omitempty"` - - // YDistance Vertical scroll distance in CSS pixels; positive scrolls up. - YDistance *float64 `json:"y_distance,omitempty"` - - // YOverscroll Additional vertical distance scrolled past the end. - YOverscroll *float64 `json:"y_overscroll,omitempty"` -} - -// BrowserCdpInputSynthesizeScrollGestureCommandDataMethod defines model for BrowserCdpInputSynthesizeScrollGestureCommandData.Method. -type BrowserCdpInputSynthesizeScrollGestureCommandDataMethod string - -// BrowserCdpInputSynthesizeTapGestureCommandData Sanitized `Input.synthesizeTapGesture` arguments. Canonical input: `Input.synthesizeTapGesture` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpInputSynthesizeTapGestureCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // Duration Duration between touchdown and touchup, in milliseconds. - Duration *int `json:"duration,omitempty"` - - // GestureSourceType Input source the synthesized gesture emulates. A value the protocol does not define is reported as `other`. - GestureSourceType *BrowserCdpGestureSourceType `json:"gesture_source_type,omitempty"` - Method BrowserCdpInputSynthesizeTapGestureCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TapCount Number of times to tap (2 is a double tap). - TapCount *int `json:"tap_count,omitempty"` - - // X Viewport x coordinate in CSS pixels. - X *float64 `json:"x,omitempty"` - - // Y Viewport y coordinate in CSS pixels. - Y *float64 `json:"y,omitempty"` -} - -// BrowserCdpInputSynthesizeTapGestureCommandDataMethod defines model for BrowserCdpInputSynthesizeTapGestureCommandData.Method. -type BrowserCdpInputSynthesizeTapGestureCommandDataMethod string - -// BrowserCdpKeyEventType Key event phase. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpKeyEventType string - -// BrowserCdpMouseButton Mouse button named by a command. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpMouseButton string - -// BrowserCdpMouseEventType Mouse event phase. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpMouseEventType string - -// BrowserCdpPageBringToFrontCommandData Sanitized `Page.bringToFront` arguments. Canonical input: `Page.bringToFront` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageBringToFrontCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpPageBringToFrontCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageBringToFrontCommandDataMethod defines model for BrowserCdpPageBringToFrontCommandData.Method. -type BrowserCdpPageBringToFrontCommandDataMethod string - -// BrowserCdpPageCaptureScreenshotCommandData Sanitized `Page.captureScreenshot` arguments. Canonical input: `Page.captureScreenshot` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageCaptureScreenshotCommandData struct { - // CaptureBeyondViewport Whether the capture extended past the viewport. - CaptureBeyondViewport *bool `json:"capture_beyond_viewport,omitempty"` - - // ClipHeight Clip region height in CSS pixels. - ClipHeight *float64 `json:"clip_height,omitempty"` - - // ClipScale Clip region page scale factor. - ClipScale *float64 `json:"clip_scale,omitempty"` - - // ClipWidth Clip region width in CSS pixels. - ClipWidth *float64 `json:"clip_width,omitempty"` - - // ClipX Clip region x offset in CSS pixels. - ClipX *float64 `json:"clip_x,omitempty"` - - // ClipY Clip region y offset in CSS pixels. - ClipY *float64 `json:"clip_y,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // Format Image format requested (`jpeg`, `png` or `webp`). A value the protocol does not define is reported as `other`. - Format *BrowserCdpScreenshotFormat `json:"format,omitempty"` - - // FromSurface Whether the capture was taken from the surface rather than the view. - FromSurface *bool `json:"from_surface,omitempty"` - Method BrowserCdpPageCaptureScreenshotCommandDataMethod `json:"method"` - - // OptimizeForSpeed Whether encoding favored speed over size. - OptimizeForSpeed *bool `json:"optimize_for_speed,omitempty"` - - // Quality Compression quality, 0 to 100, for lossy formats. - Quality *int `json:"quality,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageCaptureScreenshotCommandDataMethod defines model for BrowserCdpPageCaptureScreenshotCommandData.Method. -type BrowserCdpPageCaptureScreenshotCommandDataMethod string - -// BrowserCdpPageCaptureSnapshotCommandData Sanitized `Page.captureSnapshot` arguments. Canonical input: `Page.captureSnapshot` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageCaptureSnapshotCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // Format Snapshot format requested (`mhtml`). A value the protocol does not define is reported as `other`. - Format *BrowserCdpSnapshotFormat `json:"format,omitempty"` - Method BrowserCdpPageCaptureSnapshotCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageCaptureSnapshotCommandDataMethod defines model for BrowserCdpPageCaptureSnapshotCommandData.Method. -type BrowserCdpPageCaptureSnapshotCommandDataMethod string - -// BrowserCdpPageCloseCommandData Sanitized `Page.close` arguments. Canonical input: `Page.close` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageCloseCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpPageCloseCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageCloseCommandDataMethod defines model for BrowserCdpPageCloseCommandData.Method. -type BrowserCdpPageCloseCommandDataMethod string - -// BrowserCdpPageHandleJavaScriptDialogCommandData Sanitized `Page.handleJavaScriptDialog` arguments. Canonical input: `Page.handleJavaScriptDialog` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageHandleJavaScriptDialogCommandData struct { - // Accept Whether the dialog was accepted or dismissed. - Accept bool `json:"accept"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpPageHandleJavaScriptDialogCommandDataMethod `json:"method"` - - // PromptTextLength Number of characters entered into a prompt dialog. The text itself is never captured. - PromptTextLength *int `json:"prompt_text_length,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageHandleJavaScriptDialogCommandDataMethod defines model for BrowserCdpPageHandleJavaScriptDialogCommandData.Method. -type BrowserCdpPageHandleJavaScriptDialogCommandDataMethod string - -// BrowserCdpPageNavigateCommandData Sanitized `Page.navigate` arguments. Canonical input: `Page.navigate` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageNavigateCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // FrameId Opaque frame identifier. Clipped to 128 characters; a longer value is not a real identifier. - FrameId *string `json:"frame_id,omitempty"` - Method BrowserCdpPageNavigateCommandDataMethod `json:"method"` - - // ReferrerPolicy Referrer policy named by the command. A value the protocol does not define is reported as `other`. - ReferrerPolicy *BrowserCdpReferrerPolicy `json:"referrer_policy,omitempty"` - - // ReferrerPresent Whether the command carried a referrer. The referrer itself is never captured. - ReferrerPresent *bool `json:"referrer_present,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TransitionType Navigation reason reported by the caller (e.g. `link`, `typed`, `reload`). A value the protocol does not define is reported as `other`. - TransitionType *BrowserCdpTransitionType `json:"transition_type,omitempty"` - - // UrlScheme Scheme of the destination URL (e.g. `https`, `about`, `data`). The rest of the URL is never captured. - UrlScheme *string `json:"url_scheme,omitempty"` -} - -// BrowserCdpPageNavigateCommandDataMethod defines model for BrowserCdpPageNavigateCommandData.Method. -type BrowserCdpPageNavigateCommandDataMethod string - -// BrowserCdpPageNavigateToHistoryEntryCommandData Sanitized `Page.navigateToHistoryEntry` arguments. Canonical input: `Page.navigateToHistoryEntry` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageNavigateToHistoryEntryCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // EntryId History entry the command navigated to. - EntryId int `json:"entry_id"` - Method BrowserCdpPageNavigateToHistoryEntryCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageNavigateToHistoryEntryCommandDataMethod defines model for BrowserCdpPageNavigateToHistoryEntryCommandData.Method. -type BrowserCdpPageNavigateToHistoryEntryCommandDataMethod string - -// BrowserCdpPagePrintToPdfCommandData Sanitized `Page.printToPDF` arguments. Canonical input: `Page.printToPDF` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPagePrintToPdfCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // DisplayHeaderFooter Whether a header and footer were rendered. - DisplayHeaderFooter *bool `json:"display_header_footer,omitempty"` - - // FooterTemplatePresent Whether a footer template was supplied. The template itself is never captured. - FooterTemplatePresent *bool `json:"footer_template_present,omitempty"` - - // GenerateDocumentOutline Whether a document outline was embedded. - GenerateDocumentOutline *bool `json:"generate_document_outline,omitempty"` - - // GenerateTaggedPdf Whether a tagged (accessible) PDF was requested. - GenerateTaggedPdf *bool `json:"generate_tagged_pdf,omitempty"` - - // HeaderTemplatePresent Whether a header template was supplied. The template itself is never captured. - HeaderTemplatePresent *bool `json:"header_template_present,omitempty"` - - // Landscape Whether the page was laid out in landscape. - Landscape *bool `json:"landscape,omitempty"` - - // MarginBottom Bottom margin in inches. - MarginBottom *float64 `json:"margin_bottom,omitempty"` - - // MarginLeft Left margin in inches. - MarginLeft *float64 `json:"margin_left,omitempty"` - - // MarginRight Right margin in inches. - MarginRight *float64 `json:"margin_right,omitempty"` - - // MarginTop Top margin in inches. - MarginTop *float64 `json:"margin_top,omitempty"` - Method BrowserCdpPagePrintToPdfCommandDataMethod `json:"method"` - - // PageRangesPresent Whether a page range was supplied. - PageRangesPresent *bool `json:"page_ranges_present,omitempty"` - - // PaperHeight Paper height in inches. - PaperHeight *float64 `json:"paper_height,omitempty"` - - // PaperWidth Paper width in inches. - PaperWidth *float64 `json:"paper_width,omitempty"` - - // PreferCssPageSize Whether the CSS page size was preferred over the paper size. - PreferCssPageSize *bool `json:"prefer_css_page_size,omitempty"` - - // PrintBackground Whether background graphics were printed. - PrintBackground *bool `json:"print_background,omitempty"` - - // Scale Page render scale. - Scale *float64 `json:"scale,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TransferMode How the PDF was returned (`ReturnAsBase64` or `ReturnAsStream`). A value the protocol does not define is reported as `other`. - TransferMode *BrowserCdpPdfTransferMode `json:"transfer_mode,omitempty"` -} - -// BrowserCdpPagePrintToPdfCommandDataMethod defines model for BrowserCdpPagePrintToPdfCommandData.Method. -type BrowserCdpPagePrintToPdfCommandDataMethod string - -// BrowserCdpPageReloadCommandData Sanitized `Page.reload` arguments. Canonical input: `Page.reload` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageReloadCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // IgnoreCache Whether the reload bypassed the cache. - IgnoreCache *bool `json:"ignore_cache,omitempty"` - - // LoaderId Opaque document loader identifier. Clipped to 128 characters; a longer value is not a real identifier. - LoaderId *string `json:"loader_id,omitempty"` - Method BrowserCdpPageReloadCommandDataMethod `json:"method"` - - // ScriptLength Number of characters in the injected script. - ScriptLength *int `json:"script_length,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageReloadCommandDataMethod defines model for BrowserCdpPageReloadCommandData.Method. -type BrowserCdpPageReloadCommandDataMethod string - -// BrowserCdpPageSetWebLifecycleStateCommandData Sanitized `Page.setWebLifecycleState` arguments. Canonical input: `Page.setWebLifecycleState` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageSetWebLifecycleStateCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpPageSetWebLifecycleStateCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // State Lifecycle state applied (`frozen` or `active`). A value the protocol does not define is reported as `other`. - State BrowserCdpWebLifecycleState `json:"state"` -} - -// BrowserCdpPageSetWebLifecycleStateCommandDataMethod defines model for BrowserCdpPageSetWebLifecycleStateCommandData.Method. -type BrowserCdpPageSetWebLifecycleStateCommandDataMethod string - -// BrowserCdpPageStartScreencastCommandData Sanitized `Page.startScreencast` arguments. Canonical input: `Page.startScreencast` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageStartScreencastCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // EveryNthFrame Frame sampling interval. - EveryNthFrame *int `json:"every_nth_frame,omitempty"` - - // Format Frame format requested (`jpeg` or `png`). A value the protocol does not define is reported as `other`. - Format *BrowserCdpScreencastFormat `json:"format,omitempty"` - - // MaxHeight Maximum frame height in pixels. - MaxHeight *int `json:"max_height,omitempty"` - - // MaxWidth Maximum frame width in pixels. - MaxWidth *int `json:"max_width,omitempty"` - Method BrowserCdpPageStartScreencastCommandDataMethod `json:"method"` - - // Quality Compression quality, 0 to 100. - Quality *int `json:"quality,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageStartScreencastCommandDataMethod defines model for BrowserCdpPageStartScreencastCommandData.Method. -type BrowserCdpPageStartScreencastCommandDataMethod string - -// BrowserCdpPageStopLoadingCommandData Sanitized `Page.stopLoading` arguments. Canonical input: `Page.stopLoading` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageStopLoadingCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpPageStopLoadingCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageStopLoadingCommandDataMethod defines model for BrowserCdpPageStopLoadingCommandData.Method. -type BrowserCdpPageStopLoadingCommandDataMethod string - -// BrowserCdpPageStopScreencastCommandData Sanitized `Page.stopScreencast` arguments. Canonical input: `Page.stopScreencast` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpPageStopScreencastCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpPageStopScreencastCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpPageStopScreencastCommandDataMethod defines model for BrowserCdpPageStopScreencastCommandData.Method. -type BrowserCdpPageStopScreencastCommandDataMethod string - -// BrowserCdpPdfTransferMode How a generated PDF is returned. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpPdfTransferMode string - -// BrowserCdpPointerType Pointer that generated an input event. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpPointerType string - -// BrowserCdpReferrerPolicy Referrer policy named by a navigation. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpReferrerPolicy string - -// BrowserCdpScreencastFormat Frame format requested for a screencast. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpScreencastFormat string - -// BrowserCdpScreenshotFormat Image format requested for a screenshot. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpScreenshotFormat string - -// BrowserCdpSnapshotFormat Format requested for a page snapshot. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpSnapshotFormat string - -// BrowserCdpTargetActivateTargetCommandData Sanitized `Target.activateTarget` arguments. Canonical input: `Target.activateTarget` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpTargetActivateTargetCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpTargetActivateTargetCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TargetId Opaque target identifier. Clipped to 128 characters; a longer value is not a real identifier. - TargetId string `json:"target_id"` -} - -// BrowserCdpTargetActivateTargetCommandDataMethod defines model for BrowserCdpTargetActivateTargetCommandData.Method. -type BrowserCdpTargetActivateTargetCommandDataMethod string - -// BrowserCdpTargetCloseTargetCommandData Sanitized `Target.closeTarget` arguments. Canonical input: `Target.closeTarget` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpTargetCloseTargetCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpTargetCloseTargetCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TargetId Opaque target identifier. Clipped to 128 characters; a longer value is not a real identifier. - TargetId string `json:"target_id"` -} - -// BrowserCdpTargetCloseTargetCommandDataMethod defines model for BrowserCdpTargetCloseTargetCommandData.Method. -type BrowserCdpTargetCloseTargetCommandDataMethod string - -// BrowserCdpTargetCreateBrowserContextCommandData Sanitized `Target.createBrowserContext` arguments. Canonical input: `Target.createBrowserContext` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpTargetCreateBrowserContextCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // DisposeOnDetach Whether the context is disposed when the debugging session detaches. - DisposeOnDetach *bool `json:"dispose_on_detach,omitempty"` - Method BrowserCdpTargetCreateBrowserContextCommandDataMethod `json:"method"` - - // ProxyBypassListPresent Whether a proxy bypass list was configured. - ProxyBypassListPresent *bool `json:"proxy_bypass_list_present,omitempty"` - - // ProxyServerPresent Whether a proxy was configured. The proxy address is never captured. - ProxyServerPresent *bool `json:"proxy_server_present,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // UniversalNetworkAccessOriginCount Number of origins granted universal network access. The origins themselves are never captured. - UniversalNetworkAccessOriginCount *int `json:"universal_network_access_origin_count,omitempty"` -} - -// BrowserCdpTargetCreateBrowserContextCommandDataMethod defines model for BrowserCdpTargetCreateBrowserContextCommandData.Method. -type BrowserCdpTargetCreateBrowserContextCommandDataMethod string - -// BrowserCdpTargetCreateTargetCommandData Sanitized `Target.createTarget` arguments. Canonical input: `Target.createTarget` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpTargetCreateTargetCommandData struct { - // Background Whether the target was created in the background. - Background *bool `json:"background,omitempty"` - - // BrowserContextId Opaque browser context identifier. Clipped to 128 characters; a longer value is not a real identifier. - BrowserContextId *string `json:"browser_context_id,omitempty"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - - // EnableBeginFrameControl Whether BeginFrame control was enabled (headless only). - EnableBeginFrameControl *bool `json:"enable_begin_frame_control,omitempty"` - - // Focus Whether the new target was focused. - Focus *bool `json:"focus,omitempty"` - - // ForTab Whether a tab target rather than a page target was created. - ForTab *bool `json:"for_tab,omitempty"` - - // Height Window height in DIP. - Height *int `json:"height,omitempty"` - - // Hidden Whether the target was created hidden. - Hidden *bool `json:"hidden,omitempty"` - - // Left Window x position in screen coordinates. - Left *int `json:"left,omitempty"` - Method BrowserCdpTargetCreateTargetCommandDataMethod `json:"method"` - - // NewWindow Whether a new window was requested. - NewWindow *bool `json:"new_window,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // Top Window y position in screen coordinates. - Top *int `json:"top,omitempty"` - - // UrlScheme Scheme of the destination URL (e.g. `https`, `about`, `data`). The rest of the URL is never captured. - UrlScheme *string `json:"url_scheme,omitempty"` - - // Width Window width in DIP. - Width *int `json:"width,omitempty"` - - // WindowState Window state requested (`normal`, `minimized`, `maximized`, `fullscreen`). A value the protocol does not define is reported as `other`. - WindowState *BrowserCdpWindowState `json:"window_state,omitempty"` -} - -// BrowserCdpTargetCreateTargetCommandDataMethod defines model for BrowserCdpTargetCreateTargetCommandData.Method. -type BrowserCdpTargetCreateTargetCommandDataMethod string - -// BrowserCdpTargetDisposeBrowserContextCommandData Sanitized `Target.disposeBrowserContext` arguments. Canonical input: `Target.disposeBrowserContext` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpTargetDisposeBrowserContextCommandData struct { - // BrowserContextId Opaque browser context identifier. Clipped to 128 characters; a longer value is not a real identifier. - BrowserContextId string `json:"browser_context_id"` - - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpTargetDisposeBrowserContextCommandDataMethod `json:"method"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` -} - -// BrowserCdpTargetDisposeBrowserContextCommandDataMethod defines model for BrowserCdpTargetDisposeBrowserContextCommandData.Method. -type BrowserCdpTargetDisposeBrowserContextCommandDataMethod string - -// BrowserCdpTargetOpenDevToolsCommandData Sanitized `Target.openDevTools` arguments. Canonical input: `Target.openDevTools` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. -type BrowserCdpTargetOpenDevToolsCommandData struct { - // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. - CommandId *int64 `json:"command_id,omitempty"` - - // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. - ConnectionId *string `json:"connection_id,omitempty"` - Method BrowserCdpTargetOpenDevToolsCommandDataMethod `json:"method"` - - // PanelId DevTools panel opened. Clipped to 128 characters; a longer value is not a real identifier. - PanelId *string `json:"panel_id,omitempty"` - - // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. - SessionId *string `json:"session_id,omitempty"` - - // TargetId Opaque target identifier. Clipped to 128 characters; a longer value is not a real identifier. - TargetId string `json:"target_id"` -} - -// BrowserCdpTargetOpenDevToolsCommandDataMethod defines model for BrowserCdpTargetOpenDevToolsCommandData.Method. -type BrowserCdpTargetOpenDevToolsCommandDataMethod string - -// BrowserCdpTouchEventType Touch event phase. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpTouchEventType string - -// BrowserCdpTransitionType Navigation reason reported by the caller. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpTransitionType string - -// BrowserCdpWebLifecycleState Page lifecycle state applied. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpWebLifecycleState string - -// BrowserCdpWindowState Browser window state requested. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. -type BrowserCdpWindowState string - -// BrowserConsoleErrorEvent A browser console error or uncaught JavaScript exception event. Emitted from two distinct CDP sources with different data shapes. Runtime.consoleAPICalled (console.error calls) produces level, text, args, and stack_trace. Runtime.exceptionThrown (uncaught exceptions) produces text, line, column, source_url, and stack_trace. Fields not applicable to the source are absent. -type BrowserConsoleErrorEvent struct { - Category BrowserConsoleErrorEventCategory `json:"category"` - Data *BrowserConsoleErrorEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserConsoleErrorEventType `json:"type"` -} - -// BrowserConsoleErrorEventCategory defines model for BrowserConsoleErrorEvent.Category. -type BrowserConsoleErrorEventCategory string - -// BrowserConsoleErrorEventType defines model for BrowserConsoleErrorEvent.Type. -type BrowserConsoleErrorEventType string - -// BrowserConsoleErrorEventData defines model for BrowserConsoleErrorEventData. -type BrowserConsoleErrorEventData struct { - // Args All console arguments coerced to strings. Present only when sourced from Runtime.consoleAPICalled. - Args *[]string `json:"args,omitempty"` - - // Column Column number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown. - Column *int `json:"column,omitempty"` - - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // Level CDP console type value, always "error". Present only when sourced from Runtime.consoleAPICalled. - Level *string `json:"level,omitempty"` - - // Line Line number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown. - Line *int `json:"line,omitempty"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` - - // SourceUrl URL of the script file that threw the exception. Present only when sourced from Runtime.exceptionThrown. - SourceUrl *string `json:"source_url,omitempty"` - - // StackTrace CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. - StackTrace *BrowserCallStack `json:"stack_trace,omitempty"` - - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` - - // Text Human-readable error text, as the browser console would display it. For console.error() calls, the first argument coerced to a string. For uncaught exceptions, the prefix and error message, e.g. "Uncaught Error: boom" or "Uncaught (in promise) TypeError: x is not a function". - Text string `json:"text"` - - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} - -// BrowserConsoleLogEvent A browser console log event (console.log, console.info, console.warn, etc.). -type BrowserConsoleLogEvent struct { - Category BrowserConsoleLogEventCategory `json:"category"` - Data *BrowserConsoleLogEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserConsoleLogEventType `json:"type"` -} - -// BrowserConsoleLogEventCategory defines model for BrowserConsoleLogEvent.Category. -type BrowserConsoleLogEventCategory string - -// BrowserConsoleLogEventType defines model for BrowserConsoleLogEvent.Type. -type BrowserConsoleLogEventType string - -// BrowserConsoleLogEventData defines model for BrowserConsoleLogEventData. -type BrowserConsoleLogEventData struct { - // Args All console arguments coerced to strings. - Args *[]string `json:"args,omitempty"` - - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // Level CDP Runtime.consoleAPICalled type, passed through unfiltered from Chrome. `error` is routed to console_error events instead; all other CDP console types appear here. See CDP spec for the full enum. - Level string `json:"level"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` - - // StackTrace CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. - StackTrace *BrowserCallStack `json:"stack_trace,omitempty"` - - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` - - // Text First console argument coerced to string. - Text string `json:"text"` - - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} - -// BrowserEventContext Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. -type BrowserEventContext struct { - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` - - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` - - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} - -// BrowserEventSource Provenance metadata identifying which producer emitted the event. -type BrowserEventSource struct { - // Event Producer-specific event name (e.g. `Runtime.consoleAPICalled` for CDP-sourced console events). - Event *string `json:"event,omitempty"` - - // Kind Event producer. `cdp`: Chrome DevTools Protocol events from the browser. `kernel_api`: Kernel API server (reserved for server-generated events). `extension`: injected Chrome extension. `local_process`: system process running alongside the browser. - Kind BrowserEventSourceKind `json:"kind"` - - // Metadata Producer-specific context (e.g. CDP target/session/frame IDs). - Metadata *map[string]string `json:"metadata,omitempty"` -} - -// BrowserEventSourceKind Event producer. `cdp`: Chrome DevTools Protocol events from the browser. `kernel_api`: Kernel API server (reserved for server-generated events). `extension`: injected Chrome extension. `local_process`: system process running alongside the browser. -type BrowserEventSourceKind string - -// BrowserHttpHeaders HTTP headers map forwarded as-is from CDP without normalization. Values are typically strings but may be any JSON type. -type BrowserHttpHeaders map[string]interface{} - -// BrowserInteractionClickEvent A browser user click event captured via injected page script. -type BrowserInteractionClickEvent struct { - Category BrowserInteractionClickEventCategory `json:"category"` - Data *BrowserInteractionClickEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserInteractionClickEventType `json:"type"` -} - -// BrowserInteractionClickEventCategory defines model for BrowserInteractionClickEvent.Category. -type BrowserInteractionClickEventCategory string - -// BrowserInteractionClickEventType defines model for BrowserInteractionClickEvent.Type. -type BrowserInteractionClickEventType string - -// BrowserInteractionClickEventData defines model for BrowserInteractionClickEventData. -type BrowserInteractionClickEventData struct { - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // Selector CSS selector path to the clicked element. - Selector string `json:"selector"` - - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` - - // Tag HTML tag name of the clicked element in uppercase (e.g. BUTTON, A, DIV). - Tag string `json:"tag"` - - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` - - // Text Visible text content of the clicked element, trimmed. - Text *string `json:"text,omitempty"` - - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` - - // X Viewport x-coordinate of the click in CSS pixels. - X int `json:"x"` - - // Y Viewport y-coordinate of the click in CSS pixels. - Y int `json:"y"` -} - -// BrowserInteractionKeyEvent A browser keyboard event captured via injected page script. -type BrowserInteractionKeyEvent struct { - Category BrowserInteractionKeyEventCategory `json:"category"` - Data *BrowserInteractionKeyEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserInteractionKeyEventType `json:"type"` -} - -// BrowserInteractionKeyEventCategory defines model for BrowserInteractionKeyEvent.Category. -type BrowserInteractionKeyEventCategory string - -// BrowserInteractionKeyEventType defines model for BrowserInteractionKeyEvent.Type. -type BrowserInteractionKeyEventType string - -// BrowserInteractionKeyEventData defines model for BrowserInteractionKeyEventData. -type BrowserInteractionKeyEventData struct { - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // Key Key value from the KeyboardEvent (e.g. Enter, Backspace, a). - Key string `json:"key"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // Selector CSS selector path to the element that had focus when the key was pressed. - Selector string `json:"selector"` - - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` - - // Tag HTML tag name of the focused element in uppercase (e.g. INPUT, TEXTAREA, DIV). - Tag string `json:"tag"` - - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` - - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} - -// BrowserInteractionScrollSettledEvent A browser scroll settled event emitted after scroll position stops changing, captured via injected page script. -type BrowserInteractionScrollSettledEvent struct { - Category BrowserInteractionScrollSettledEventCategory `json:"category"` - Data *BrowserInteractionScrollSettledEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserInteractionScrollSettledEventType `json:"type"` -} - -// BrowserInteractionScrollSettledEventCategory defines model for BrowserInteractionScrollSettledEvent.Category. -type BrowserInteractionScrollSettledEventCategory string - -// BrowserInteractionScrollSettledEventType defines model for BrowserInteractionScrollSettledEvent.Type. -type BrowserInteractionScrollSettledEventType string - -// BrowserInteractionScrollSettledEventData defines model for BrowserInteractionScrollSettledEventData. -type BrowserInteractionScrollSettledEventData struct { - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // FromX Scroll x-position at the start of the scroll gesture in CSS pixels. - FromX int `json:"from_x"` - - // FromY Scroll y-position at the start of the scroll gesture in CSS pixels. - FromY int `json:"from_y"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` - - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` - - // TargetSelector CSS selector path to the scrolled element. - TargetSelector string `json:"target_selector"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` - - // ToX Final scroll x-position after the gesture settled in CSS pixels. - ToX int `json:"to_x"` - - // ToY Final scroll y-position after the gesture settled in CSS pixels. - ToY int `json:"to_y"` - - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} - -// BrowserLiveViewConnectEvent A live view client connected to the headful browser's WebRTC server (Neko). Headful only; not emitted for headless images. -type BrowserLiveViewConnectEvent struct { - Category BrowserLiveViewConnectEventCategory `json:"category"` - - // Data Per-session payload for `live_view_connect` events. - Data *BrowserLiveViewConnectEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserLiveViewConnectEventType `json:"type"` -} - -// BrowserLiveViewConnectEventCategory defines model for BrowserLiveViewConnectEvent.Category. -type BrowserLiveViewConnectEventCategory string - -// BrowserLiveViewConnectEventType defines model for BrowserLiveViewConnectEvent.Type. -type BrowserLiveViewConnectEventType string - -// BrowserLiveViewConnectEventData Per-session payload for `live_view_connect` events. -type BrowserLiveViewConnectEventData struct { - // SessionId Live view session identifier. Stable across reconnects, so a transient network blip can emit two events with the same `session_id`. - SessionId string `json:"session_id"` -} - -// BrowserLiveViewDisconnectEvent A live view client disconnected from the headful browser's WebRTC server (Neko). Pair with `live_view_connect` by `session_id`. -type BrowserLiveViewDisconnectEvent struct { - Category BrowserLiveViewDisconnectEventCategory `json:"category"` - - // Data Per-session payload for `live_view_disconnect` events. - Data *BrowserLiveViewDisconnectEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserLiveViewDisconnectEventType `json:"type"` -} - -// BrowserLiveViewDisconnectEventCategory defines model for BrowserLiveViewDisconnectEvent.Category. -type BrowserLiveViewDisconnectEventCategory string - -// BrowserLiveViewDisconnectEventType defines model for BrowserLiveViewDisconnectEvent.Type. -type BrowserLiveViewDisconnectEventType string - -// BrowserLiveViewDisconnectEventData Per-session payload for `live_view_disconnect` events. -type BrowserLiveViewDisconnectEventData struct { - // DurationMs Wall-clock duration of the connection in milliseconds. - DurationMs float32 `json:"duration_ms"` - - // SessionId Live view session identifier; matches the corresponding `live_view_connect` event. - SessionId string `json:"session_id"` -} - -// BrowserMonitorDisconnectedEvent The CDP connection to Chrome was lost. Telemetry events may be dropped until monitor_reconnected arrives. Treat any in-progress computed state (network_idle, page_layout_settled) as unreliable until then. -type BrowserMonitorDisconnectedEvent struct { - Category BrowserMonitorDisconnectedEventCategory `json:"category"` - Data *BrowserMonitorDisconnectedEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorDisconnectedEventType `json:"type"` -} - -// BrowserMonitorDisconnectedEventCategory defines model for BrowserMonitorDisconnectedEvent.Category. -type BrowserMonitorDisconnectedEventCategory string - -// BrowserMonitorDisconnectedEventType defines model for BrowserMonitorDisconnectedEvent.Type. -type BrowserMonitorDisconnectedEventType string - -// BrowserMonitorDisconnectedEventData defines model for BrowserMonitorDisconnectedEventData. -type BrowserMonitorDisconnectedEventData struct { - // Reason Reason for the disconnection. chrome_restarted: Chrome process restarted. - Reason BrowserMonitorDisconnectedEventDataReason `json:"reason"` -} - -// BrowserMonitorDisconnectedEventDataReason Reason for the disconnection. chrome_restarted: Chrome process restarted. -type BrowserMonitorDisconnectedEventDataReason string - -// BrowserMonitorInitFailedEvent The CDP session could not be initialized. -type BrowserMonitorInitFailedEvent struct { - Category BrowserMonitorInitFailedEventCategory `json:"category"` - Data *BrowserMonitorInitFailedEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorInitFailedEventType `json:"type"` -} - -// BrowserMonitorInitFailedEventCategory defines model for BrowserMonitorInitFailedEvent.Category. -type BrowserMonitorInitFailedEventCategory string - -// BrowserMonitorInitFailedEventType defines model for BrowserMonitorInitFailedEvent.Type. -type BrowserMonitorInitFailedEventType string - -// BrowserMonitorInitFailedEventData defines model for BrowserMonitorInitFailedEventData. -type BrowserMonitorInitFailedEventData struct { - // Step The CDP method or initialization step that failed (e.g. Target.setAutoAttach). - Step string `json:"step"` -} - -// BrowserMonitorReconnectFailedEvent The CDP connection to Chrome could not be re-established after exhausting all reconnection attempts. No further telemetry events will arrive on this session. -type BrowserMonitorReconnectFailedEvent struct { - Category BrowserMonitorReconnectFailedEventCategory `json:"category"` - Data *BrowserMonitorReconnectFailedEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // FunctionName JavaScript function name, or empty string for anonymous functions. + FunctionName string `json:"functionName"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // LineNumber Zero-based line number within the script. + LineNumber int `json:"lineNumber"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorReconnectFailedEventType `json:"type"` -} + // ScriptId CDP script identifier. + ScriptId string `json:"scriptId"` -// BrowserMonitorReconnectFailedEventCategory defines model for BrowserMonitorReconnectFailedEvent.Category. -type BrowserMonitorReconnectFailedEventCategory string + // Url URL or name of the script file. + Url string `json:"url"` + } `json:"callFrames"` -// BrowserMonitorReconnectFailedEventType defines model for BrowserMonitorReconnectFailedEvent.Type. -type BrowserMonitorReconnectFailedEventType string + // Description Optional label for the stack trace (e.g. async cause). + Description *string `json:"description,omitempty"` -// BrowserMonitorReconnectFailedEventData defines model for BrowserMonitorReconnectFailedEventData. -type BrowserMonitorReconnectFailedEventData struct { - // Reason Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection. - Reason BrowserMonitorReconnectFailedEventDataReason `json:"reason"` + // Parent Parent stack trace for async stacks. + Parent *BrowserCallStack `json:"parent,omitempty"` } -// BrowserMonitorReconnectFailedEventDataReason Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection. -type BrowserMonitorReconnectFailedEventDataReason string +// BrowserCaptchaSolveResultEvent A captcha solve attempt reached a terminal outcome. +type BrowserCaptchaSolveResultEvent struct { + Category BrowserCaptchaSolveResultEventCategory `json:"category"` -// BrowserMonitorReconnectedEvent The CDP connection to Chrome was successfully re-established after a disconnection. Events emitted during the gap are lost. Computed state is reset, so navigation and network tracking restart fresh from this point. -type BrowserMonitorReconnectedEvent struct { - Category BrowserMonitorReconnectedEventCategory `json:"category"` - Data *BrowserMonitorReconnectedEventData `json:"data,omitempty"` + // Data Per-attempt payload for `captcha_solve_result` events. + Data *BrowserCaptchaSolveResultEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -4810,77 +1706,48 @@ type BrowserMonitorReconnectedEvent struct { // Ts Event timestamp in Unix microseconds. Ts int64 `json:"ts"` - Type BrowserMonitorReconnectedEventType `json:"type"` -} - -// BrowserMonitorReconnectedEventCategory defines model for BrowserMonitorReconnectedEvent.Category. -type BrowserMonitorReconnectedEventCategory string - -// BrowserMonitorReconnectedEventType defines model for BrowserMonitorReconnectedEvent.Type. -type BrowserMonitorReconnectedEventType string - -// BrowserMonitorReconnectedEventData defines model for BrowserMonitorReconnectedEventData. -type BrowserMonitorReconnectedEventData struct { - // ReconnectDurationMs Wall-clock time in milliseconds taken to reconnect after the disconnection. - ReconnectDurationMs int64 `json:"reconnect_duration_ms"` + Type BrowserCaptchaSolveResultEventType `json:"type"` } -// BrowserMonitorScreenshotEvent A periodic screenshot of the browser viewport. -type BrowserMonitorScreenshotEvent struct { - Category BrowserMonitorScreenshotEventCategory `json:"category"` - Data *BrowserMonitorScreenshotEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorScreenshotEventType `json:"type"` -} +// BrowserCaptchaSolveResultEventCategory defines model for BrowserCaptchaSolveResultEvent.Category. +type BrowserCaptchaSolveResultEventCategory string -// BrowserMonitorScreenshotEventCategory defines model for BrowserMonitorScreenshotEvent.Category. -type BrowserMonitorScreenshotEventCategory string +// BrowserCaptchaSolveResultEventType defines model for BrowserCaptchaSolveResultEvent.Type. +type BrowserCaptchaSolveResultEventType string -// BrowserMonitorScreenshotEventType defines model for BrowserMonitorScreenshotEvent.Type. -type BrowserMonitorScreenshotEventType string +// BrowserCaptchaSolveResultEventData Per-attempt payload for `captcha_solve_result` events. +type BrowserCaptchaSolveResultEventData struct { + // CaptchaType Captcha vendor family. Producers normalize provider-specific task names into this set: enterprise variants of recaptcha collapse into their version bucket (v2 / v3), and anything not covered (e.g. DataDome, MtCaptcha, plain OCR) is reported as `other`. + CaptchaType BrowserCaptchaSolveResultEventDataCaptchaType `json:"captcha_type"` -// BrowserMonitorScreenshotEventData defines model for BrowserMonitorScreenshotEventData. -type BrowserMonitorScreenshotEventData struct { - // Png Base64-encoded PNG screenshot of the browser viewport. - Png []byte `json:"png"` -} + // DurationMs Wall-clock duration from solve start to terminal outcome. + DurationMs float32 `json:"duration_ms"` -// BrowserNetworkIdleEvent A browser network idle event emitted after a 500ms quiet period with no in-flight HTTP requests. -type BrowserNetworkIdleEvent struct { - Category BrowserNetworkIdleEventCategory `json:"category"` + // ErrorCode Solver-specific error code on failure (e.g. `ERROR_CAPTCHA_UNSOLVABLE`). Absent on success. + ErrorCode *string `json:"error_code,omitempty"` - // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. - Data *BrowserEventContext `json:"data,omitempty"` + // Status Terminal outcome. `success`: solver returned a usable solution. `failure`: solver returned an error (see `error_code`). `timeout`: solver did not return within the caller's wait budget. `abandoned`: caller cancelled or the page navigated away mid-solve. + Status BrowserCaptchaSolveResultEventDataStatus `json:"status"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // TaskId Solver-assigned identifier. Opaque, useful for support cross-references. + TaskId *string `json:"task_id,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // WebsiteHost Host of the page where the captcha was solved. + WebsiteHost *string `json:"website_host,omitempty"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserNetworkIdleEventType `json:"type"` + // WebsitePath Path of the page where the captcha was solved. Query string excluded. + WebsitePath *string `json:"website_path,omitempty"` } -// BrowserNetworkIdleEventCategory defines model for BrowserNetworkIdleEvent.Category. -type BrowserNetworkIdleEventCategory string +// BrowserCaptchaSolveResultEventDataCaptchaType Captcha vendor family. Producers normalize provider-specific task names into this set: enterprise variants of recaptcha collapse into their version bucket (v2 / v3), and anything not covered (e.g. DataDome, MtCaptcha, plain OCR) is reported as `other`. +type BrowserCaptchaSolveResultEventDataCaptchaType string -// BrowserNetworkIdleEventType defines model for BrowserNetworkIdleEvent.Type. -type BrowserNetworkIdleEventType string +// BrowserCaptchaSolveResultEventDataStatus Terminal outcome. `success`: solver returned a usable solution. `failure`: solver returned an error (see `error_code`). `timeout`: solver did not return within the caller's wait budget. `abandoned`: caller cancelled or the page navigated away mid-solve. +type BrowserCaptchaSolveResultEventDataStatus string -// BrowserNetworkLoadingFailedEvent A browser network loading failed event. If the request was already in flight when CDP attached (no prior `network_request` was emitted for it), `url`, `frame_id`, `loader_id`, and `resource_type` are absent; `BrowserEventContext` is partially populated in that case. -type BrowserNetworkLoadingFailedEvent struct { - Category BrowserNetworkLoadingFailedEventCategory `json:"category"` - Data *BrowserNetworkLoadingFailedEventData `json:"data,omitempty"` +// BrowserCdpConnectEvent An external client (e.g. customer SDK, Playwright, Puppeteer) connected to the CDP WebSocket proxy on this VM. +type BrowserCdpConnectEvent struct { + Category BrowserCdpConnectEventCategory `json:"category"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -4889,56 +1756,59 @@ type BrowserNetworkLoadingFailedEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserNetworkLoadingFailedEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserCdpConnectEventType `json:"type"` } -// BrowserNetworkLoadingFailedEventCategory defines model for BrowserNetworkLoadingFailedEvent.Category. -type BrowserNetworkLoadingFailedEventCategory string - -// BrowserNetworkLoadingFailedEventType defines model for BrowserNetworkLoadingFailedEvent.Type. -type BrowserNetworkLoadingFailedEventType string +// BrowserCdpConnectEventCategory defines model for BrowserCdpConnectEvent.Category. +type BrowserCdpConnectEventCategory string -// BrowserNetworkLoadingFailedEventData defines model for BrowserNetworkLoadingFailedEventData. -type BrowserNetworkLoadingFailedEventData struct { - // Canceled True if the request was canceled by the browser or page script. - Canceled bool `json:"canceled"` +// BrowserCdpConnectEventType defines model for BrowserCdpConnectEvent.Type. +type BrowserCdpConnectEventType string - // ErrorText Network error description (e.g. net::ERR_CONNECTION_REFUSED). - ErrorText string `json:"error_text"` +// BrowserCdpDisconnectEvent An external client disconnected from the CDP WebSocket proxy on this VM. Pair with the immediately preceding `cdp_connect` on the same stream. +type BrowserCdpDisconnectEvent struct { + Category BrowserCdpDisconnectEventCategory `json:"category"` - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` + // Data Per-disconnect payload for `cdp_disconnect` events. + Data *BrowserCdpDisconnectEventData `json:"data,omitempty"` - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // RequestId CDP request identifier matching the originating network_request event. - RequestId string `json:"request_id"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserCdpDisconnectEventType `json:"type"` +} - // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. - ResourceType *string `json:"resource_type,omitempty"` +// BrowserCdpDisconnectEventCategory defines model for BrowserCdpDisconnectEvent.Category. +type BrowserCdpDisconnectEventCategory string - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` +// BrowserCdpDisconnectEventType defines model for BrowserCdpDisconnectEvent.Type. +type BrowserCdpDisconnectEventType string - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` +// BrowserCdpDisconnectEventData Per-disconnect payload for `cdp_disconnect` events. +type BrowserCdpDisconnectEventData struct { + // DurationMs Wall-clock duration of the connection in milliseconds. + DurationMs float32 `json:"duration_ms"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // MessageCount Number of CDP messages relayed across the connection in either direction. + MessageCount int `json:"message_count"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` + // Reason Why the connection ended. `client_close`: the client initiated the close. `upstream_changed`: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. `upstream_error`: upstream dial or message pump errored. `context_cancelled`: the request context was cancelled (typically server shutdown). + Reason BrowserCdpDisconnectEventDataReason `json:"reason"` } -// BrowserNetworkRequestEvent A browser network request sent event. -type BrowserNetworkRequestEvent struct { - Category BrowserNetworkRequestEventCategory `json:"category"` - Data *BrowserNetworkRequestEventData `json:"data,omitempty"` +// BrowserCdpDisconnectEventDataReason Why the connection ended. `client_close`: the client initiated the close. `upstream_changed`: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. `upstream_error`: upstream dial or message pump errored. `context_cancelled`: the request context was cancelled (typically server shutdown). +type BrowserCdpDisconnectEventDataReason string + +// BrowserConsoleErrorEvent A browser console error or uncaught JavaScript exception event. Emitted from two distinct CDP sources with different data shapes. Runtime.consoleAPICalled (console.error calls) produces level, text, args, and stack_trace. Runtime.exceptionThrown (uncaught exceptions) produces text, line, column, source_url, and stack_trace. Fields not applicable to the source are absent. +type BrowserConsoleErrorEvent struct { + Category BrowserConsoleErrorEventCategory `json:"category"` + Data *BrowserConsoleErrorEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -4947,71 +1817,65 @@ type BrowserNetworkRequestEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserNetworkRequestEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserConsoleErrorEventType `json:"type"` } -// BrowserNetworkRequestEventCategory defines model for BrowserNetworkRequestEvent.Category. -type BrowserNetworkRequestEventCategory string +// BrowserConsoleErrorEventCategory defines model for BrowserConsoleErrorEvent.Category. +type BrowserConsoleErrorEventCategory string -// BrowserNetworkRequestEventType defines model for BrowserNetworkRequestEvent.Type. -type BrowserNetworkRequestEventType string +// BrowserConsoleErrorEventType defines model for BrowserConsoleErrorEvent.Type. +type BrowserConsoleErrorEventType string -// BrowserNetworkRequestEventData defines model for BrowserNetworkRequestEventData. -type BrowserNetworkRequestEventData struct { - // DocumentUrl URL of the document that initiated the request. - DocumentUrl string `json:"document_url"` +// BrowserConsoleErrorEventData defines model for BrowserConsoleErrorEventData. +type BrowserConsoleErrorEventData struct { + // Args All console arguments coerced to strings. Present only when sourced from Runtime.consoleAPICalled. + Args *[]string `json:"args,omitempty"` + + // Column Column number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown. + Column *int `json:"column,omitempty"` // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` - // Headers Request headers. - Headers BrowserHttpHeaders `json:"headers"` - - // InitiatorType CDP Initiator.type indicating what caused the request, passed through as-is from Chrome. Known values include script, parser, preload, and other. - InitiatorType string `json:"initiator_type"` + // Level CDP console type value, always "error". Present only when sourced from Runtime.consoleAPICalled. + Level *string `json:"level,omitempty"` - // IsRedirect True if this request is the result of a redirect. - IsRedirect *bool `json:"is_redirect,omitempty"` + // Line Line number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown. + Line *int `json:"line,omitempty"` // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` - // Method HTTP method as sent on the wire (e.g. GET, POST). - Method string `json:"method"` - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` - // PostData Request body for POST/PUT requests, if available. - PostData *string `json:"post_data,omitempty"` - - // RedirectUrl Original URL before the redirect, present when is_redirect is true. - RedirectUrl *string `json:"redirect_url,omitempty"` - - // RequestId CDP request identifier, unique within the session. - RequestId string `json:"request_id"` - - // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. - ResourceType *string `json:"resource_type,omitempty"` - // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` + // SourceUrl URL of the script file that threw the exception. Present only when sourced from Runtime.exceptionThrown. + SourceUrl *string `json:"source_url,omitempty"` + + // StackTrace CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. + StackTrace *BrowserCallStack `json:"stack_trace,omitempty"` + // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` + // Text Human-readable error text, as the browser console would display it. For console.error() calls, the first argument coerced to a string. For uncaught exceptions, the prefix and error message, e.g. "Uncaught Error: boom" or "Uncaught (in promise) TypeError: x is not a function". + Text string `json:"text"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. Url *string `json:"url,omitempty"` } -// BrowserNetworkResponseEvent A browser network response received event. Fired after the response body is fully received, not when headers arrive. -type BrowserNetworkResponseEvent struct { - Category BrowserNetworkResponseEventCategory `json:"category"` - Data *BrowserNetworkResponseEventData `json:"data,omitempty"` +// BrowserConsoleLogEvent A browser console log event (console.log, console.info, console.warn, etc.). +type BrowserConsoleLogEvent struct { + Category BrowserConsoleLogEventCategory `json:"category"` + Data *BrowserConsoleLogEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5020,53 +1884,38 @@ type BrowserNetworkResponseEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserNetworkResponseEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserConsoleLogEventType `json:"type"` } -// BrowserNetworkResponseEventCategory defines model for BrowserNetworkResponseEvent.Category. -type BrowserNetworkResponseEventCategory string +// BrowserConsoleLogEventCategory defines model for BrowserConsoleLogEvent.Category. +type BrowserConsoleLogEventCategory string -// BrowserNetworkResponseEventType defines model for BrowserNetworkResponseEvent.Type. -type BrowserNetworkResponseEventType string +// BrowserConsoleLogEventType defines model for BrowserConsoleLogEvent.Type. +type BrowserConsoleLogEventType string -// BrowserNetworkResponseEventData defines model for BrowserNetworkResponseEventData. -type BrowserNetworkResponseEventData struct { - // Body Truncated response body, present only for text MIME types. - Body *string `json:"body,omitempty"` +// BrowserConsoleLogEventData defines model for BrowserConsoleLogEventData. +type BrowserConsoleLogEventData struct { + // Args All console arguments coerced to strings. + Args *[]string `json:"args,omitempty"` // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` - // Headers Response headers. - Headers BrowserHttpHeaders `json:"headers"` + // Level CDP Runtime.consoleAPICalled type, passed through unfiltered from Chrome. `error` is routed to console_error events instead; all other CDP console types appear here. See CDP spec for the full enum. + Level string `json:"level"` // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` - // Method HTTP method of the original request. - Method string `json:"method"` - - // MimeType MIME type of the response (e.g. text/html, application/json). - MimeType *string `json:"mime_type,omitempty"` - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` - // RequestId CDP request identifier matching the originating network_request event. - RequestId string `json:"request_id"` - - // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. - ResourceType *string `json:"resource_type,omitempty"` - // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` - // Status HTTP response status code. - Status int `json:"status"` - - // StatusText HTTP response status text (e.g. OK, Not Found). - StatusText *string `json:"status_text,omitempty"` + // StackTrace CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. + StackTrace *BrowserCallStack `json:"stack_trace,omitempty"` // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` @@ -5074,71 +1923,15 @@ type BrowserNetworkResponseEventData struct { // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} - -// BrowserPageCrashedEvent A page's renderer process crashed (an "Aw, Snap!" failure) while the browser process itself stayed alive. Reported on the crashed page's session, with the session and target ids on `source.metadata`. Captured only while the `page` category is enabled. -type BrowserPageCrashedEvent struct { - Category BrowserPageCrashedEventCategory `json:"category"` - Data *BrowserPageCrashedEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageCrashedEventType `json:"type"` -} - -// BrowserPageCrashedEventCategory defines model for BrowserPageCrashedEvent.Category. -type BrowserPageCrashedEventCategory string - -// BrowserPageCrashedEventType defines model for BrowserPageCrashedEvent.Type. -type BrowserPageCrashedEventType string - -// BrowserPageCrashedEventData defines model for BrowserPageCrashedEventData. -type BrowserPageCrashedEventData struct { - // TargetId CDP target identifier of the crashed page. - TargetId string `json:"target_id"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` - - // Url URL the page was on when its renderer process crashed. - Url string `json:"url"` -} - -// BrowserPageDomContentLoadedEvent A browser DOMContentLoaded event (CDP Page.domContentEventFired). -type BrowserPageDomContentLoadedEvent struct { - Category BrowserPageDomContentLoadedEventCategory `json:"category"` - Data *BrowserPageDomContentLoadedEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` - - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageDomContentLoadedEventType `json:"type"` -} - -// BrowserPageDomContentLoadedEventCategory defines model for BrowserPageDomContentLoadedEvent.Category. -type BrowserPageDomContentLoadedEventCategory string - -// BrowserPageDomContentLoadedEventType defines model for BrowserPageDomContentLoadedEvent.Type. -type BrowserPageDomContentLoadedEventType string + // Text First console argument coerced to string. + Text string `json:"text"` -// BrowserPageDomContentLoadedEventData defines model for BrowserPageDomContentLoadedEventData. -type BrowserPageDomContentLoadedEventData struct { - // CdpTimestamp Chrome monotonic clock value in seconds at which DOMContentLoaded fired, relative to browser process start (not Unix epoch). Use `ts` for wall-clock time. - CdpTimestamp float32 `json:"cdp_timestamp"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` +} +// BrowserEventContext Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. +type BrowserEventContext struct { // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` @@ -5161,34 +1954,28 @@ type BrowserPageDomContentLoadedEventData struct { Url *string `json:"url,omitempty"` } -// BrowserPageLayoutSettledEvent A browser layout settled event emitted 1 second after page load with no intervening layout shifts, indicating visual stability. Each layout shift resets the 1-second timer. -type BrowserPageLayoutSettledEvent struct { - Category BrowserPageLayoutSettledEventCategory `json:"category"` - - // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. - Data *BrowserEventContext `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` +// BrowserEventSource Provenance metadata identifying which producer emitted the event. +type BrowserEventSource struct { + // Event Producer-specific event name (e.g. `Runtime.consoleAPICalled` for CDP-sourced console events). + Event *string `json:"event,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // Kind Event producer. `cdp`: Chrome DevTools Protocol events from the browser. `kernel_api`: Kernel API server (reserved for server-generated events). `extension`: injected Chrome extension. `local_process`: system process running alongside the browser. + Kind BrowserEventSourceKind `json:"kind"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageLayoutSettledEventType `json:"type"` + // Metadata Producer-specific context (e.g. CDP target/session/frame IDs). + Metadata *map[string]string `json:"metadata,omitempty"` } -// BrowserPageLayoutSettledEventCategory defines model for BrowserPageLayoutSettledEvent.Category. -type BrowserPageLayoutSettledEventCategory string +// BrowserEventSourceKind Event producer. `cdp`: Chrome DevTools Protocol events from the browser. `kernel_api`: Kernel API server (reserved for server-generated events). `extension`: injected Chrome extension. `local_process`: system process running alongside the browser. +type BrowserEventSourceKind string -// BrowserPageLayoutSettledEventType defines model for BrowserPageLayoutSettledEvent.Type. -type BrowserPageLayoutSettledEventType string +// BrowserHttpHeaders HTTP headers map forwarded as-is from CDP without normalization. Values are typically strings but may be any JSON type. +type BrowserHttpHeaders map[string]interface{} -// BrowserPageLayoutShiftEvent A browser cumulative layout shift (CLS) event from the Performance Timeline API. -type BrowserPageLayoutShiftEvent struct { - Category BrowserPageLayoutShiftEventCategory `json:"category"` - Data *BrowserPageLayoutShiftEventData `json:"data,omitempty"` +// BrowserInteractionClickEvent A browser user click event captured via injected page script. +type BrowserInteractionClickEvent struct { + Category BrowserInteractionClickEventCategory `json:"category"` + Data *BrowserInteractionClickEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5197,44 +1984,35 @@ type BrowserPageLayoutShiftEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageLayoutShiftEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserInteractionClickEventType `json:"type"` } -// BrowserPageLayoutShiftEventCategory defines model for BrowserPageLayoutShiftEvent.Category. -type BrowserPageLayoutShiftEventCategory string - -// BrowserPageLayoutShiftEventType defines model for BrowserPageLayoutShiftEvent.Type. -type BrowserPageLayoutShiftEventType string +// BrowserInteractionClickEventCategory defines model for BrowserInteractionClickEvent.Category. +type BrowserInteractionClickEventCategory string -// BrowserPageLayoutShiftEventData defines model for BrowserPageLayoutShiftEventData. -type BrowserPageLayoutShiftEventData struct { - // Duration Duration of the layout shift entry in milliseconds (always 0 for layout shifts per spec). - Duration float32 `json:"duration"` +// BrowserInteractionClickEventType defines model for BrowserInteractionClickEvent.Type. +type BrowserInteractionClickEventType string +// BrowserInteractionClickEventData defines model for BrowserInteractionClickEventData. +type BrowserInteractionClickEventData struct { // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` - // LayoutShiftDetails PerformanceLayoutShift attributes from the Performance Timeline entry. - LayoutShiftDetails *struct { - // HadRecentInput True if the layout shift was preceded by user input within 500ms, excluding it from CLS. - HadRecentInput *bool `json:"had_recent_input,omitempty"` - - // Value Layout shift score for this entry (contribution to CLS). - Value *float32 `json:"value,omitempty"` - } `json:"layout_shift_details,omitempty"` - // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` + // Selector CSS selector path to the clicked element. + Selector string `json:"selector"` + // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` - // SourceFrameId CDP frame identifier of the frame where the layout shift occurred. - SourceFrameId string `json:"source_frame_id"` + // Tag HTML tag name of the clicked element in uppercase (e.g. BUTTON, A, DIV). + Tag string `json:"tag"` // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` @@ -5242,17 +2020,23 @@ type BrowserPageLayoutShiftEventData struct { // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` - // Time Performance Timeline timestamp of the layout shift in milliseconds. - Time float32 `json:"time"` + // Text Visible text content of the clicked element, trimmed. + Text *string `json:"text,omitempty"` // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. Url *string `json:"url,omitempty"` + + // X Viewport x-coordinate of the click in CSS pixels. + X int `json:"x"` + + // Y Viewport y-coordinate of the click in CSS pixels. + Y int `json:"y"` } -// BrowserPageLcpEvent A browser Largest Contentful Paint (LCP) event from the Performance Timeline API. -type BrowserPageLcpEvent struct { - Category BrowserPageLcpEventCategory `json:"category"` - Data *BrowserPageLcpEventData `json:"data,omitempty"` +// BrowserInteractionKeyEvent A browser keyboard event captured via injected page script. +type BrowserInteractionKeyEvent struct { + Category BrowserInteractionKeyEventCategory `json:"category"` + Data *BrowserInteractionKeyEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5261,41 +2045,23 @@ type BrowserPageLcpEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageLcpEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserInteractionKeyEventType `json:"type"` } -// BrowserPageLcpEventCategory defines model for BrowserPageLcpEvent.Category. -type BrowserPageLcpEventCategory string +// BrowserInteractionKeyEventCategory defines model for BrowserInteractionKeyEvent.Category. +type BrowserInteractionKeyEventCategory string -// BrowserPageLcpEventType defines model for BrowserPageLcpEvent.Type. -type BrowserPageLcpEventType string +// BrowserInteractionKeyEventType defines model for BrowserInteractionKeyEvent.Type. +type BrowserInteractionKeyEventType string -// BrowserPageLcpEventData defines model for BrowserPageLcpEventData. -type BrowserPageLcpEventData struct { +// BrowserInteractionKeyEventData defines model for BrowserInteractionKeyEventData. +type BrowserInteractionKeyEventData struct { // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` - // LcpDetails LargestContentfulPaint attributes from the Performance Timeline entry. - LcpDetails *struct { - // ElementId id attribute of the LCP element, if present. - ElementId *string `json:"element_id,omitempty"` - - // LoadTime Load time of the LCP element in milliseconds. - LoadTime *float32 `json:"load_time,omitempty"` - - // NodeId CDP DOM node identifier of the LCP element. - NodeId *int `json:"node_id,omitempty"` - - // RenderTime Render time of the LCP element in milliseconds; 0 for cross-origin images without Timing-Allow-Origin. - RenderTime *float32 `json:"render_time,omitempty"` - - // Size Visible area of the LCP element in pixels squared. - Size *float32 `json:"size,omitempty"` - - // Url URL of the LCP element for image or video elements. - Url *string `json:"url,omitempty"` - } `json:"lcp_details,omitempty"` + // Key Key value from the KeyboardEvent (e.g. Enter, Backspace, a). + Key string `json:"key"` // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` @@ -5303,11 +2069,14 @@ type BrowserPageLcpEventData struct { // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` + // Selector CSS selector path to the element that had focus when the key was pressed. + Selector string `json:"selector"` + // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` - // SourceFrameId CDP frame identifier of the frame where the LCP element was rendered. - SourceFrameId string `json:"source_frame_id"` + // Tag HTML tag name of the focused element in uppercase (e.g. INPUT, TEXTAREA, DIV). + Tag string `json:"tag"` // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` @@ -5315,17 +2084,14 @@ type BrowserPageLcpEventData struct { // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` - // Time Performance Timeline timestamp of the LCP entry in milliseconds. - Time float32 `json:"time"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. Url *string `json:"url,omitempty"` } -// BrowserPageLoadEvent A browser page load event (CDP Page.loadEventFired). -type BrowserPageLoadEvent struct { - Category BrowserPageLoadEventCategory `json:"category"` - Data *BrowserPageLoadEventData `json:"data,omitempty"` +// BrowserInteractionScrollSettledEvent A browser scroll settled event emitted after scroll position stops changing, captured via injected page script. +type BrowserInteractionScrollSettledEvent struct { + Category BrowserInteractionScrollSettledEventCategory `json:"category"` + Data *BrowserInteractionScrollSettledEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5334,24 +2100,27 @@ type BrowserPageLoadEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageLoadEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserInteractionScrollSettledEventType `json:"type"` } -// BrowserPageLoadEventCategory defines model for BrowserPageLoadEvent.Category. -type BrowserPageLoadEventCategory string - -// BrowserPageLoadEventType defines model for BrowserPageLoadEvent.Type. -type BrowserPageLoadEventType string +// BrowserInteractionScrollSettledEventCategory defines model for BrowserInteractionScrollSettledEvent.Category. +type BrowserInteractionScrollSettledEventCategory string -// BrowserPageLoadEventData defines model for BrowserPageLoadEventData. -type BrowserPageLoadEventData struct { - // CdpTimestamp Chrome monotonic clock value in seconds at which the load event fired, relative to browser process start (not Unix epoch). Use `ts` for wall-clock time. - CdpTimestamp float32 `json:"cdp_timestamp"` +// BrowserInteractionScrollSettledEventType defines model for BrowserInteractionScrollSettledEvent.Type. +type BrowserInteractionScrollSettledEventType string +// BrowserInteractionScrollSettledEventData defines model for BrowserInteractionScrollSettledEventData. +type BrowserInteractionScrollSettledEventData struct { // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` + // FromX Scroll x-position at the start of the scroll gesture in CSS pixels. + FromX int `json:"from_x"` + + // FromY Scroll y-position at the start of the scroll gesture in CSS pixels. + FromY int `json:"from_y"` + // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` @@ -5364,17 +2133,28 @@ type BrowserPageLoadEventData struct { // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` + // TargetSelector CSS selector path to the scrolled element. + TargetSelector string `json:"target_selector"` + // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` + // ToX Final scroll x-position after the gesture settled in CSS pixels. + ToX int `json:"to_x"` + + // ToY Final scroll y-position after the gesture settled in CSS pixels. + ToY int `json:"to_y"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. Url *string `json:"url,omitempty"` } -// BrowserPageNavigationEvent A browser page navigation started event (CDP Page.frameNavigated). Carries nav context fields inline but not nav_seq, as this event resets the navigation epoch. -type BrowserPageNavigationEvent struct { - Category BrowserPageNavigationEventCategory `json:"category"` - Data *BrowserPageNavigationEventData `json:"data,omitempty"` +// BrowserLiveViewConnectEvent A live view client connected to the headful browser's WebRTC server (Neko). Headful only; not emitted for headless images. +type BrowserLiveViewConnectEvent struct { + Category BrowserLiveViewConnectEventCategory `json:"category"` + + // Data Per-session payload for `live_view_connect` events. + Data *BrowserLiveViewConnectEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5383,46 +2163,59 @@ type BrowserPageNavigationEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageNavigationEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserLiveViewConnectEventType `json:"type"` } -// BrowserPageNavigationEventCategory defines model for BrowserPageNavigationEvent.Category. -type BrowserPageNavigationEventCategory string - -// BrowserPageNavigationEventType defines model for BrowserPageNavigationEvent.Type. -type BrowserPageNavigationEventType string +// BrowserLiveViewConnectEventCategory defines model for BrowserLiveViewConnectEvent.Category. +type BrowserLiveViewConnectEventCategory string -// BrowserPageNavigationEventData defines model for BrowserPageNavigationEventData. -type BrowserPageNavigationEventData struct { - // FrameId CDP frame identifier of the navigated frame. - FrameId string `json:"frame_id"` +// BrowserLiveViewConnectEventType defines model for BrowserLiveViewConnectEvent.Type. +type BrowserLiveViewConnectEventType string - // LoaderId New CDP document loader identifier assigned for this navigation. - LoaderId string `json:"loader_id"` +// BrowserLiveViewConnectEventData Per-session payload for `live_view_connect` events. +type BrowserLiveViewConnectEventData struct { + // SessionId Live view session identifier. Stable across reconnects, so a transient network blip can emit two events with the same `session_id`. + SessionId string `json:"session_id"` +} - // ParentFrameId Parent frame identifier for subframe navigations; absent for top-level navigations. - ParentFrameId *string `json:"parent_frame_id,omitempty"` +// BrowserLiveViewDisconnectEvent A live view client disconnected from the headful browser's WebRTC server (Neko). Pair with `live_view_connect` by `session_id`. +type BrowserLiveViewDisconnectEvent struct { + Category BrowserLiveViewDisconnectEventCategory `json:"category"` - // SessionId CDP session identifier. - SessionId string `json:"session_id"` + // Data Per-session payload for `live_view_disconnect` events. + Data *BrowserLiveViewDisconnectEventData `json:"data,omitempty"` - // TargetId Browser target identifier. - TargetId string `json:"target_id"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // Url URL navigated to. - Url string `json:"url"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserLiveViewDisconnectEventType `json:"type"` } -// BrowserPageNavigationSettledEvent Emitted when page_dom_content_loaded and page_layout_settled have both fired for the same navigation, indicating the page is loaded and visually stable. Independent of network_idle; a single pending request does not block it. -type BrowserPageNavigationSettledEvent struct { - Category BrowserPageNavigationSettledEventCategory `json:"category"` +// BrowserLiveViewDisconnectEventCategory defines model for BrowserLiveViewDisconnectEvent.Category. +type BrowserLiveViewDisconnectEventCategory string + +// BrowserLiveViewDisconnectEventType defines model for BrowserLiveViewDisconnectEvent.Type. +type BrowserLiveViewDisconnectEventType string + +// BrowserLiveViewDisconnectEventData Per-session payload for `live_view_disconnect` events. +type BrowserLiveViewDisconnectEventData struct { + // DurationMs Wall-clock duration of the connection in milliseconds. + DurationMs float32 `json:"duration_ms"` + + // SessionId Live view session identifier; matches the corresponding `live_view_connect` event. + SessionId string `json:"session_id"` +} - // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. - Data *BrowserEventContext `json:"data,omitempty"` +// BrowserMonitorDisconnectedEvent The CDP connection to Chrome was lost. Telemetry events may be dropped until monitor_reconnected arrives. Treat any in-progress computed state (network_idle, page_layout_settled) as unreliable until then. +type BrowserMonitorDisconnectedEvent struct { + Category BrowserMonitorDisconnectedEventCategory `json:"category"` + Data *BrowserMonitorDisconnectedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5431,20 +2224,29 @@ type BrowserPageNavigationSettledEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageNavigationSettledEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserMonitorDisconnectedEventType `json:"type"` } -// BrowserPageNavigationSettledEventCategory defines model for BrowserPageNavigationSettledEvent.Category. -type BrowserPageNavigationSettledEventCategory string +// BrowserMonitorDisconnectedEventCategory defines model for BrowserMonitorDisconnectedEvent.Category. +type BrowserMonitorDisconnectedEventCategory string -// BrowserPageNavigationSettledEventType defines model for BrowserPageNavigationSettledEvent.Type. -type BrowserPageNavigationSettledEventType string +// BrowserMonitorDisconnectedEventType defines model for BrowserMonitorDisconnectedEvent.Type. +type BrowserMonitorDisconnectedEventType string -// BrowserPageTabOpenedEvent A new browser tab or target was opened (CDP Target.attachedToTarget for page targets). Fires before a CDP session is attached to the new target, so `session_id`, `frame_id`, `loader_id`, and `nav_seq` are absent; this event does not compose `BrowserEventContext`. Consumers reading context fields generically should treat it as a special case. -type BrowserPageTabOpenedEvent struct { - Category BrowserPageTabOpenedEventCategory `json:"category"` - Data *BrowserPageTabOpenedEventData `json:"data,omitempty"` +// BrowserMonitorDisconnectedEventData defines model for BrowserMonitorDisconnectedEventData. +type BrowserMonitorDisconnectedEventData struct { + // Reason Reason for the disconnection. chrome_restarted: Chrome process restarted. + Reason BrowserMonitorDisconnectedEventDataReason `json:"reason"` +} + +// BrowserMonitorDisconnectedEventDataReason Reason for the disconnection. chrome_restarted: Chrome process restarted. +type BrowserMonitorDisconnectedEventDataReason string + +// BrowserMonitorInitFailedEvent The CDP session could not be initialized. +type BrowserMonitorInitFailedEvent struct { + Category BrowserMonitorInitFailedEventCategory `json:"category"` + Data *BrowserMonitorInitFailedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5453,40 +2255,26 @@ type BrowserPageTabOpenedEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageTabOpenedEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserMonitorInitFailedEventType `json:"type"` } -// BrowserPageTabOpenedEventCategory defines model for BrowserPageTabOpenedEvent.Category. -type BrowserPageTabOpenedEventCategory string - -// BrowserPageTabOpenedEventType defines model for BrowserPageTabOpenedEvent.Type. -type BrowserPageTabOpenedEventType string - -// BrowserPageTabOpenedEventData defines model for BrowserPageTabOpenedEventData. -type BrowserPageTabOpenedEventData struct { - // OpenerId Target identifier of the tab that opened this one, if any. - OpenerId *string `json:"opener_id,omitempty"` - - // TargetId CDP target identifier for the newly opened tab. - TargetId string `json:"target_id"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` +// BrowserMonitorInitFailedEventCategory defines model for BrowserMonitorInitFailedEvent.Category. +type BrowserMonitorInitFailedEventCategory string - // Title Initial page title of the new tab. - Title *string `json:"title,omitempty"` +// BrowserMonitorInitFailedEventType defines model for BrowserMonitorInitFailedEvent.Type. +type BrowserMonitorInitFailedEventType string - // Url Initial URL of the new tab. - Url string `json:"url"` +// BrowserMonitorInitFailedEventData defines model for BrowserMonitorInitFailedEventData. +type BrowserMonitorInitFailedEventData struct { + // Step The CDP method or initialization step that failed (e.g. Target.setAutoAttach). + Step string `json:"step"` } -// BrowserPlatformApiCallEvent A call that manages the browser VM rather than driving the browser, handled by the kernel-images-api server: recording lifecycle, filesystem and process management, telemetry and browser configuration. These are mostly platform-induced (e.g. profile save, replay capture) rather than agent actions. -type BrowserPlatformApiCallEvent struct { - Category BrowserPlatformApiCallEventCategory `json:"category"` - - // Data Per-call payload for `platform_api_call` events. Metadata only: a platform call carries no submitted content, so there is no `code` field as there is on `api_call`. - Data *BrowserPlatformApiCallEventData `json:"data,omitempty"` +// BrowserMonitorReconnectFailedEvent The CDP connection to Chrome could not be re-established after exhausting all reconnection attempts. No further telemetry events will arrive on this session. +type BrowserMonitorReconnectFailedEvent struct { + Category BrowserMonitorReconnectFailedEventCategory `json:"category"` + Data *BrowserMonitorReconnectFailedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5495,35 +2283,29 @@ type BrowserPlatformApiCallEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPlatformApiCallEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserMonitorReconnectFailedEventType `json:"type"` } -// BrowserPlatformApiCallEventCategory defines model for BrowserPlatformApiCallEvent.Category. -type BrowserPlatformApiCallEventCategory string - -// BrowserPlatformApiCallEventType defines model for BrowserPlatformApiCallEvent.Type. -type BrowserPlatformApiCallEventType string - -// BrowserPlatformApiCallEventData Per-call payload for `platform_api_call` events. Metadata only: a platform call carries no submitted content, so there is no `code` field as there is on `api_call`. -type BrowserPlatformApiCallEventData struct { - // DurationMs Wall-clock duration of the handler in milliseconds. - DurationMs float32 `json:"duration_ms"` - - // OperationId Matched route's operation, named as the server names its handler (e.g. `ProcessExec`, `StartRecording`). - OperationId string `json:"operation_id"` +// BrowserMonitorReconnectFailedEventCategory defines model for BrowserMonitorReconnectFailedEvent.Category. +type BrowserMonitorReconnectFailedEventCategory string - // RequestId Per-request identifier from the kernel-images-api request middleware. - RequestId string `json:"request_id"` +// BrowserMonitorReconnectFailedEventType defines model for BrowserMonitorReconnectFailedEvent.Type. +type BrowserMonitorReconnectFailedEventType string - // Status HTTP response status code. - Status int `json:"status"` +// BrowserMonitorReconnectFailedEventData defines model for BrowserMonitorReconnectFailedEventData. +type BrowserMonitorReconnectFailedEventData struct { + // Reason Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection. + Reason BrowserMonitorReconnectFailedEventDataReason `json:"reason"` } -// BrowserProxyErrorEvent A branded proxy-layer failure observed by the browser. Emitted when the metro egress host-proxy serves a branded 5xx error page whose response carries the `X-Kernel-Proxy-Error` header. Low-volume and carries a typed code. Its value is per-session and per-URL attribution for sessions that already capture the network stream: proxy failures are only observable while the CDP network collector is running, so this is an opt-in refinement of the raw network events rather than a default-on alerting signal. -type BrowserProxyErrorEvent struct { - Category BrowserProxyErrorEventCategory `json:"category"` - Data *BrowserProxyErrorEventData `json:"data,omitempty"` +// BrowserMonitorReconnectFailedEventDataReason Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection. +type BrowserMonitorReconnectFailedEventDataReason string + +// BrowserMonitorReconnectedEvent The CDP connection to Chrome was successfully re-established after a disconnection. Events emitted during the gap are lost. Computed state is reset, so navigation and network tracking restart fresh from this point. +type BrowserMonitorReconnectedEvent struct { + Category BrowserMonitorReconnectedEventCategory `json:"category"` + Data *BrowserMonitorReconnectedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5532,64 +2314,56 @@ type BrowserProxyErrorEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserProxyErrorEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserMonitorReconnectedEventType `json:"type"` } -// BrowserProxyErrorEventCategory defines model for BrowserProxyErrorEvent.Category. -type BrowserProxyErrorEventCategory string - -// BrowserProxyErrorEventType defines model for BrowserProxyErrorEvent.Type. -type BrowserProxyErrorEventType string - -// BrowserProxyErrorEventData defines model for BrowserProxyErrorEventData. -type BrowserProxyErrorEventData struct { - // Code Proxy-layer error code: the `X-Kernel-Proxy-Error` response header value from a branded 5xx error page served by the metro egress host-proxy. Values mirror what the proxy emits: destination_blocked, provider_blacklisted, provider_unreachable, proxy_unavailable, upstream_timeout, upstream_dns_failure, upstream_connect_failed. Unknown header values are dropped. - Code BrowserProxyErrorEventDataCode `json:"code"` - - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` +// BrowserMonitorReconnectedEventCategory defines model for BrowserMonitorReconnectedEvent.Category. +type BrowserMonitorReconnectedEventCategory string - // Method HTTP method of the failed request, when known. - Method *string `json:"method,omitempty"` +// BrowserMonitorReconnectedEventType defines model for BrowserMonitorReconnectedEvent.Type. +type BrowserMonitorReconnectedEventType string - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` +// BrowserMonitorReconnectedEventData defines model for BrowserMonitorReconnectedEventData. +type BrowserMonitorReconnectedEventData struct { + // ReconnectDurationMs Wall-clock time in milliseconds taken to reconnect after the disconnection. + ReconnectDurationMs int64 `json:"reconnect_duration_ms"` +} - // RequestId CDP request identifier matching the originating request. - RequestId string `json:"request_id"` +// BrowserMonitorScreenshotEvent A periodic screenshot of the browser viewport. +type BrowserMonitorScreenshotEvent struct { + Category BrowserMonitorScreenshotEventCategory `json:"category"` + Data *BrowserMonitorScreenshotEventData `json:"data,omitempty"` - // ResourceType CDP Network.ResourceType for the request, when known. - ResourceType *string `json:"resource_type,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // Status HTTP response status of the branded error page (502). - Status int `json:"status"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserMonitorScreenshotEventType `json:"type"` +} - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` +// BrowserMonitorScreenshotEventCategory defines model for BrowserMonitorScreenshotEvent.Category. +type BrowserMonitorScreenshotEventCategory string - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` +// BrowserMonitorScreenshotEventType defines model for BrowserMonitorScreenshotEvent.Type. +type BrowserMonitorScreenshotEventType string - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` +// BrowserMonitorScreenshotEventData defines model for BrowserMonitorScreenshotEventData. +type BrowserMonitorScreenshotEventData struct { + // Png Base64-encoded PNG screenshot of the browser viewport. + Png []byte `json:"png"` } -// BrowserProxyErrorEventDataCode Proxy-layer error code: the `X-Kernel-Proxy-Error` response header value from a branded 5xx error page served by the metro egress host-proxy. Values mirror what the proxy emits: destination_blocked, provider_blacklisted, provider_unreachable, proxy_unavailable, upstream_timeout, upstream_dns_failure, upstream_connect_failed. Unknown header values are dropped. -type BrowserProxyErrorEventDataCode string - -// BrowserServiceCrashedEvent A managed service exited unexpectedly. Intentional stops (e.g. operator-initiated shutdown) do not produce this event — only unexpected exits and terminal restart-give-up transitions do. -type BrowserServiceCrashedEvent struct { - Category BrowserServiceCrashedEventCategory `json:"category"` +// BrowserNetworkIdleEvent A browser network idle event emitted after a 500ms quiet period with no in-flight HTTP requests. +type BrowserNetworkIdleEvent struct { + Category BrowserNetworkIdleEventCategory `json:"category"` - // Data Per-crash payload for `service_crashed` events. Exit code and signal are not exposed by the underlying process manager on this channel, so only the service identity, the lifecycle phase the crash occurred in, and (when available) the PID are reported. - Data *BrowserServiceCrashedEventData `json:"data,omitempty"` + // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. + Data *BrowserEventContext `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5598,37 +2372,20 @@ type BrowserServiceCrashedEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserServiceCrashedEventType `json:"type"` -} - -// BrowserServiceCrashedEventCategory defines model for BrowserServiceCrashedEvent.Category. -type BrowserServiceCrashedEventCategory string - -// BrowserServiceCrashedEventType defines model for BrowserServiceCrashedEvent.Type. -type BrowserServiceCrashedEventType string - -// BrowserServiceCrashedEventData Per-crash payload for `service_crashed` events. Exit code and signal are not exposed by the underlying process manager on this channel, so only the service identity, the lifecycle phase the crash occurred in, and (when available) the PID are reported. -type BrowserServiceCrashedEventData struct { - // Phase Lifecycle phase the crash occurred in. `startup` means the process died before it ever reached a healthy running state. `running` means a previously healthy process died unexpectedly. `gave_up` means the process manager exhausted its restart attempts and stopped trying; no further `service_crashed` events will fire for this service until something restarts it. - Phase BrowserServiceCrashedEventDataPhase `json:"phase"` - - // Pid PID of the crashed process. Absent when the process manager gave up after exhausting restart attempts and is no longer tracking a live PID. - Pid *int `json:"pid,omitempty"` - - // ServiceName Program name of the crashed service (e.g. `chromium`, `mutter`, `kernel-images-api`). - ServiceName string `json:"service_name"` + Ts int64 `json:"ts"` + Type BrowserNetworkIdleEventType `json:"type"` } -// BrowserServiceCrashedEventDataPhase Lifecycle phase the crash occurred in. `startup` means the process died before it ever reached a healthy running state. `running` means a previously healthy process died unexpectedly. `gave_up` means the process manager exhausted its restart attempts and stopped trying; no further `service_crashed` events will fire for this service until something restarts it. -type BrowserServiceCrashedEventDataPhase string +// BrowserNetworkIdleEventCategory defines model for BrowserNetworkIdleEvent.Category. +type BrowserNetworkIdleEventCategory string -// BrowserSystemOomKillEvent The Linux kernel OOM-killer terminated a process inside the VM. Sourced from `/dev/kmsg`. Fires for any process killed by the kernel due to memory exhaustion, including Chrome renderer subprocesses that are not supervised. -type BrowserSystemOomKillEvent struct { - Category BrowserSystemOomKillEventCategory `json:"category"` +// BrowserNetworkIdleEventType defines model for BrowserNetworkIdleEvent.Type. +type BrowserNetworkIdleEventType string - // Data Per-kill payload for `system_oom_kill` events. - Data *BrowserSystemOomKillEventData `json:"data,omitempty"` +// BrowserNetworkLoadingFailedEvent A browser network loading failed event. If the request was already in flight when CDP attached (no prior `network_request` was emitted for it), `url`, `frame_id`, `loader_id`, and `resource_type` are absent; `BrowserEventContext` is partially populated in that case. +type BrowserNetworkLoadingFailedEvent struct { + Category BrowserNetworkLoadingFailedEventCategory `json:"category"` + Data *BrowserNetworkLoadingFailedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -5637,2265 +2394,1762 @@ type BrowserSystemOomKillEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserSystemOomKillEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserNetworkLoadingFailedEventType `json:"type"` } -// BrowserSystemOomKillEventCategory defines model for BrowserSystemOomKillEvent.Category. -type BrowserSystemOomKillEventCategory string +// BrowserNetworkLoadingFailedEventCategory defines model for BrowserNetworkLoadingFailedEvent.Category. +type BrowserNetworkLoadingFailedEventCategory string -// BrowserSystemOomKillEventType defines model for BrowserSystemOomKillEvent.Type. -type BrowserSystemOomKillEventType string +// BrowserNetworkLoadingFailedEventType defines model for BrowserNetworkLoadingFailedEvent.Type. +type BrowserNetworkLoadingFailedEventType string -// BrowserSystemOomKillEventData Per-kill payload for `system_oom_kill` events. -type BrowserSystemOomKillEventData struct { - // Constraint Why the kernel decided to OOM-kill. `none` means global memory exhaustion; `memcg` means a cgroup memory limit was hit; `cpuset` / `memory_policy` are NUMA/policy-driven kills. Absent on kernels older than 5.0 which did not emit the structured `oom-kill:` line. - Constraint *BrowserSystemOomKillEventDataConstraint `json:"constraint,omitempty"` +// BrowserNetworkLoadingFailedEventData defines model for BrowserNetworkLoadingFailedEventData. +type BrowserNetworkLoadingFailedEventData struct { + // Canceled True if the request was canceled by the browser or page script. + Canceled bool `json:"canceled"` - // MemFreeKb Free system memory in KiB at the time of the kill, derived from the `free:N` field in the kernel's Mem-Info dump. Assumes a 4 KiB page size. Does not include reclaimable caches, so a small value with a large `mem_total_kb` may still mean the system was not under hard pressure. Absent if the kernel did not emit a parseable Mem-Info section. - MemFreeKb *int `json:"mem_free_kb,omitempty"` + // ErrorText Network error description (e.g. net::ERR_CONNECTION_REFUSED). + ErrorText string `json:"error_text"` + + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` + + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` + + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` + + // RequestId CDP request identifier matching the originating network_request event. + RequestId string `json:"request_id"` + + // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. + ResourceType *string `json:"resource_type,omitempty"` + + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` - // MemTotalKb Total system memory in KiB at the time of the kill, derived from the `N pages RAM` line in the kernel's Mem-Info dump. Assumes a 4 KiB page size. Absent if the kernel did not emit a parseable Mem-Info section. - MemTotalKb *int `json:"mem_total_kb,omitempty"` + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` - // Pid PID of the killed process. - Pid int `json:"pid"` + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` - // ProcessName Comm of the killed process as reported by the kernel (max 15 chars, truncated by the kernel). - ProcessName string `json:"process_name"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` +} - // RssKb Resident set size of the killed process in KiB (sum of anon-rss, file-rss, and shmem-rss). This is the physical memory the process was using at the time of the kill. - RssKb int `json:"rss_kb"` +// BrowserNetworkRequestEvent A browser network request sent event. +type BrowserNetworkRequestEvent struct { + Category BrowserNetworkRequestEventCategory `json:"category"` + Data *BrowserNetworkRequestEventData `json:"data,omitempty"` - // TopTasks Top processes by resident-set-size at the moment of the kill, sorted descending. Sourced from the kernel's `Tasks state` table. Empty if the kernel did not emit the table. Capped at 5 entries to bound payload size. - TopTasks *[]BrowserSystemOomKillTask `json:"top_tasks,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // TriggerPid PID of the triggering process. Absent if the kernel did not emit the standard `CPU: N PID: N Comm:` header line. - TriggerPid *int `json:"trigger_pid,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // TriggerProcessName Comm of the process whose allocation request caused the kernel to invoke the OOM-killer. Often the same as `process_name` (the kernel killed the requester) but can differ when the kernel chose a different victim. Max 15 chars, truncated by the kernel. - TriggerProcessName *string `json:"trigger_process_name,omitempty"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserNetworkRequestEventType `json:"type"` } -// BrowserSystemOomKillEventDataConstraint Why the kernel decided to OOM-kill. `none` means global memory exhaustion; `memcg` means a cgroup memory limit was hit; `cpuset` / `memory_policy` are NUMA/policy-driven kills. Absent on kernels older than 5.0 which did not emit the structured `oom-kill:` line. -type BrowserSystemOomKillEventDataConstraint string +// BrowserNetworkRequestEventCategory defines model for BrowserNetworkRequestEvent.Category. +type BrowserNetworkRequestEventCategory string -// BrowserSystemOomKillTask A single process entry from the kernel's `Tasks state` dump. -type BrowserSystemOomKillTask struct { - // Name Comm of the process (max 15 chars, truncated by the kernel). - Name string `json:"name"` +// BrowserNetworkRequestEventType defines model for BrowserNetworkRequestEvent.Type. +type BrowserNetworkRequestEventType string - // Pid PID of the process. - Pid int `json:"pid"` +// BrowserNetworkRequestEventData defines model for BrowserNetworkRequestEventData. +type BrowserNetworkRequestEventData struct { + // DocumentUrl URL of the document that initiated the request. + DocumentUrl string `json:"document_url"` - // RssKb Resident set size in KiB at the moment of the kill. - RssKb int `json:"rss_kb"` -} + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` -// BrowserTargetType CDP target type of the page that produced the event. -type BrowserTargetType string + // Headers Request headers. + Headers BrowserHttpHeaders `json:"headers"` -// BrowserTelemetryCategoriesConfig Per-category telemetry capture settings for browser events. -type BrowserTelemetryCategoriesConfig struct { - // Captcha Captcha solve attempt outcomes. - Captcha *BrowserTelemetryCategoryConfig `json:"captcha,omitempty"` + // InitiatorType CDP Initiator.type indicating what caused the request, passed through as-is from Chrome. Known values include script, parser, preload, and other. + InitiatorType string `json:"initiator_type"` - // Connection Client attach/detach lifecycle for the CDP proxy and live view. - Connection *BrowserTelemetryCategoryConfig `json:"connection,omitempty"` + // IsRedirect True if this request is the result of a redirect. + IsRedirect *bool `json:"is_redirect,omitempty"` - // Console Console output (log, warn, error) and uncaught exceptions. - Console *BrowserTelemetryCategoryConfig `json:"console,omitempty"` + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` - // Control Agent-driven actions against the browser — computer-control calls, Playwright code execution, screenshots, clipboard access, and browser-control commands sent over the CDP proxy. - Control *BrowserTelemetryControlConfig `json:"control,omitempty"` + // Method HTTP method as sent on the wire (e.g. GET, POST). + Method string `json:"method"` - // Interaction User interaction events (clicks, keydowns, scroll). - Interaction *BrowserTelemetryCategoryConfig `json:"interaction,omitempty"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` - // Network HTTP request/response metadata. - Network *BrowserTelemetryCategoryConfig `json:"network,omitempty"` + // PostData Request body for POST/PUT requests, if available. + PostData *string `json:"post_data,omitempty"` - // Page Page lifecycle events (navigation, load, layout shifts, LCP). - Page *BrowserTelemetryCategoryConfig `json:"page,omitempty"` + // RedirectUrl Original URL before the redirect, present when is_redirect is true. + RedirectUrl *string `json:"redirect_url,omitempty"` - // Platform Calls that manage the VM rather than drive the browser (recording, filesystem, process, telemetry and browser configuration). Mostly platform-induced; off by default and opt-in. - Platform *BrowserTelemetryCategoryConfig `json:"platform,omitempty"` + // RequestId CDP request identifier, unique within the session. + RequestId string `json:"request_id"` - // Screenshot Periodic base64-encoded viewport screenshots. High volume; off by default and opt-in. - Screenshot *BrowserTelemetryCategoryConfig `json:"screenshot,omitempty"` + // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. + ResourceType *string `json:"resource_type,omitempty"` - // System Browser VM health, such as out-of-memory kills and managed-service crashes. - System *BrowserTelemetryCategoryConfig `json:"system,omitempty"` -} + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` -// BrowserTelemetryCategoryConfig Configuration for a single telemetry category. -type BrowserTelemetryCategoryConfig struct { - // Enabled Whether this category is captured. In PUT requests selection is opt-in: omitting this field (or the whole category) leaves the category off, so a PUT captures exactly the categories set to true. In PATCH requests, omitting this field (or sending an empty object `{}`) is a no-op; the category retains its current state. To enable or disable a category via PATCH, you must send an explicit `true` or `false`. - Enabled *bool `json:"enabled,omitempty"` -} + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` -// BrowserTelemetryCdpControlConfig Settings for the `cdp_command` events the DevTools proxy reports. -type BrowserTelemetryCdpControlConfig struct { - // ExcludedMethods Methods to leave out of the `cdp_command` stream. Omit the list (or send an empty one) to report every supported method. Exclusion is a telemetry setting only: an excluded command is still relayed to the browser unchanged, it simply produces no event. Use it to drop the highest-volume methods — `Input.dispatchMouseEvent` during a humanized cursor path, or `Page.captureScreenshot` under a screencast — without turning the whole category off. - ExcludedMethods *[]BrowserCdpCommandMethod `json:"excluded_methods,omitempty"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// BrowserTelemetryConfig Telemetry configuration for a browser. Selection is opt-in. Omit the browser key (or send an empty object) to capture the default set: lightweight operational signals (control, connection, system, captcha). Within `browser`, only the categories you set enabled: true are captured; anything omitted is off. The CDP categories (console, network, page, interaction), `screenshot` and `platform` are off by default and must be opted into. A `browser` config with nothing enabled clears the telemetry configuration. The `monitor` category (CDP collector health) is not configurable here; it flows automatically whenever a CDP category is captured. -type BrowserTelemetryConfig struct { - // Browser Per-category telemetry capture settings for browser events. - Browser *BrowserTelemetryCategoriesConfig `json:"browser,omitempty"` +// BrowserNetworkResponseEvent A browser network response received event. Fired after the response body is fully received, not when headers arrive. +type BrowserNetworkResponseEvent struct { + Category BrowserNetworkResponseEventCategory `json:"category"` + Data *BrowserNetworkResponseEventData `json:"data,omitempty"` - // Export Forwarding of captured telemetry to an external destination. Independent of what is captured: export is off unless explicitly enabled here, even when an export destination is configured. In a PUT (full replace) an omitted export block resets export to off, the same as omitted categories turn off; in a PATCH an omitted field leaves the current setting unchanged. - Export *BrowserTelemetryExportConfig `json:"export,omitempty"` -} + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` -// BrowserTelemetryControlConfig Configuration for the control category. Same `enabled` semantics as any other category, plus settings for the browser-control commands the CDP proxy reports. -type BrowserTelemetryControlConfig struct { - // Cdp Settings for the `cdp_command` events the DevTools proxy reports. - Cdp *BrowserTelemetryCdpControlConfig `json:"cdp,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // Enabled Whether this category is captured. In PUT requests selection is opt-in: omitting this field (or the whole category) leaves the category off, so a PUT captures exactly the categories set to true. In PATCH requests, omitting this field (or sending an empty object `{}`) is a no-op; the category retains its current state. To enable or disable a category via PATCH, you must send an explicit `true` or `false`. - Enabled *bool `json:"enabled,omitempty"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserNetworkResponseEventType `json:"type"` } -// BrowserTelemetryExportConfig Forwarding of captured telemetry to an external destination. Independent of what is captured: export is off unless explicitly enabled here, even when an export destination is configured. In a PUT (full replace) an omitted export block resets export to off, the same as omitted categories turn off; in a PATCH an omitted field leaves the current setting unchanged. -type BrowserTelemetryExportConfig struct { - // Otlp OTLP/HTTP export settings. - Otlp *BrowserTelemetryOTLPExportConfig `json:"otlp,omitempty"` -} +// BrowserNetworkResponseEventCategory defines model for BrowserNetworkResponseEvent.Category. +type BrowserNetworkResponseEventCategory string -// BrowserTelemetryOTLPExportConfig OTLP/HTTP export settings. -type BrowserTelemetryOTLPExportConfig struct { - // Enabled Whether captured telemetry is forwarded to the configured OTLP destination. Off by default. Has no effect (export stays inactive) when no export destination is configured. - Enabled *bool `json:"enabled,omitempty"` -} +// BrowserNetworkResponseEventType defines model for BrowserNetworkResponseEvent.Type. +type BrowserNetworkResponseEventType string -// ChromiumConfigureError Failure from batched chromium configure — includes which phase failed. -type ChromiumConfigureError struct { - Message string `json:"message"` +// BrowserNetworkResponseEventData defines model for BrowserNetworkResponseEventData. +type BrowserNetworkResponseEventData struct { + // Body Truncated response body, present only for text MIME types. + Body *string `json:"body,omitempty"` - // Phase configure_phase maps to restart/filesystem/policy/extension/profile/display work; navigate_phase is retained for compatibility. - Phase ChromiumConfigureErrorPhase `json:"phase"` + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` - // Step Optional configure step that failed. - Step *ChromiumConfigureErrorStep `json:"step,omitempty"` -} + // Headers Response headers. + Headers BrowserHttpHeaders `json:"headers"` -// ChromiumConfigureErrorPhase configure_phase maps to restart/filesystem/policy/extension/profile/display work; navigate_phase is retained for compatibility. -type ChromiumConfigureErrorPhase string + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` -// ChromiumConfigureErrorStep Optional configure step that failed. -type ChromiumConfigureErrorStep string + // Method HTTP method of the original request. + Method string `json:"method"` -// ClickMouseRequest defines model for ClickMouseRequest. -type ClickMouseRequest struct { - // Button Mouse button to interact with - Button *ClickMouseRequestButton `json:"button,omitempty"` + // MimeType MIME type of the response (e.g. text/html, application/json). + MimeType *string `json:"mime_type,omitempty"` - // ClickType Type of click action - ClickType *ClickMouseRequestClickType `json:"click_type,omitempty"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` - // HoldKeys Modifier keys to hold during the click - HoldKeys *[]string `json:"hold_keys,omitempty"` + // RequestId CDP request identifier matching the originating network_request event. + RequestId string `json:"request_id"` - // NumClicks Number of times to repeat the click - NumClicks *int `json:"num_clicks,omitempty"` + // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. + ResourceType *string `json:"resource_type,omitempty"` - // X X coordinate of the click position - X int `json:"x"` + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` - // Y Y coordinate of the click position - Y int `json:"y"` -} + // Status HTTP response status code. + Status int `json:"status"` -// ClickMouseRequestButton Mouse button to interact with -type ClickMouseRequestButton string + // StatusText HTTP response status text (e.g. OK, Not Found). + StatusText *string `json:"status_text,omitempty"` -// ClickMouseRequestClickType Type of click action -type ClickMouseRequestClickType string + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` -// ClipboardContent defines model for ClipboardContent. -type ClipboardContent struct { - // Text Current clipboard text content - Text string `json:"text"` + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// ComputerAction A single computer action to execute as part of a batch. The `type` field selects which -// action to perform, and the corresponding field contains the action parameters. -// Exactly one action field matching the type must be provided. -type ComputerAction struct { - ClickMouse *ClickMouseRequest `json:"click_mouse,omitempty"` - DragMouse *DragMouseRequest `json:"drag_mouse,omitempty"` - MoveMouse *MoveMouseRequest `json:"move_mouse,omitempty"` - PressKey *PressKeyRequest `json:"press_key,omitempty"` - Scroll *ScrollRequest `json:"scroll,omitempty"` - SetCursor *SetCursorRequest `json:"set_cursor,omitempty"` +// BrowserPageCrashedEvent A page's renderer process crashed (an "Aw, Snap!" failure) while the browser process itself stayed alive. Reported on the crashed page's session, with the session and target ids on `source.metadata`. Captured only while the `page` category is enabled. +type BrowserPageCrashedEvent struct { + Category BrowserPageCrashedEventCategory `json:"category"` + Data *BrowserPageCrashedEventData `json:"data,omitempty"` - // Sleep Pause execution for a specified duration. - Sleep *SleepAction `json:"sleep,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // Type The type of action to perform. - Type ComputerActionType `json:"type"` - TypeText *TypeTextRequest `json:"type_text,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageCrashedEventType `json:"type"` } -// ComputerActionType The type of action to perform. -type ComputerActionType string +// BrowserPageCrashedEventCategory defines model for BrowserPageCrashedEvent.Category. +type BrowserPageCrashedEventCategory string -// CreateDirectoryRequest defines model for CreateDirectoryRequest. -type CreateDirectoryRequest struct { - // Mode Optional directory mode (octal string, e.g. 755). Defaults to 755. - Mode *string `json:"mode,omitempty"` +// BrowserPageCrashedEventType defines model for BrowserPageCrashedEvent.Type. +type BrowserPageCrashedEventType string + +// BrowserPageCrashedEventData defines model for BrowserPageCrashedEventData. +type BrowserPageCrashedEventData struct { + // TargetId CDP target identifier of the crashed page. + TargetId string `json:"target_id"` - // Path Absolute directory path to create. - Path string `json:"path"` -} + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` -// DeletePathRequest defines model for DeletePathRequest. -type DeletePathRequest struct { - // Path Absolute path to delete. - Path string `json:"path"` + // Url URL the page was on when its renderer process crashed. + Url string `json:"url"` } -// DeleteRecordingRequest defines model for DeleteRecordingRequest. -type DeleteRecordingRequest struct { - // Id Identifier of the recording session to delete, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the default recording session is deleted. - Id *string `json:"id,omitempty"` -} +// BrowserPageDomContentLoadedEvent A browser DOMContentLoaded event (CDP Page.domContentEventFired). +type BrowserPageDomContentLoadedEvent struct { + Category BrowserPageDomContentLoadedEventCategory `json:"category"` + Data *BrowserPageDomContentLoadedEventData `json:"data,omitempty"` -// DisplayConfig defines model for DisplayConfig. -type DisplayConfig struct { - // Height Current display height in pixels - Height *int `json:"height,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // RefreshRate Current display refresh rate in Hz (may be null if not detectable) - RefreshRate *int `json:"refresh_rate,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // Width Current display width in pixels - Width *int `json:"width,omitempty"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageDomContentLoadedEventType `json:"type"` } -// DragMouseRequest defines model for DragMouseRequest. -type DragMouseRequest struct { - // Button Mouse button to drag with - Button *DragMouseRequestButton `json:"button,omitempty"` +// BrowserPageDomContentLoadedEventCategory defines model for BrowserPageDomContentLoadedEvent.Category. +type BrowserPageDomContentLoadedEventCategory string - // Delay Delay in milliseconds between button down and starting to move along the path. - Delay *int `json:"delay,omitempty"` +// BrowserPageDomContentLoadedEventType defines model for BrowserPageDomContentLoadedEvent.Type. +type BrowserPageDomContentLoadedEventType string - // DurationMs Target total duration in milliseconds for the entire drag movement when smooth=true. Omit for automatic timing based on total path length. - DurationMs *int `json:"duration_ms,omitempty"` +// BrowserPageDomContentLoadedEventData defines model for BrowserPageDomContentLoadedEventData. +type BrowserPageDomContentLoadedEventData struct { + // CdpTimestamp Chrome monotonic clock value in seconds at which DOMContentLoaded fired, relative to browser process start (not Unix epoch). Use `ts` for wall-clock time. + CdpTimestamp float32 `json:"cdp_timestamp"` - // HoldKeys Modifier keys to hold during the drag - HoldKeys *[]string `json:"hold_keys,omitempty"` + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` - // Path Ordered list of [x, y] coordinate pairs to move through while dragging. Must contain at least 2 points. - Path [][]int `json:"path"` + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` - // Smooth Use human-like Bezier curves between path waypoints instead of linear interpolation. When true, steps_per_segment and step_delay_ms are ignored. - Smooth *bool `json:"smooth,omitempty"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` - // StepDelayMs Delay in milliseconds between relative steps while dragging. Ignored when smooth=true. - StepDelayMs *int `json:"step_delay_ms,omitempty"` + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` - // StepsPerSegment Number of relative move steps per segment in the path. Ignored when smooth=true. Minimum 1. - StepsPerSegment *int `json:"steps_per_segment,omitempty"` -} + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` -// DragMouseRequestButton Mouse button to drag with -type DragMouseRequestButton string + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` -// Error defines model for Error. -type Error struct { - Message string `json:"message"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// ExecutePlaywrightRequest Request to execute Playwright code -type ExecutePlaywrightRequest struct { - // Code TypeScript/JavaScript code to execute. The code has access to 'page', 'context', and 'browser' variables. - // Example: "await page.goto('https://example.com'); return await page.title();" - Code string `json:"code"` +// BrowserPageLayoutSettledEvent A browser layout settled event emitted 1 second after page load with no intervening layout shifts, indicating visual stability. Each layout shift resets the 1-second timer. +type BrowserPageLayoutSettledEvent struct { + Category BrowserPageLayoutSettledEventCategory `json:"category"` - // TimeoutSec Maximum execution time in seconds. Default is 60. - TimeoutSec *int `json:"timeout_sec,omitempty"` + // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. + Data *BrowserEventContext `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageLayoutSettledEventType `json:"type"` } -// ExecutePlaywrightResult Result of Playwright code execution -type ExecutePlaywrightResult struct { - // Error Error message if execution failed - Error *string `json:"error,omitempty"` +// BrowserPageLayoutSettledEventCategory defines model for BrowserPageLayoutSettledEvent.Category. +type BrowserPageLayoutSettledEventCategory string - // Result The value returned by the code (if any) - Result interface{} `json:"result,omitempty"` +// BrowserPageLayoutSettledEventType defines model for BrowserPageLayoutSettledEvent.Type. +type BrowserPageLayoutSettledEventType string - // Stderr Standard error from the execution - Stderr *string `json:"stderr,omitempty"` +// BrowserPageLayoutShiftEvent A browser cumulative layout shift (CLS) event from the Performance Timeline API. +type BrowserPageLayoutShiftEvent struct { + Category BrowserPageLayoutShiftEventCategory `json:"category"` + Data *BrowserPageLayoutShiftEventData `json:"data,omitempty"` - // Stdout Standard output from the execution - Stdout *string `json:"stdout,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // Success Whether the code executed successfully - Success bool `json:"success"` -} + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` -// FileInfo defines model for FileInfo. -type FileInfo struct { - // IsDir Whether the path is a directory. - IsDir bool `json:"is_dir"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageLayoutShiftEventType `json:"type"` +} - // ModTime Last modification time. - ModTime time.Time `json:"mod_time"` +// BrowserPageLayoutShiftEventCategory defines model for BrowserPageLayoutShiftEvent.Category. +type BrowserPageLayoutShiftEventCategory string - // Mode File mode bits (e.g., "drwxr-xr-x" or "-rw-r--r--"). - Mode string `json:"mode"` +// BrowserPageLayoutShiftEventType defines model for BrowserPageLayoutShiftEvent.Type. +type BrowserPageLayoutShiftEventType string - // Name Base name of the file or directory. - Name string `json:"name"` +// BrowserPageLayoutShiftEventData defines model for BrowserPageLayoutShiftEventData. +type BrowserPageLayoutShiftEventData struct { + // Duration Duration of the layout shift entry in milliseconds (always 0 for layout shifts per spec). + Duration float32 `json:"duration"` - // Path Absolute path. - Path string `json:"path"` + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` - // SizeBytes Size in bytes. 0 for directories. - SizeBytes int `json:"size_bytes"` -} + // LayoutShiftDetails PerformanceLayoutShift attributes from the Performance Timeline entry. + LayoutShiftDetails *struct { + // HadRecentInput True if the layout shift was preceded by user input within 500ms, excluding it from CLS. + HadRecentInput *bool `json:"had_recent_input,omitempty"` -// FileSystemEvent Filesystem change event. -type FileSystemEvent struct { - // IsDir Whether the affected path is a directory. - IsDir *bool `json:"is_dir,omitempty"` + // Value Layout shift score for this entry (contribution to CLS). + Value *float32 `json:"value,omitempty"` + } `json:"layout_shift_details,omitempty"` - // Name Base name of the file or directory affected. - Name *string `json:"name,omitempty"` + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` - // Path Absolute path of the file or directory. - Path string `json:"path"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` - // Type Event type. - Type FileSystemEventType `json:"type"` -} + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` -// FileSystemEventType Event type. -type FileSystemEventType string + // SourceFrameId CDP frame identifier of the frame where the layout shift occurred. + SourceFrameId string `json:"source_frame_id"` -// KnownBrowserTelemetryEvent Discriminated union of browser telemetry events emitted by the Kernel image. This is a structural taxonomy: any event on the telemetry stream whose `data` conforms to one of the variants below (selected by `type`) is a `KnownBrowserTelemetryEvent`, regardless of who published it. Caller-published events via POST /telemetry/events are not constrained to this union; see `TelemetryEvent` for the wire shape. Validation of caller payloads against this taxonomy is the consumer's responsibility. -type KnownBrowserTelemetryEvent struct { - union json.RawMessage -} + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` -// ListFiles Array of file or directory information entries. -type ListFiles = []FileInfo + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` -// LogEvent A log entry from the application. -type LogEvent struct { - // Message Log message text. - Message string `json:"message"` + // Time Performance Timeline timestamp of the layout shift in milliseconds. + Time float32 `json:"time"` - // Timestamp Time the log entry was produced. - Timestamp time.Time `json:"timestamp"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// MarkRecordingRequest defines model for MarkRecordingRequest. -type MarkRecordingRequest struct { - // Id Identifier of the recording session to mark, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the marker is added to the default recording session. - Id *string `json:"id,omitempty"` +// BrowserPageLcpEvent A browser Largest Contentful Paint (LCP) event from the Performance Timeline API. +type BrowserPageLcpEvent struct { + Category BrowserPageLcpEventCategory `json:"category"` + Data *BrowserPageLcpEventData `json:"data,omitempty"` - // Name Name of the marker, used as the MP4 chapter title. - Name string `json:"name"` -} + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` -// MarkRecordingResult defines model for MarkRecordingResult. -type MarkRecordingResult struct { - // Name Name of the recorded marker. - Name string `json:"name"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // OffsetMs Provisional offset of the marker from the recording start, in milliseconds, measured against the start time at mark time. The authoritative offset is the chapter start written at finalize. - OffsetMs int64 `json:"offset_ms"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageLcpEventType `json:"type"` } -// MousePositionResponse defines model for MousePositionResponse. -type MousePositionResponse struct { - // X X coordinate of the cursor - X int `json:"x"` +// BrowserPageLcpEventCategory defines model for BrowserPageLcpEvent.Category. +type BrowserPageLcpEventCategory string - // Y Y coordinate of the cursor - Y int `json:"y"` -} +// BrowserPageLcpEventType defines model for BrowserPageLcpEvent.Type. +type BrowserPageLcpEventType string -// MoveMouseRequest defines model for MoveMouseRequest. -type MoveMouseRequest struct { - // DurationMs Target total duration in milliseconds for the mouse movement when smooth=true. Omit for automatic timing based on distance. - DurationMs *int `json:"duration_ms,omitempty"` +// BrowserPageLcpEventData defines model for BrowserPageLcpEventData. +type BrowserPageLcpEventData struct { + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` + + // LcpDetails LargestContentfulPaint attributes from the Performance Timeline entry. + LcpDetails *struct { + // ElementId id attribute of the LCP element, if present. + ElementId *string `json:"element_id,omitempty"` + + // LoadTime Load time of the LCP element in milliseconds. + LoadTime *float32 `json:"load_time,omitempty"` - // HoldKeys Modifier keys to hold during the move - HoldKeys *[]string `json:"hold_keys,omitempty"` + // NodeId CDP DOM node identifier of the LCP element. + NodeId *int `json:"node_id,omitempty"` - // Smooth Use human-like Bezier curve path instead of instant mouse movement. - Smooth *bool `json:"smooth,omitempty"` + // RenderTime Render time of the LCP element in milliseconds; 0 for cross-origin images without Timing-Allow-Origin. + RenderTime *float32 `json:"render_time,omitempty"` - // X X coordinate to move the cursor to - X int `json:"x"` + // Size Visible area of the LCP element in pixels squared. + Size *float32 `json:"size,omitempty"` - // Y Y coordinate to move the cursor to - Y int `json:"y"` -} + // Url URL of the LCP element for image or video elements. + Url *string `json:"url,omitempty"` + } `json:"lcp_details,omitempty"` -// MovePathRequest defines model for MovePathRequest. -type MovePathRequest struct { - // DestPath Absolute destination path. - DestPath string `json:"dest_path"` + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` - // SrcPath Absolute source path. - SrcPath string `json:"src_path"` -} + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` -// OkResponse Generic OK response. -type OkResponse struct { - // Ok Indicates success. - Ok bool `json:"ok"` -} + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` -// PatchDisplayRequest defines model for PatchDisplayRequest. -type PatchDisplayRequest struct { - // Height Display height in pixels - Height *int `json:"height,omitempty"` + // SourceFrameId CDP frame identifier of the frame where the LCP element was rendered. + SourceFrameId string `json:"source_frame_id"` - // RefreshRate Display refresh rate in Hz. If omitted, uses the highest available rate for the resolution. - RefreshRate *PatchDisplayRequestRefreshRate `json:"refresh_rate,omitempty"` + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` - // RequireIdle If true, refuse to resize when live view or recording/replay is active. - RequireIdle *bool `json:"require_idle,omitempty"` + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` - // RestartChromium If true, restart Chromium after resolution change to ensure it adapts to new size. Default is false for headful, true for headless. - RestartChromium *bool `json:"restart_chromium,omitempty"` + // Time Performance Timeline timestamp of the LCP entry in milliseconds. + Time float32 `json:"time"` - // Width Display width in pixels - Width *int `json:"width,omitempty"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// PatchDisplayRequestRefreshRate Display refresh rate in Hz. If omitted, uses the highest available rate for the resolution. -type PatchDisplayRequestRefreshRate int +// BrowserPageLoadEvent A browser page load event (CDP Page.loadEventFired). +type BrowserPageLoadEvent struct { + Category BrowserPageLoadEventCategory `json:"category"` + Data *BrowserPageLoadEventData `json:"data,omitempty"` -// PressKeyRequest defines model for PressKeyRequest. -type PressKeyRequest struct { - // Duration Duration to hold the keys down in milliseconds. If omitted or 0, keys are tapped. - Duration *int `json:"duration,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // HoldKeys Optional modifier keys to hold during the key press sequence. - HoldKeys *[]string `json:"hold_keys,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // Keys List of key symbols to press. Each item should be a key symbol supported by xdotool - // (see X11 keysym definitions). Examples include "Return", "Shift", "Ctrl", "Alt", "F5". - // Items in this list could also be combinations, e.g. "Ctrl+t" or "Ctrl+Shift+Tab". - Keys []string `json:"keys"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageLoadEventType `json:"type"` } -// ProcessExecRequest Request to execute a command synchronously. -type ProcessExecRequest struct { - // Args Command arguments. - Args *[]string `json:"args,omitempty"` +// BrowserPageLoadEventCategory defines model for BrowserPageLoadEvent.Category. +type BrowserPageLoadEventCategory string - // AsRoot Run the process with root privileges. - AsRoot *bool `json:"as_root,omitempty"` +// BrowserPageLoadEventType defines model for BrowserPageLoadEvent.Type. +type BrowserPageLoadEventType string - // AsUser Run the process as this user. - AsUser *string `json:"as_user,omitempty"` +// BrowserPageLoadEventData defines model for BrowserPageLoadEventData. +type BrowserPageLoadEventData struct { + // CdpTimestamp Chrome monotonic clock value in seconds at which the load event fired, relative to browser process start (not Unix epoch). Use `ts` for wall-clock time. + CdpTimestamp float32 `json:"cdp_timestamp"` - // Command Executable or shell command to run. - Command string `json:"command"` + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` - // Cwd Working directory (absolute path) to run the command in. - Cwd *string `json:"cwd,omitempty"` + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` - // Env Environment variables to set for the process. - Env *map[string]string `json:"env,omitempty"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` - // TimeoutSec Maximum execution time in seconds. - TimeoutSec *int `json:"timeout_sec,omitempty"` + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` + + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// ProcessExecResult Result of a synchronous command execution. -type ProcessExecResult struct { - // DurationMs Execution duration in milliseconds. - DurationMs *int `json:"duration_ms,omitempty"` +// BrowserPageNavigationEvent A browser page navigation started event (CDP Page.frameNavigated). Carries nav context fields inline but not nav_seq, as this event resets the navigation epoch. +type BrowserPageNavigationEvent struct { + Category BrowserPageNavigationEventCategory `json:"category"` + Data *BrowserPageNavigationEventData `json:"data,omitempty"` - // ExitCode Process exit code. - ExitCode *int `json:"exit_code,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // StderrB64 Base64-encoded stderr buffer. - StderrB64 *string `json:"stderr_b64,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // StdoutB64 Base64-encoded stdout buffer. - StdoutB64 *string `json:"stdout_b64,omitempty"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageNavigationEventType `json:"type"` } -// ProcessKillRequest Signal to send to the process. -type ProcessKillRequest struct { - // Signal Signal to send. - Signal ProcessKillRequestSignal `json:"signal"` -} +// BrowserPageNavigationEventCategory defines model for BrowserPageNavigationEvent.Category. +type BrowserPageNavigationEventCategory string -// ProcessKillRequestSignal Signal to send. -type ProcessKillRequestSignal string +// BrowserPageNavigationEventType defines model for BrowserPageNavigationEvent.Type. +type BrowserPageNavigationEventType string -// ProcessResizeRequest Resize a PTY-backed process. -type ProcessResizeRequest struct { - // Cols New terminal columns. - Cols int `json:"cols"` +// BrowserPageNavigationEventData defines model for BrowserPageNavigationEventData. +type BrowserPageNavigationEventData struct { + // FrameId CDP frame identifier of the navigated frame. + FrameId string `json:"frame_id"` - // Rows New terminal rows. - Rows int `json:"rows"` -} + // LoaderId New CDP document loader identifier assigned for this navigation. + LoaderId string `json:"loader_id"` -// ProcessSpawnRequest defines model for ProcessSpawnRequest. -type ProcessSpawnRequest struct { - // AllocateTty Allocate a pseudo-terminal (PTY) for the process to enable interactive shells. - AllocateTty *bool `json:"allocate_tty,omitempty"` + // ParentFrameId Parent frame identifier for subframe navigations; absent for top-level navigations. + ParentFrameId *string `json:"parent_frame_id,omitempty"` - // Args Command arguments. - Args *[]string `json:"args,omitempty"` + // SessionId CDP session identifier. + SessionId string `json:"session_id"` - // AsRoot Run the process with root privileges. - AsRoot *bool `json:"as_root,omitempty"` + // TargetId Browser target identifier. + TargetId string `json:"target_id"` - // AsUser Run the process as this user. - AsUser *string `json:"as_user,omitempty"` + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` - // Cols Initial terminal columns when allocate_tty is true. - Cols *int `json:"cols,omitempty"` + // Url URL navigated to. + Url string `json:"url"` +} - // Command Executable or shell command to run. - Command string `json:"command"` +// BrowserPageNavigationSettledEvent Emitted when page_dom_content_loaded and page_layout_settled have both fired for the same navigation, indicating the page is loaded and visually stable. Independent of network_idle; a single pending request does not block it. +type BrowserPageNavigationSettledEvent struct { + Category BrowserPageNavigationSettledEventCategory `json:"category"` - // Cwd Working directory (absolute path) to run the command in. - Cwd *string `json:"cwd,omitempty"` + // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. + Data *BrowserEventContext `json:"data,omitempty"` - // Env Environment variables to set for the process. - Env *map[string]string `json:"env,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // Rows Initial terminal rows when allocate_tty is true. - Rows *int `json:"rows,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // TimeoutSec Maximum execution time in seconds. - TimeoutSec *int `json:"timeout_sec,omitempty"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageNavigationSettledEventType `json:"type"` } -// ProcessSpawnResult Information about a spawned process. -type ProcessSpawnResult struct { - // Pid OS process ID. - Pid *int `json:"pid,omitempty"` +// BrowserPageNavigationSettledEventCategory defines model for BrowserPageNavigationSettledEvent.Category. +type BrowserPageNavigationSettledEventCategory string - // ProcessId Server-assigned identifier for the process. - ProcessId *openapi_types.UUID `json:"process_id,omitempty"` +// BrowserPageNavigationSettledEventType defines model for BrowserPageNavigationSettledEvent.Type. +type BrowserPageNavigationSettledEventType string - // StartedAt Timestamp when the process started. - StartedAt *time.Time `json:"started_at,omitempty"` +// BrowserPageTabOpenedEvent A new browser tab or target was opened (CDP Target.attachedToTarget for page targets). Fires before a CDP session is attached to the new target, so `session_id`, `frame_id`, `loader_id`, and `nav_seq` are absent; this event does not compose `BrowserEventContext`. Consumers reading context fields generically should treat it as a special case. +type BrowserPageTabOpenedEvent struct { + Category BrowserPageTabOpenedEventCategory `json:"category"` + Data *BrowserPageTabOpenedEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageTabOpenedEventType `json:"type"` } -// ProcessStatus Current status of a process. -type ProcessStatus struct { - // CpuPct Estimated CPU usage percentage. - CpuPct *float32 `json:"cpu_pct,omitempty"` +// BrowserPageTabOpenedEventCategory defines model for BrowserPageTabOpenedEvent.Category. +type BrowserPageTabOpenedEventCategory string - // ExitCode Exit code if the process has exited. - ExitCode *int `json:"exit_code,omitempty"` +// BrowserPageTabOpenedEventType defines model for BrowserPageTabOpenedEvent.Type. +type BrowserPageTabOpenedEventType string - // MemBytes Estimated resident memory usage in bytes. - MemBytes *int `json:"mem_bytes,omitempty"` +// BrowserPageTabOpenedEventData defines model for BrowserPageTabOpenedEventData. +type BrowserPageTabOpenedEventData struct { + // OpenerId Target identifier of the tab that opened this one, if any. + OpenerId *string `json:"opener_id,omitempty"` + + // TargetId CDP target identifier for the newly opened tab. + TargetId string `json:"target_id"` - // State Process state. - State *ProcessStatusState `json:"state,omitempty"` -} + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` -// ProcessStatusState Process state. -type ProcessStatusState string + // Title Initial page title of the new tab. + Title *string `json:"title,omitempty"` -// ProcessStdinRequest Data to write to the process standard input. -type ProcessStdinRequest struct { - // DataB64 Base64-encoded data to write. - DataB64 string `json:"data_b64"` + // Url Initial URL of the new tab. + Url string `json:"url"` } -// ProcessStdinResult Result of writing to stdin. -type ProcessStdinResult struct { - // WrittenBytes Number of bytes written. - WrittenBytes *int `json:"written_bytes,omitempty"` -} +// BrowserPlatformApiCallEvent A call that manages the browser VM rather than driving the browser, handled by the kernel-images-api server: recording lifecycle, filesystem and process management, telemetry and browser configuration. These are mostly platform-induced (e.g. profile save, replay capture) rather than agent actions. +type BrowserPlatformApiCallEvent struct { + Category BrowserPlatformApiCallEventCategory `json:"category"` -// ProcessStreamEvent SSE payload representing process output or lifecycle events. -type ProcessStreamEvent struct { - // DataB64 Base64-encoded data from the process stream. - DataB64 *string `json:"data_b64,omitempty"` + // Data Per-call payload for `platform_api_call` events. Metadata only: a platform call carries no submitted content, so there is no `code` field as there is on `api_call`. + Data *BrowserPlatformApiCallEventData `json:"data,omitempty"` - // Event Lifecycle event type. - Event *ProcessStreamEventEvent `json:"event,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // ExitCode Exit code when the event is "exit". - ExitCode *int `json:"exit_code,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // Stream Source stream of the data chunk. - Stream *ProcessStreamEventStream `json:"stream,omitempty"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPlatformApiCallEventType `json:"type"` } -// ProcessStreamEventEvent Lifecycle event type. -type ProcessStreamEventEvent string +// BrowserPlatformApiCallEventCategory defines model for BrowserPlatformApiCallEvent.Category. +type BrowserPlatformApiCallEventCategory string -// ProcessStreamEventStream Source stream of the data chunk. -type ProcessStreamEventStream string +// BrowserPlatformApiCallEventType defines model for BrowserPlatformApiCallEvent.Type. +type BrowserPlatformApiCallEventType string -// PublishEventRequest Request body for publishing an event into the telemetry stream. -type PublishEventRequest struct { - // Category Event category. Optional and advisory: for a known event `type` the server assigns the category authoritatively and ignores this field. It is only used for unknown custom types, where it is required. - Category *PublishEventRequestCategory `json:"category,omitempty"` +// BrowserPlatformApiCallEventData Per-call payload for `platform_api_call` events. Metadata only: a platform call carries no submitted content, so there is no `code` field as there is on `api_call`. +type BrowserPlatformApiCallEventData struct { + // DurationMs Wall-clock duration of the handler in milliseconds. + DurationMs float32 `json:"duration_ms"` - // Data Telemetry event payload. - Data interface{} `json:"data,omitempty"` + // OperationId Matched route's operation, named as the server names its handler (e.g. `ProcessExec`, `StartRecording`). + OperationId string `json:"operation_id"` - // Source Provenance metadata identifying which producer emitted the event. - Source *BrowserEventSource `json:"source,omitempty"` + // RequestId Per-request identifier from the kernel-images-api request middleware. + RequestId string `json:"request_id"` - // Type Event type identifier. - Type string `json:"type"` + // Status HTTP response status code. + Status int `json:"status"` } -// PublishEventRequestCategory Event category. Optional and advisory: for a known event `type` the server assigns the category authoritatively and ignores this field. It is only used for unknown custom types, where it is required. -type PublishEventRequestCategory string +// BrowserServiceCrashedEvent A managed service exited unexpectedly. Intentional stops (e.g. operator-initiated shutdown) do not produce this event — only unexpected exits and terminal restart-give-up transitions do. +type BrowserServiceCrashedEvent struct { + Category BrowserServiceCrashedEventCategory `json:"category"` -// RecorderInfo defines model for RecorderInfo. -type RecorderInfo struct { - // FinishedAt Timestamp when recording finished - FinishedAt *time.Time `json:"finished_at,omitempty"` - Id string `json:"id"` - IsRecording bool `json:"isRecording"` + // Data Per-crash payload for `service_crashed` events. Exit code and signal are not exposed by the underlying process manager on this channel, so only the service identity, the lifecycle phase the crash occurred in, and (when available) the PID are reported. + Data *BrowserServiceCrashedEventData `json:"data,omitempty"` - // StartedAt Timestamp when recording started - StartedAt *time.Time `json:"started_at,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserServiceCrashedEventType `json:"type"` } -// ScreenshotRegion defines model for ScreenshotRegion. -type ScreenshotRegion struct { - // Height Height of the region in pixels - Height int `json:"height"` +// BrowserServiceCrashedEventCategory defines model for BrowserServiceCrashedEvent.Category. +type BrowserServiceCrashedEventCategory string - // Width Width of the region in pixels - Width int `json:"width"` +// BrowserServiceCrashedEventType defines model for BrowserServiceCrashedEvent.Type. +type BrowserServiceCrashedEventType string - // X X coordinate of the region's top-left corner - X int `json:"x"` +// BrowserServiceCrashedEventData Per-crash payload for `service_crashed` events. Exit code and signal are not exposed by the underlying process manager on this channel, so only the service identity, the lifecycle phase the crash occurred in, and (when available) the PID are reported. +type BrowserServiceCrashedEventData struct { + // Phase Lifecycle phase the crash occurred in. `startup` means the process died before it ever reached a healthy running state. `running` means a previously healthy process died unexpectedly. `gave_up` means the process manager exhausted its restart attempts and stopped trying; no further `service_crashed` events will fire for this service until something restarts it. + Phase BrowserServiceCrashedEventDataPhase `json:"phase"` - // Y Y coordinate of the region's top-left corner - Y int `json:"y"` -} + // Pid PID of the crashed process. Absent when the process manager gave up after exhausting restart attempts and is no longer tracking a live PID. + Pid *int `json:"pid,omitempty"` -// ScreenshotRequest defines model for ScreenshotRequest. -type ScreenshotRequest struct { - Region *ScreenshotRegion `json:"region,omitempty"` + // ServiceName Program name of the crashed service (e.g. `chromium`, `mutter`, `kernel-images-api`). + ServiceName string `json:"service_name"` } -// ScrollRequest defines model for ScrollRequest. -type ScrollRequest struct { - // DeltaX Horizontal scroll amount. Positive scrolls right, negative scrolls left. - DeltaX *int `json:"delta_x,omitempty"` +// BrowserServiceCrashedEventDataPhase Lifecycle phase the crash occurred in. `startup` means the process died before it ever reached a healthy running state. `running` means a previously healthy process died unexpectedly. `gave_up` means the process manager exhausted its restart attempts and stopped trying; no further `service_crashed` events will fire for this service until something restarts it. +type BrowserServiceCrashedEventDataPhase string - // DeltaY Vertical scroll amount. Positive scrolls down, negative scrolls up. - DeltaY *int `json:"delta_y,omitempty"` +// BrowserSystemOomKillEvent The Linux kernel OOM-killer terminated a process inside the VM. Sourced from `/dev/kmsg`. Fires for any process killed by the kernel due to memory exhaustion, including Chrome renderer subprocesses that are not supervised. +type BrowserSystemOomKillEvent struct { + Category BrowserSystemOomKillEventCategory `json:"category"` - // HoldKeys Modifier keys to hold during the scroll - HoldKeys *[]string `json:"hold_keys,omitempty"` + // Data Per-kill payload for `system_oom_kill` events. + Data *BrowserSystemOomKillEventData `json:"data,omitempty"` - // X X coordinate at which to perform the scroll - X int `json:"x"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // Y Y coordinate at which to perform the scroll - Y int `json:"y"` -} + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` -// SetCursorRequest defines model for SetCursorRequest. -type SetCursorRequest struct { - // Hidden Whether the cursor should be hidden - Hidden bool `json:"hidden"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserSystemOomKillEventType `json:"type"` } -// SetFilePermissionsRequest defines model for SetFilePermissionsRequest. -type SetFilePermissionsRequest struct { - // Group New group name or GID. - Group *string `json:"group,omitempty"` - - // Mode File mode bits (octal string, e.g. 644). - Mode string `json:"mode"` +// BrowserSystemOomKillEventCategory defines model for BrowserSystemOomKillEvent.Category. +type BrowserSystemOomKillEventCategory string - // Owner New owner username or UID. - Owner *string `json:"owner,omitempty"` +// BrowserSystemOomKillEventType defines model for BrowserSystemOomKillEvent.Type. +type BrowserSystemOomKillEventType string - // Path Absolute path whose permissions are to be changed. - Path string `json:"path"` -} +// BrowserSystemOomKillEventData Per-kill payload for `system_oom_kill` events. +type BrowserSystemOomKillEventData struct { + // Constraint Why the kernel decided to OOM-kill. `none` means global memory exhaustion; `memcg` means a cgroup memory limit was hit; `cpuset` / `memory_policy` are NUMA/policy-driven kills. Absent on kernels older than 5.0 which did not emit the structured `oom-kill:` line. + Constraint *BrowserSystemOomKillEventDataConstraint `json:"constraint,omitempty"` -// SleepAction Pause execution for a specified duration. -type SleepAction struct { - // DurationMs Duration to sleep in milliseconds. - DurationMs int `json:"duration_ms"` -} + // MemFreeKb Free system memory in KiB at the time of the kill, derived from the `free:N` field in the kernel's Mem-Info dump. Assumes a 4 KiB page size. Does not include reclaimable caches, so a small value with a large `mem_total_kb` may still mean the system was not under hard pressure. Absent if the kernel did not emit a parseable Mem-Info section. + MemFreeKb *int `json:"mem_free_kb,omitempty"` -// StartFsWatchRequest defines model for StartFsWatchRequest. -type StartFsWatchRequest struct { - // Path Directory to watch. - Path string `json:"path"` + // MemTotalKb Total system memory in KiB at the time of the kill, derived from the `N pages RAM` line in the kernel's Mem-Info dump. Assumes a 4 KiB page size. Absent if the kernel did not emit a parseable Mem-Info section. + MemTotalKb *int `json:"mem_total_kb,omitempty"` - // Recursive Whether to watch recursively. - Recursive *bool `json:"recursive,omitempty"` -} + // Pid PID of the killed process. + Pid int `json:"pid"` -// StartRecordingRequest defines model for StartRecordingRequest. -type StartRecordingRequest struct { - // Framerate Recording framerate in fps (overrides server default) - Framerate *int `json:"framerate,omitempty"` + // ProcessName Comm of the killed process as reported by the kernel (max 15 chars, truncated by the kernel). + ProcessName string `json:"process_name"` - // Id Optional identifier for this recording session, used to target it from the other /recording endpoints (stop, mark, download, delete) and allowing multiple concurrent recordings. Alphanumeric or hyphen. When omitted, the default recording session is started. - Id *string `json:"id,omitempty"` + // RssKb Resident set size of the killed process in KiB (sum of anon-rss, file-rss, and shmem-rss). This is the physical memory the process was using at the time of the kill. + RssKb int `json:"rss_kb"` - // MaxDurationInSeconds Maximum recording duration in seconds (overrides server default) - MaxDurationInSeconds *int `json:"maxDurationInSeconds,omitempty"` + // TopTasks Top processes by resident-set-size at the moment of the kill, sorted descending. Sourced from the kernel's `Tasks state` table. Empty if the kernel did not emit the table. Capped at 5 entries to bound payload size. + TopTasks *[]BrowserSystemOomKillTask `json:"top_tasks,omitempty"` - // MaxFileSizeInMB Maximum file size in MB (overrides server default) - MaxFileSizeInMB *int `json:"maxFileSizeInMB,omitempty"` + // TriggerPid PID of the triggering process. Absent if the kernel did not emit the standard `CPU: N PID: N Comm:` header line. + TriggerPid *int `json:"trigger_pid,omitempty"` - // RecordAudio Capture audio alongside video. Requires the server to have an audio source and PulseAudio socket configured (the image sets both by default). When false the recording is video-only. - RecordAudio *bool `json:"recordAudio,omitempty"` + // TriggerProcessName Comm of the process whose allocation request caused the kernel to invoke the OOM-killer. Often the same as `process_name` (the kernel killed the requester) but can differ when the kernel chose a different victim. Max 15 chars, truncated by the kernel. + TriggerProcessName *string `json:"trigger_process_name,omitempty"` } -// StopRecordingRequest defines model for StopRecordingRequest. -type StopRecordingRequest struct { - // ForceStop Immediately stop without graceful shutdown. This may result in a corrupted video file. - ForceStop *bool `json:"forceStop,omitempty"` +// BrowserSystemOomKillEventDataConstraint Why the kernel decided to OOM-kill. `none` means global memory exhaustion; `memcg` means a cgroup memory limit was hit; `cpuset` / `memory_policy` are NUMA/policy-driven kills. Absent on kernels older than 5.0 which did not emit the structured `oom-kill:` line. +type BrowserSystemOomKillEventDataConstraint string - // Id Identifier of the recording session to stop, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the default recording session is stopped. - Id *string `json:"id,omitempty"` -} +// BrowserSystemOomKillTask A single process entry from the kernel's `Tasks state` dump. +type BrowserSystemOomKillTask struct { + // Name Comm of the process (max 15 chars, truncated by the kernel). + Name string `json:"name"` -// TelemetryEnvelope The envelope assigned to a successfully published event. -type TelemetryEnvelope struct { - // Event A telemetry event. The wire-level event shape accepted by the publish endpoint and emitted on the SSE stream. Arbitrary `type` strings and `data` payloads are admitted. For browser events emitted by the Kernel image, `data` conforms to the per-type schema documented in the `Browser*Event` / `Browser*EventData` definitions, selected by `type`. - Event TelemetryEvent `json:"event"` + // Pid PID of the process. + Pid int `json:"pid"` - // Seq Process-monotonic sequence number assigned across the lifetime of the server. Use with Last-Event-ID to resume the SSE stream from this point. - Seq int64 `json:"seq"` + // RssKb Resident set size in KiB at the moment of the kill. + RssKb int `json:"rss_kb"` } -// TelemetryEvent A telemetry event. The wire-level event shape accepted by the publish endpoint and emitted on the SSE stream. Arbitrary `type` strings and `data` payloads are admitted. For browser events emitted by the Kernel image, `data` conforms to the per-type schema documented in the `Browser*Event` / `Browser*EventData` definitions, selected by `type`. -type TelemetryEvent struct { - // Category Event category. - Category *TelemetryEventCategory `json:"category,omitempty"` +// BrowserTargetType CDP target type of the page that produced the event. +type BrowserTargetType string + +// BrowserTelemetryCategoriesConfig Per-category telemetry capture settings for browser events. +type BrowserTelemetryCategoriesConfig struct { + // Captcha Captcha solve attempt outcomes. + Captcha *BrowserTelemetryCategoryConfig `json:"captcha,omitempty"` + + // Connection Client attach/detach lifecycle for the CDP proxy and live view. + Connection *BrowserTelemetryCategoryConfig `json:"connection,omitempty"` + + // Console Console output (log, warn, error) and uncaught exceptions. + Console *BrowserTelemetryCategoryConfig `json:"console,omitempty"` + + // Control Agent-driven actions against the browser — computer-control calls, Playwright code execution, screenshots and clipboard access. + Control *BrowserTelemetryCategoryConfig `json:"control,omitempty"` + + // Interaction User interaction events (clicks, keydowns, scroll). + Interaction *BrowserTelemetryCategoryConfig `json:"interaction,omitempty"` - // Data Arbitrary JSON payload. For browser events listed in `KnownBrowserTelemetryEvent`, the payload conforms to the corresponding `Browser*EventData` schema. - Data interface{} `json:"data,omitempty"` + // Network HTTP request/response metadata. + Network *BrowserTelemetryCategoryConfig `json:"network,omitempty"` - // Source Provenance metadata identifying which producer emitted the event. - Source *BrowserEventSource `json:"source,omitempty"` + // Page Page lifecycle events (navigation, load, layout shifts, LCP). + Page *BrowserTelemetryCategoryConfig `json:"page,omitempty"` - // Truncated Set by the server when the data field was truncated to fit the size limit. - Truncated *bool `json:"truncated,omitempty"` + // Platform Calls that manage the VM rather than drive the browser (recording, filesystem, process, telemetry and browser configuration). Mostly platform-induced; off by default and opt-in. + Platform *BrowserTelemetryCategoryConfig `json:"platform,omitempty"` - // Ts Unix timestamp in microseconds. Defaults to the current time when omitted. - Ts *int64 `json:"ts,omitempty"` + // Screenshot Periodic base64-encoded viewport screenshots. High volume; off by default and opt-in. + Screenshot *BrowserTelemetryCategoryConfig `json:"screenshot,omitempty"` - // Type Event type identifier. - Type string `json:"type"` + // System Browser VM health, such as out-of-memory kills and managed-service crashes. + System *BrowserTelemetryCategoryConfig `json:"system,omitempty"` } -// TelemetryEventCategory Event category. -type TelemetryEventCategory string - -// TelemetryState Current telemetry configuration. -type TelemetryState struct { - // AppliedAt Wall-clock time at which the current configuration was applied. Omitted when telemetry is not configured. - AppliedAt *time.Time `json:"applied_at,omitempty"` +// BrowserTelemetryCategoryConfig Configuration for a single telemetry category. +type BrowserTelemetryCategoryConfig struct { + // Enabled Whether this category is captured. In PUT requests selection is opt-in: omitting this field (or the whole category) leaves the category off, so a PUT captures exactly the categories set to true. In PATCH requests, omitting this field (or sending an empty object `{}`) is a no-op; the category retains its current state. To enable or disable a category via PATCH, you must send an explicit `true` or `false`. + Enabled *bool `json:"enabled,omitempty"` +} - // Config Telemetry configuration for a browser. Selection is opt-in. Omit the browser key (or send an empty object) to capture the default set: lightweight operational signals (control, connection, system, captcha). Within `browser`, only the categories you set enabled: true are captured; anything omitted is off. The CDP categories (console, network, page, interaction), `screenshot` and `platform` are off by default and must be opted into. A `browser` config with nothing enabled clears the telemetry configuration. The `monitor` category (CDP collector health) is not configurable here; it flows automatically whenever a CDP category is captured. - Config BrowserTelemetryConfig `json:"config"` +// BrowserTelemetryConfig Telemetry configuration for a browser. Selection is opt-in. Omit the browser key (or send an empty object) to capture the default set: lightweight operational signals (control, connection, system, captcha). Within `browser`, only the categories you set enabled: true are captured; anything omitted is off. The CDP categories (console, network, page, interaction), `screenshot` and `platform` are off by default and must be opted into. A `browser` config with nothing enabled clears the telemetry configuration. The `monitor` category (CDP collector health) is not configurable here; it flows automatically whenever a CDP category is captured. +type BrowserTelemetryConfig struct { + // Browser Per-category telemetry capture settings for browser events. + Browser *BrowserTelemetryCategoriesConfig `json:"browser,omitempty"` - // DroppedEvents Cumulative number of buffered events a consumer missed because it fell behind the ring, summed across consumers and configuration changes. A rising count means the stream is being produced faster than it is being read; a steady one means nothing has been lost. Always present on images that report it; absent on an image predating the field, which is not the same as zero. - DroppedEvents *int64 `json:"dropped_events,omitempty"` + // Export Forwarding of captured telemetry to an external destination. Independent of what is captured: export is off unless explicitly enabled here, even when an export destination is configured. In a PUT (full replace) an omitted export block resets export to off, the same as omitted categories turn off; in a PATCH an omitted field leaves the current setting unchanged. + Export *BrowserTelemetryExportConfig `json:"export,omitempty"` +} - // Seq Process-monotonic sequence number of the last published event. Does not reset across configuration changes. - Seq int64 `json:"seq"` +// BrowserTelemetryExportConfig Forwarding of captured telemetry to an external destination. Independent of what is captured: export is off unless explicitly enabled here, even when an export destination is configured. In a PUT (full replace) an omitted export block resets export to off, the same as omitted categories turn off; in a PATCH an omitted field leaves the current setting unchanged. +type BrowserTelemetryExportConfig struct { + // Otlp OTLP/HTTP export settings. + Otlp *BrowserTelemetryOTLPExportConfig `json:"otlp,omitempty"` } -// TypeTextRequest defines model for TypeTextRequest. -type TypeTextRequest struct { - // Delay Delay in milliseconds between keystrokes. Ignored when smooth is true. - Delay *int `json:"delay,omitempty"` +// BrowserTelemetryOTLPExportConfig OTLP/HTTP export settings. +type BrowserTelemetryOTLPExportConfig struct { + // Enabled Whether captured telemetry is forwarded to the configured OTLP destination. Off by default. Has no effect (export stays inactive) when no export destination is configured. + Enabled *bool `json:"enabled,omitempty"` +} - // Smooth Use human-like variable keystroke timing instead of a fixed delay. - // Defaults to true (same as moveMouse/dragMouse). Set to false for - // xdotool typing with an optional fixed delay between keys (delay=0 is instant). - // When true, text is typed in word-sized chunks with variable intra-word delays - // and natural inter-word pauses. The delay field is ignored when smooth is true. - Smooth *bool `json:"smooth,omitempty"` +// ChromiumConfigureError Failure from batched chromium configure — includes which phase failed. +type ChromiumConfigureError struct { + Message string `json:"message"` - // Text Text to type on the host computer - Text string `json:"text"` + // Phase configure_phase maps to restart/filesystem/policy/extension/profile/display work; navigate_phase is retained for compatibility. + Phase ChromiumConfigureErrorPhase `json:"phase"` - // TypoChance Per-character typo injection rate; mistakes are corrected with backspace. - // Default 0. Only applies when smooth is true (silently ignored when - // smooth is false). - TypoChance *float32 `json:"typo_chance,omitempty"` + // Step Optional configure step that failed. + Step *ChromiumConfigureErrorStep `json:"step,omitempty"` } -// WriteClipboardRequest defines model for WriteClipboardRequest. -type WriteClipboardRequest struct { - // Text Text to write to the system clipboard - Text string `json:"text"` -} +// ChromiumConfigureErrorPhase configure_phase maps to restart/filesystem/policy/extension/profile/display work; navigate_phase is retained for compatibility. +type ChromiumConfigureErrorPhase string -// BadRequestError defines model for BadRequestError. -type BadRequestError = Error +// ChromiumConfigureErrorStep Optional configure step that failed. +type ChromiumConfigureErrorStep string -// ConflictError defines model for ConflictError. -type ConflictError = Error +// ClickMouseRequest defines model for ClickMouseRequest. +type ClickMouseRequest struct { + // Button Mouse button to interact with + Button *ClickMouseRequestButton `json:"button,omitempty"` -// InternalError defines model for InternalError. -type InternalError = Error + // ClickType Type of click action + ClickType *ClickMouseRequestClickType `json:"click_type,omitempty"` -// NotFoundError defines model for NotFoundError. -type NotFoundError = Error + // HoldKeys Modifier keys to hold during the click + HoldKeys *[]string `json:"hold_keys,omitempty"` -// PatchChromiumFlagsJSONBody defines parameters for PatchChromiumFlags. -type PatchChromiumFlagsJSONBody struct { - // Flags Chromium flags to merge (e.g., ["--kiosk", "--disable-gpu"]) - Flags []string `json:"flags"` + // NumClicks Number of times to repeat the click + NumClicks *int `json:"num_clicks,omitempty"` + + // X X coordinate of the click position + X int `json:"x"` + + // Y Y coordinate of the click position + Y int `json:"y"` } -// PatchChromiumPoliciesJSONBody defines parameters for PatchChromiumPolicies. -type PatchChromiumPoliciesJSONBody map[string]interface{} +// ClickMouseRequestButton Mouse button to interact with +type ClickMouseRequestButton string -// UploadExtensionsAndRestartMultipartBody defines parameters for UploadExtensionsAndRestart. -type UploadExtensionsAndRestartMultipartBody struct { - // Extensions List of extensions to upload and activate - Extensions []struct { - // Name Folder name to place the extension under /home/kernel/extensions/ - Name string `json:"name"` +// ClickMouseRequestClickType Type of click action +type ClickMouseRequestClickType string - // ZipFile Zip archive containing an unpacked Chromium extension (must include manifest.json) - ZipFile openapi_types.File `json:"zip_file"` - } `json:"extensions"` +// ClipboardContent defines model for ClipboardContent. +type ClipboardContent struct { + // Text Current clipboard text content + Text string `json:"text"` } -// ChromiumConfigureMultipartBody defines parameters for ChromiumConfigure. -type ChromiumConfigureMultipartBody struct { - // ChromePolicies UTF-8 JSON policy override map — same semantics as PATCH /chromium/policies. - ChromePolicies *string `json:"chrome_policies,omitempty"` +// ComputerAction A single computer action to execute as part of a batch. The `type` field selects which +// action to perform, and the corresponding field contains the action parameters. +// Exactly one action field matching the type must be provided. +type ComputerAction struct { + ClickMouse *ClickMouseRequest `json:"click_mouse,omitempty"` + DragMouse *DragMouseRequest `json:"drag_mouse,omitempty"` + MoveMouse *MoveMouseRequest `json:"move_mouse,omitempty"` + PressKey *PressKeyRequest `json:"press_key,omitempty"` + Scroll *ScrollRequest `json:"scroll,omitempty"` + SetCursor *SetCursorRequest `json:"set_cursor,omitempty"` - // ChromiumFlags UTF-8 JSON object `{"flags":["--kiosk"]}` — same semantics as PATCH /chromium/flags. - ChromiumFlags *string `json:"chromium_flags,omitempty"` + // Sleep Pause execution for a specified duration. + Sleep *SleepAction `json:"sleep,omitempty"` - // Display UTF-8 JSON object matching `#/components/schemas/PatchDisplayRequest` (width/height/etc.). When combined with restart-triggering fields, the resize is applied while Chromium is stopped and Chromium is started once at the end. - Display *string `json:"display,omitempty"` + // Type The type of action to perform. + Type ComputerActionType `json:"type"` + TypeText *TypeTextRequest `json:"type_text,omitempty"` +} - // Extensions Extension zips paired with consecutive extensions.name fields (same as upload-extensions-and-restart). - Extensions *[]struct { - Name string `json:"name"` - ZipFile openapi_types.File `json:"zip_file"` - } `json:"extensions,omitempty"` +// ComputerActionType The type of action to perform. +type ComputerActionType string - // ProfileArchive tar.zst archive containing the desired `/home/kernel/user-data` profile contents. Prefer archives whose root entries are the profile files/directories themselves (for example `Default/Preferences`). Use `strip_components` only when uploading an archive that includes leading wrapper directories. - ProfileArchive *openapi_types.File `json:"profile_archive,omitempty"` +// CreateDirectoryRequest defines model for CreateDirectoryRequest. +type CreateDirectoryRequest struct { + // Mode Optional directory mode (octal string, e.g. 755). Defaults to 755. + Mode *string `json:"mode,omitempty"` - // StartUrl URL text to navigate after configure. Bare hosts are normalized to https://, length is capped at 2048 bytes, and Chrome decides which schemes are navigable. - StartUrl *string `json:"start_url,omitempty"` + // Path Absolute directory path to create. + Path string `json:"path"` +} - // StripComponents Optional number of leading path components to strip from profile_archive entries (non-negative integer as text). - StripComponents *string `json:"strip_components,omitempty"` +// DeletePathRequest defines model for DeletePathRequest. +type DeletePathRequest struct { + // Path Absolute path to delete. + Path string `json:"path"` } -// DownloadDirZipParams defines parameters for DownloadDirZip. -type DownloadDirZipParams struct { - // Path Absolute directory path to archive and download. - Path string `form:"path" json:"path"` +// DeleteRecordingRequest defines model for DeleteRecordingRequest. +type DeleteRecordingRequest struct { + // Id Identifier of the recording session to delete, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the default recording session is deleted. + Id *string `json:"id,omitempty"` } -// DownloadDirZstdParams defines parameters for DownloadDirZstd. -type DownloadDirZstdParams struct { - // Path Absolute directory path to archive and download. - Path string `form:"path" json:"path"` +// DisplayConfig defines model for DisplayConfig. +type DisplayConfig struct { + // Height Current display height in pixels + Height *int `json:"height,omitempty"` - // CompressionLevel Compression level. Higher levels produce smaller archives but take longer. - // - fastest: ~zstd level 1, maximum speed (~300-500 MB/s) - // - default: ~zstd level 3, balanced speed/ratio (~150 MB/s) - // - better: ~zstd level 7, better ratio (~50-80 MB/s) - // - best: ~zstd level 11, best ratio (~20-40 MB/s) - CompressionLevel *DownloadDirZstdParamsCompressionLevel `form:"compression_level,omitempty" json:"compression_level,omitempty"` + // RefreshRate Current display refresh rate in Hz (may be null if not detectable) + RefreshRate *int `json:"refresh_rate,omitempty"` + + // Width Current display width in pixels + Width *int `json:"width,omitempty"` } -// DownloadDirZstdParamsCompressionLevel defines parameters for DownloadDirZstd. -type DownloadDirZstdParamsCompressionLevel string +// DragMouseRequest defines model for DragMouseRequest. +type DragMouseRequest struct { + // Button Mouse button to drag with + Button *DragMouseRequestButton `json:"button,omitempty"` -// FileInfoParams defines parameters for FileInfo. -type FileInfoParams struct { - // Path Absolute path of the file or directory. - Path string `form:"path" json:"path"` -} + // Delay Delay in milliseconds between button down and starting to move along the path. + Delay *int `json:"delay,omitempty"` -// ListFilesParams defines parameters for ListFiles. -type ListFilesParams struct { - // Path Absolute directory path. - Path string `form:"path" json:"path"` -} + // DurationMs Target total duration in milliseconds for the entire drag movement when smooth=true. Omit for automatic timing based on total path length. + DurationMs *int `json:"duration_ms,omitempty"` -// ReadFileParams defines parameters for ReadFile. -type ReadFileParams struct { - // Path Absolute file path to read. - Path string `form:"path" json:"path"` -} + // HoldKeys Modifier keys to hold during the drag + HoldKeys *[]string `json:"hold_keys,omitempty"` -// UploadFilesMultipartBody defines parameters for UploadFiles. -type UploadFilesMultipartBody struct { - Files []struct { - // DestPath Absolute destination path to write the file. - DestPath string `json:"dest_path"` - File openapi_types.File `json:"file"` - } `json:"files"` -} + // Path Ordered list of [x, y] coordinate pairs to move through while dragging. Must contain at least 2 points. + Path [][]int `json:"path"` -// UploadZipMultipartBody defines parameters for UploadZip. -type UploadZipMultipartBody struct { - // DestPath Absolute destination directory to extract the archive to. - DestPath string `json:"dest_path"` - ZipFile openapi_types.File `json:"zip_file"` + // Smooth Use human-like Bezier curves between path waypoints instead of linear interpolation. When true, steps_per_segment and step_delay_ms are ignored. + Smooth *bool `json:"smooth,omitempty"` + + // StepDelayMs Delay in milliseconds between relative steps while dragging. Ignored when smooth=true. + StepDelayMs *int `json:"step_delay_ms,omitempty"` + + // StepsPerSegment Number of relative move steps per segment in the path. Ignored when smooth=true. Minimum 1. + StepsPerSegment *int `json:"steps_per_segment,omitempty"` } -// UploadZstdMultipartBody defines parameters for UploadZstd. -type UploadZstdMultipartBody struct { - // Archive The tar.zst archive file. - Archive openapi_types.File `json:"archive"` - - // DestPath Absolute destination directory to extract the archive to. - DestPath string `json:"dest_path"` +// DragMouseRequestButton Mouse button to drag with +type DragMouseRequestButton string - // StripComponents Number of leading path components to strip during extraction (like tar --strip-components). - StripComponents *int `json:"strip_components,omitempty"` +// Error defines model for Error. +type Error struct { + Message string `json:"message"` } -// WriteFileParams defines parameters for WriteFile. -type WriteFileParams struct { - // Path Destination absolute file path. - Path string `form:"path" json:"path"` +// ExecutePlaywrightRequest Request to execute Playwright code +type ExecutePlaywrightRequest struct { + // Code TypeScript/JavaScript code to execute. The code has access to 'page', 'context', and 'browser' variables. + // Example: "await page.goto('https://example.com'); return await page.title();" + Code string `json:"code"` - // Mode Optional file mode (octal string, e.g. 644). Defaults to 644. - Mode *string `form:"mode,omitempty" json:"mode,omitempty"` + // TimeoutSec Maximum execution time in seconds. Default is 60. + TimeoutSec *int `json:"timeout_sec,omitempty"` } -// LogsStreamParams defines parameters for LogsStream. -type LogsStreamParams struct { - Source LogsStreamParamsSource `form:"source" json:"source"` - Follow *bool `form:"follow,omitempty" json:"follow,omitempty"` +// ExecutePlaywrightResult Result of Playwright code execution +type ExecutePlaywrightResult struct { + // Error Error message if execution failed + Error *string `json:"error,omitempty"` - // Path only required if source is path - Path *string `form:"path,omitempty" json:"path,omitempty"` + // Result The value returned by the code (if any) + Result interface{} `json:"result,omitempty"` - // SupervisorProcess only required if source is supervisor - SupervisorProcess *string `form:"supervisor_process,omitempty" json:"supervisor_process,omitempty"` -} + // Stderr Standard error from the execution + Stderr *string `json:"stderr,omitempty"` -// LogsStreamParamsSource defines parameters for LogsStream. -type LogsStreamParamsSource string + // Stdout Standard output from the execution + Stdout *string `json:"stdout,omitempty"` -// DownloadRecordingParams defines parameters for DownloadRecording. -type DownloadRecordingParams struct { - // Id Identifier of the recording session to download, as passed to /recording/start. When omitted, the default recording session is downloaded. - Id *string `form:"id,omitempty" json:"id,omitempty"` + // Success Whether the code executed successfully + Success bool `json:"success"` } -// StreamTelemetryEventsParams defines parameters for StreamTelemetryEvents. -type StreamTelemetryEventsParams struct { - // Replay Pass `all` to start from the oldest retained event. Ring buffer caps at 1024; older events are evicted and surface as a first `id` greater than 1. - Replay *StreamTelemetryEventsParamsReplay `form:"replay,omitempty" json:"replay,omitempty"` +// FileInfo defines model for FileInfo. +type FileInfo struct { + // IsDir Whether the path is a directory. + IsDir bool `json:"is_dir"` - // LastEventID Resume after this sequence number. Omit or send 0 to start from the current position. Sequence numbers are process-monotonic, so any previous value resumes correctly from that point. Takes precedence over `replay` when both are present, so SSE auto-reconnect resumes cleanly instead of re-replaying history. - LastEventID *string `json:"Last-Event-ID,omitempty"` + // ModTime Last modification time. + ModTime time.Time `json:"mod_time"` + + // Mode File mode bits (e.g., "drwxr-xr-x" or "-rw-r--r--"). + Mode string `json:"mode"` + + // Name Base name of the file or directory. + Name string `json:"name"` + + // Path Absolute path. + Path string `json:"path"` + + // SizeBytes Size in bytes. 0 for directories. + SizeBytes int `json:"size_bytes"` } -// StreamTelemetryEventsParamsReplay defines parameters for StreamTelemetryEvents. -type StreamTelemetryEventsParamsReplay string +// FileSystemEvent Filesystem change event. +type FileSystemEvent struct { + // IsDir Whether the affected path is a directory. + IsDir *bool `json:"is_dir,omitempty"` -// PatchChromiumFlagsJSONRequestBody defines body for PatchChromiumFlags for application/json ContentType. -type PatchChromiumFlagsJSONRequestBody PatchChromiumFlagsJSONBody + // Name Base name of the file or directory affected. + Name *string `json:"name,omitempty"` -// PatchChromiumPoliciesJSONRequestBody defines body for PatchChromiumPolicies for application/json ContentType. -type PatchChromiumPoliciesJSONRequestBody PatchChromiumPoliciesJSONBody + // Path Absolute path of the file or directory. + Path string `json:"path"` -// UploadExtensionsAndRestartMultipartRequestBody defines body for UploadExtensionsAndRestart for multipart/form-data ContentType. -type UploadExtensionsAndRestartMultipartRequestBody UploadExtensionsAndRestartMultipartBody + // Type Event type. + Type FileSystemEventType `json:"type"` +} -// BatchComputerActionJSONRequestBody defines body for BatchComputerAction for application/json ContentType. -type BatchComputerActionJSONRequestBody = BatchComputerActionRequest +// FileSystemEventType Event type. +type FileSystemEventType string -// ClickMouseJSONRequestBody defines body for ClickMouse for application/json ContentType. -type ClickMouseJSONRequestBody = ClickMouseRequest +// KnownBrowserTelemetryEvent Discriminated union of browser telemetry events emitted by the Kernel image. This is a structural taxonomy: any event on the telemetry stream whose `data` conforms to one of the variants below (selected by `type`) is a `KnownBrowserTelemetryEvent`, regardless of who published it. Caller-published events via POST /telemetry/events are not constrained to this union; see `TelemetryEvent` for the wire shape. Validation of caller payloads against this taxonomy is the consumer's responsibility. +type KnownBrowserTelemetryEvent struct { + union json.RawMessage +} -// WriteClipboardJSONRequestBody defines body for WriteClipboard for application/json ContentType. -type WriteClipboardJSONRequestBody = WriteClipboardRequest +// ListFiles Array of file or directory information entries. +type ListFiles = []FileInfo -// SetCursorJSONRequestBody defines body for SetCursor for application/json ContentType. -type SetCursorJSONRequestBody = SetCursorRequest +// LogEvent A log entry from the application. +type LogEvent struct { + // Message Log message text. + Message string `json:"message"` -// DragMouseJSONRequestBody defines body for DragMouse for application/json ContentType. -type DragMouseJSONRequestBody = DragMouseRequest + // Timestamp Time the log entry was produced. + Timestamp time.Time `json:"timestamp"` +} -// MoveMouseJSONRequestBody defines body for MoveMouse for application/json ContentType. -type MoveMouseJSONRequestBody = MoveMouseRequest +// MarkRecordingRequest defines model for MarkRecordingRequest. +type MarkRecordingRequest struct { + // Id Identifier of the recording session to mark, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the marker is added to the default recording session. + Id *string `json:"id,omitempty"` -// PressKeyJSONRequestBody defines body for PressKey for application/json ContentType. -type PressKeyJSONRequestBody = PressKeyRequest + // Name Name of the marker, used as the MP4 chapter title. + Name string `json:"name"` +} -// TakeScreenshotJSONRequestBody defines body for TakeScreenshot for application/json ContentType. -type TakeScreenshotJSONRequestBody = ScreenshotRequest +// MarkRecordingResult defines model for MarkRecordingResult. +type MarkRecordingResult struct { + // Name Name of the recorded marker. + Name string `json:"name"` -// ScrollJSONRequestBody defines body for Scroll for application/json ContentType. -type ScrollJSONRequestBody = ScrollRequest + // OffsetMs Provisional offset of the marker from the recording start, in milliseconds, measured against the start time at mark time. The authoritative offset is the chapter start written at finalize. + OffsetMs int64 `json:"offset_ms"` +} -// TypeTextJSONRequestBody defines body for TypeText for application/json ContentType. -type TypeTextJSONRequestBody = TypeTextRequest +// MousePositionResponse defines model for MousePositionResponse. +type MousePositionResponse struct { + // X X coordinate of the cursor + X int `json:"x"` -// ChromiumConfigureMultipartRequestBody defines body for ChromiumConfigure for multipart/form-data ContentType. -type ChromiumConfigureMultipartRequestBody ChromiumConfigureMultipartBody + // Y Y coordinate of the cursor + Y int `json:"y"` +} -// PatchDisplayJSONRequestBody defines body for PatchDisplay for application/json ContentType. -type PatchDisplayJSONRequestBody = PatchDisplayRequest +// MoveMouseRequest defines model for MoveMouseRequest. +type MoveMouseRequest struct { + // DurationMs Target total duration in milliseconds for the mouse movement when smooth=true. Omit for automatic timing based on distance. + DurationMs *int `json:"duration_ms,omitempty"` -// CreateDirectoryJSONRequestBody defines body for CreateDirectory for application/json ContentType. -type CreateDirectoryJSONRequestBody = CreateDirectoryRequest + // HoldKeys Modifier keys to hold during the move + HoldKeys *[]string `json:"hold_keys,omitempty"` -// DeleteDirectoryJSONRequestBody defines body for DeleteDirectory for application/json ContentType. -type DeleteDirectoryJSONRequestBody = DeletePathRequest + // Smooth Use human-like Bezier curve path instead of instant mouse movement. + Smooth *bool `json:"smooth,omitempty"` -// DeleteFileJSONRequestBody defines body for DeleteFile for application/json ContentType. -type DeleteFileJSONRequestBody = DeletePathRequest + // X X coordinate to move the cursor to + X int `json:"x"` -// MovePathJSONRequestBody defines body for MovePath for application/json ContentType. -type MovePathJSONRequestBody = MovePathRequest + // Y Y coordinate to move the cursor to + Y int `json:"y"` +} -// SetFilePermissionsJSONRequestBody defines body for SetFilePermissions for application/json ContentType. -type SetFilePermissionsJSONRequestBody = SetFilePermissionsRequest +// MovePathRequest defines model for MovePathRequest. +type MovePathRequest struct { + // DestPath Absolute destination path. + DestPath string `json:"dest_path"` -// UploadFilesMultipartRequestBody defines body for UploadFiles for multipart/form-data ContentType. -type UploadFilesMultipartRequestBody UploadFilesMultipartBody + // SrcPath Absolute source path. + SrcPath string `json:"src_path"` +} -// UploadZipMultipartRequestBody defines body for UploadZip for multipart/form-data ContentType. -type UploadZipMultipartRequestBody UploadZipMultipartBody +// OkResponse Generic OK response. +type OkResponse struct { + // Ok Indicates success. + Ok bool `json:"ok"` +} -// UploadZstdMultipartRequestBody defines body for UploadZstd for multipart/form-data ContentType. -type UploadZstdMultipartRequestBody UploadZstdMultipartBody +// PatchDisplayRequest defines model for PatchDisplayRequest. +type PatchDisplayRequest struct { + // Height Display height in pixels + Height *int `json:"height,omitempty"` -// StartFsWatchJSONRequestBody defines body for StartFsWatch for application/json ContentType. -type StartFsWatchJSONRequestBody = StartFsWatchRequest + // RefreshRate Display refresh rate in Hz. If omitted, uses the highest available rate for the resolution. + RefreshRate *PatchDisplayRequestRefreshRate `json:"refresh_rate,omitempty"` -// ExecutePlaywrightCodeJSONRequestBody defines body for ExecutePlaywrightCode for application/json ContentType. -type ExecutePlaywrightCodeJSONRequestBody = ExecutePlaywrightRequest + // RequireIdle If true, refuse to resize when live view or recording/replay is active. + RequireIdle *bool `json:"require_idle,omitempty"` -// ProcessExecJSONRequestBody defines body for ProcessExec for application/json ContentType. -type ProcessExecJSONRequestBody = ProcessExecRequest + // RestartChromium If true, restart Chromium after resolution change to ensure it adapts to new size. Default is false for headful, true for headless. + RestartChromium *bool `json:"restart_chromium,omitempty"` -// ProcessSpawnJSONRequestBody defines body for ProcessSpawn for application/json ContentType. -type ProcessSpawnJSONRequestBody = ProcessSpawnRequest + // Width Display width in pixels + Width *int `json:"width,omitempty"` +} -// ProcessKillJSONRequestBody defines body for ProcessKill for application/json ContentType. -type ProcessKillJSONRequestBody = ProcessKillRequest +// PatchDisplayRequestRefreshRate Display refresh rate in Hz. If omitted, uses the highest available rate for the resolution. +type PatchDisplayRequestRefreshRate int -// ProcessResizeJSONRequestBody defines body for ProcessResize for application/json ContentType. -type ProcessResizeJSONRequestBody = ProcessResizeRequest +// PressKeyRequest defines model for PressKeyRequest. +type PressKeyRequest struct { + // Duration Duration to hold the keys down in milliseconds. If omitted or 0, keys are tapped. + Duration *int `json:"duration,omitempty"` -// ProcessStdinJSONRequestBody defines body for ProcessStdin for application/json ContentType. -type ProcessStdinJSONRequestBody = ProcessStdinRequest + // HoldKeys Optional modifier keys to hold during the key press sequence. + HoldKeys *[]string `json:"hold_keys,omitempty"` -// DeleteRecordingJSONRequestBody defines body for DeleteRecording for application/json ContentType. -type DeleteRecordingJSONRequestBody = DeleteRecordingRequest + // Keys List of key symbols to press. Each item should be a key symbol supported by xdotool + // (see X11 keysym definitions). Examples include "Return", "Shift", "Ctrl", "Alt", "F5". + // Items in this list could also be combinations, e.g. "Ctrl+t" or "Ctrl+Shift+Tab". + Keys []string `json:"keys"` +} -// MarkRecordingJSONRequestBody defines body for MarkRecording for application/json ContentType. -type MarkRecordingJSONRequestBody = MarkRecordingRequest +// ProcessExecRequest Request to execute a command synchronously. +type ProcessExecRequest struct { + // Args Command arguments. + Args *[]string `json:"args,omitempty"` -// StartRecordingJSONRequestBody defines body for StartRecording for application/json ContentType. -type StartRecordingJSONRequestBody = StartRecordingRequest + // AsRoot Run the process with root privileges. + AsRoot *bool `json:"as_root,omitempty"` -// StopRecordingJSONRequestBody defines body for StopRecording for application/json ContentType. -type StopRecordingJSONRequestBody = StopRecordingRequest + // AsUser Run the process as this user. + AsUser *string `json:"as_user,omitempty"` -// PatchTelemetryJSONRequestBody defines body for PatchTelemetry for application/json ContentType. -type PatchTelemetryJSONRequestBody = BrowserTelemetryConfig + // Command Executable or shell command to run. + Command string `json:"command"` -// PutTelemetryJSONRequestBody defines body for PutTelemetry for application/json ContentType. -type PutTelemetryJSONRequestBody = BrowserTelemetryConfig + // Cwd Working directory (absolute path) to run the command in. + Cwd *string `json:"cwd,omitempty"` -// PublishTelemetryEventJSONRequestBody defines body for PublishTelemetryEvent for application/json ContentType. -type PublishTelemetryEventJSONRequestBody = PublishEventRequest + // Env Environment variables to set for the process. + Env *map[string]string `json:"env,omitempty"` -// AsBrowserCdpInputDispatchMouseEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputDispatchMouseEventCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputDispatchMouseEventCommandData() (BrowserCdpInputDispatchMouseEventCommandData, error) { - var body BrowserCdpInputDispatchMouseEventCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // TimeoutSec Maximum execution time in seconds. + TimeoutSec *int `json:"timeout_sec,omitempty"` } -// FromBrowserCdpInputDispatchMouseEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputDispatchMouseEventCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputDispatchMouseEventCommandData(v BrowserCdpInputDispatchMouseEventCommandData) error { - v.Method = "Input.dispatchMouseEvent" - b, err := json.Marshal(v) - t.union = b - return err -} +// ProcessExecResult Result of a synchronous command execution. +type ProcessExecResult struct { + // DurationMs Execution duration in milliseconds. + DurationMs *int `json:"duration_ms,omitempty"` -// MergeBrowserCdpInputDispatchMouseEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputDispatchMouseEventCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputDispatchMouseEventCommandData(v BrowserCdpInputDispatchMouseEventCommandData) error { - v.Method = "Input.dispatchMouseEvent" - b, err := json.Marshal(v) - if err != nil { - return err - } + // ExitCode Process exit code. + ExitCode *int `json:"exit_code,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // StderrB64 Base64-encoded stderr buffer. + StderrB64 *string `json:"stderr_b64,omitempty"` -// AsBrowserCdpInputDispatchKeyEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputDispatchKeyEventCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputDispatchKeyEventCommandData() (BrowserCdpInputDispatchKeyEventCommandData, error) { - var body BrowserCdpInputDispatchKeyEventCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // StdoutB64 Base64-encoded stdout buffer. + StdoutB64 *string `json:"stdout_b64,omitempty"` } -// FromBrowserCdpInputDispatchKeyEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputDispatchKeyEventCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputDispatchKeyEventCommandData(v BrowserCdpInputDispatchKeyEventCommandData) error { - v.Method = "Input.dispatchKeyEvent" - b, err := json.Marshal(v) - t.union = b - return err +// ProcessKillRequest Signal to send to the process. +type ProcessKillRequest struct { + // Signal Signal to send. + Signal ProcessKillRequestSignal `json:"signal"` } -// MergeBrowserCdpInputDispatchKeyEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputDispatchKeyEventCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputDispatchKeyEventCommandData(v BrowserCdpInputDispatchKeyEventCommandData) error { - v.Method = "Input.dispatchKeyEvent" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// ProcessKillRequestSignal Signal to send. +type ProcessKillRequestSignal string -// AsBrowserCdpInputInsertTextCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputInsertTextCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputInsertTextCommandData() (BrowserCdpInputInsertTextCommandData, error) { - var body BrowserCdpInputInsertTextCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// ProcessResizeRequest Resize a PTY-backed process. +type ProcessResizeRequest struct { + // Cols New terminal columns. + Cols int `json:"cols"` -// FromBrowserCdpInputInsertTextCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputInsertTextCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputInsertTextCommandData(v BrowserCdpInputInsertTextCommandData) error { - v.Method = "Input.insertText" - b, err := json.Marshal(v) - t.union = b - return err + // Rows New terminal rows. + Rows int `json:"rows"` } -// MergeBrowserCdpInputInsertTextCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputInsertTextCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputInsertTextCommandData(v BrowserCdpInputInsertTextCommandData) error { - v.Method = "Input.insertText" - b, err := json.Marshal(v) - if err != nil { - return err - } +// ProcessSpawnRequest defines model for ProcessSpawnRequest. +type ProcessSpawnRequest struct { + // AllocateTty Allocate a pseudo-terminal (PTY) for the process to enable interactive shells. + AllocateTty *bool `json:"allocate_tty,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // Args Command arguments. + Args *[]string `json:"args,omitempty"` -// AsBrowserCdpInputImeSetCompositionCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputImeSetCompositionCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputImeSetCompositionCommandData() (BrowserCdpInputImeSetCompositionCommandData, error) { - var body BrowserCdpInputImeSetCompositionCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} + // AsRoot Run the process with root privileges. + AsRoot *bool `json:"as_root,omitempty"` -// FromBrowserCdpInputImeSetCompositionCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputImeSetCompositionCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputImeSetCompositionCommandData(v BrowserCdpInputImeSetCompositionCommandData) error { - v.Method = "Input.imeSetComposition" - b, err := json.Marshal(v) - t.union = b - return err -} + // AsUser Run the process as this user. + AsUser *string `json:"as_user,omitempty"` -// MergeBrowserCdpInputImeSetCompositionCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputImeSetCompositionCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputImeSetCompositionCommandData(v BrowserCdpInputImeSetCompositionCommandData) error { - v.Method = "Input.imeSetComposition" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Cols Initial terminal columns when allocate_tty is true. + Cols *int `json:"cols,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // Command Executable or shell command to run. + Command string `json:"command"` -// AsBrowserCdpInputDispatchTouchEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputDispatchTouchEventCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputDispatchTouchEventCommandData() (BrowserCdpInputDispatchTouchEventCommandData, error) { - var body BrowserCdpInputDispatchTouchEventCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} + // Cwd Working directory (absolute path) to run the command in. + Cwd *string `json:"cwd,omitempty"` -// FromBrowserCdpInputDispatchTouchEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputDispatchTouchEventCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputDispatchTouchEventCommandData(v BrowserCdpInputDispatchTouchEventCommandData) error { - v.Method = "Input.dispatchTouchEvent" - b, err := json.Marshal(v) - t.union = b - return err -} + // Env Environment variables to set for the process. + Env *map[string]string `json:"env,omitempty"` -// MergeBrowserCdpInputDispatchTouchEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputDispatchTouchEventCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputDispatchTouchEventCommandData(v BrowserCdpInputDispatchTouchEventCommandData) error { - v.Method = "Input.dispatchTouchEvent" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Rows Initial terminal rows when allocate_tty is true. + Rows *int `json:"rows,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // TimeoutSec Maximum execution time in seconds. + TimeoutSec *int `json:"timeout_sec,omitempty"` } -// AsBrowserCdpInputDispatchDragEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputDispatchDragEventCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputDispatchDragEventCommandData() (BrowserCdpInputDispatchDragEventCommandData, error) { - var body BrowserCdpInputDispatchDragEventCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// ProcessSpawnResult Information about a spawned process. +type ProcessSpawnResult struct { + // Pid OS process ID. + Pid *int `json:"pid,omitempty"` -// FromBrowserCdpInputDispatchDragEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputDispatchDragEventCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputDispatchDragEventCommandData(v BrowserCdpInputDispatchDragEventCommandData) error { - v.Method = "Input.dispatchDragEvent" - b, err := json.Marshal(v) - t.union = b - return err + // ProcessId Server-assigned identifier for the process. + ProcessId *openapi_types.UUID `json:"process_id,omitempty"` + + // StartedAt Timestamp when the process started. + StartedAt *time.Time `json:"started_at,omitempty"` } -// MergeBrowserCdpInputDispatchDragEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputDispatchDragEventCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputDispatchDragEventCommandData(v BrowserCdpInputDispatchDragEventCommandData) error { - v.Method = "Input.dispatchDragEvent" - b, err := json.Marshal(v) - if err != nil { - return err - } +// ProcessStatus Current status of a process. +type ProcessStatus struct { + // CpuPct Estimated CPU usage percentage. + CpuPct *float32 `json:"cpu_pct,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // ExitCode Exit code if the process has exited. + ExitCode *int `json:"exit_code,omitempty"` -// AsBrowserCdpInputCancelDraggingCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputCancelDraggingCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputCancelDraggingCommandData() (BrowserCdpInputCancelDraggingCommandData, error) { - var body BrowserCdpInputCancelDraggingCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} + // MemBytes Estimated resident memory usage in bytes. + MemBytes *int `json:"mem_bytes,omitempty"` -// FromBrowserCdpInputCancelDraggingCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputCancelDraggingCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputCancelDraggingCommandData(v BrowserCdpInputCancelDraggingCommandData) error { - v.Method = "Input.cancelDragging" - b, err := json.Marshal(v) - t.union = b - return err + // State Process state. + State *ProcessStatusState `json:"state,omitempty"` } -// MergeBrowserCdpInputCancelDraggingCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputCancelDraggingCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputCancelDraggingCommandData(v BrowserCdpInputCancelDraggingCommandData) error { - v.Method = "Input.cancelDragging" - b, err := json.Marshal(v) - if err != nil { - return err - } +// ProcessStatusState Process state. +type ProcessStatusState string - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err +// ProcessStdinRequest Data to write to the process standard input. +type ProcessStdinRequest struct { + // DataB64 Base64-encoded data to write. + DataB64 string `json:"data_b64"` } -// AsBrowserCdpInputEmulateTouchFromMouseEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputEmulateTouchFromMouseEventCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputEmulateTouchFromMouseEventCommandData() (BrowserCdpInputEmulateTouchFromMouseEventCommandData, error) { - var body BrowserCdpInputEmulateTouchFromMouseEventCommandData - err := json.Unmarshal(t.union, &body) - return body, err +// ProcessStdinResult Result of writing to stdin. +type ProcessStdinResult struct { + // WrittenBytes Number of bytes written. + WrittenBytes *int `json:"written_bytes,omitempty"` } -// FromBrowserCdpInputEmulateTouchFromMouseEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputEmulateTouchFromMouseEventCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputEmulateTouchFromMouseEventCommandData(v BrowserCdpInputEmulateTouchFromMouseEventCommandData) error { - v.Method = "Input.emulateTouchFromMouseEvent" - b, err := json.Marshal(v) - t.union = b - return err -} +// ProcessStreamEvent SSE payload representing process output or lifecycle events. +type ProcessStreamEvent struct { + // DataB64 Base64-encoded data from the process stream. + DataB64 *string `json:"data_b64,omitempty"` -// MergeBrowserCdpInputEmulateTouchFromMouseEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputEmulateTouchFromMouseEventCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputEmulateTouchFromMouseEventCommandData(v BrowserCdpInputEmulateTouchFromMouseEventCommandData) error { - v.Method = "Input.emulateTouchFromMouseEvent" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Event Lifecycle event type. + Event *ProcessStreamEventEvent `json:"event,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // ExitCode Exit code when the event is "exit". + ExitCode *int `json:"exit_code,omitempty"` -// AsBrowserCdpInputSynthesizePinchGestureCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputSynthesizePinchGestureCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputSynthesizePinchGestureCommandData() (BrowserCdpInputSynthesizePinchGestureCommandData, error) { - var body BrowserCdpInputSynthesizePinchGestureCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // Stream Source stream of the data chunk. + Stream *ProcessStreamEventStream `json:"stream,omitempty"` } -// FromBrowserCdpInputSynthesizePinchGestureCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputSynthesizePinchGestureCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputSynthesizePinchGestureCommandData(v BrowserCdpInputSynthesizePinchGestureCommandData) error { - v.Method = "Input.synthesizePinchGesture" - b, err := json.Marshal(v) - t.union = b - return err -} +// ProcessStreamEventEvent Lifecycle event type. +type ProcessStreamEventEvent string -// MergeBrowserCdpInputSynthesizePinchGestureCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputSynthesizePinchGestureCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputSynthesizePinchGestureCommandData(v BrowserCdpInputSynthesizePinchGestureCommandData) error { - v.Method = "Input.synthesizePinchGesture" - b, err := json.Marshal(v) - if err != nil { - return err - } +// ProcessStreamEventStream Source stream of the data chunk. +type ProcessStreamEventStream string - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// PublishEventRequest Request body for publishing an event into the telemetry stream. +type PublishEventRequest struct { + // Category Event category. Optional and advisory: for a known event `type` the server assigns the category authoritatively and ignores this field. It is only used for unknown custom types, where it is required. + Category *PublishEventRequestCategory `json:"category,omitempty"` -// AsBrowserCdpInputSynthesizeScrollGestureCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputSynthesizeScrollGestureCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputSynthesizeScrollGestureCommandData() (BrowserCdpInputSynthesizeScrollGestureCommandData, error) { - var body BrowserCdpInputSynthesizeScrollGestureCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} + // Data Telemetry event payload. + Data interface{} `json:"data,omitempty"` -// FromBrowserCdpInputSynthesizeScrollGestureCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputSynthesizeScrollGestureCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputSynthesizeScrollGestureCommandData(v BrowserCdpInputSynthesizeScrollGestureCommandData) error { - v.Method = "Input.synthesizeScrollGesture" - b, err := json.Marshal(v) - t.union = b - return err + // Source Provenance metadata identifying which producer emitted the event. + Source *BrowserEventSource `json:"source,omitempty"` + + // Type Event type identifier. + Type string `json:"type"` } -// MergeBrowserCdpInputSynthesizeScrollGestureCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputSynthesizeScrollGestureCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputSynthesizeScrollGestureCommandData(v BrowserCdpInputSynthesizeScrollGestureCommandData) error { - v.Method = "Input.synthesizeScrollGesture" - b, err := json.Marshal(v) - if err != nil { - return err - } +// PublishEventRequestCategory Event category. Optional and advisory: for a known event `type` the server assigns the category authoritatively and ignores this field. It is only used for unknown custom types, where it is required. +type PublishEventRequestCategory string - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// RecorderInfo defines model for RecorderInfo. +type RecorderInfo struct { + // FinishedAt Timestamp when recording finished + FinishedAt *time.Time `json:"finished_at,omitempty"` + Id string `json:"id"` + IsRecording bool `json:"isRecording"` -// AsBrowserCdpInputSynthesizeTapGestureCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputSynthesizeTapGestureCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpInputSynthesizeTapGestureCommandData() (BrowserCdpInputSynthesizeTapGestureCommandData, error) { - var body BrowserCdpInputSynthesizeTapGestureCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // StartedAt Timestamp when recording started + StartedAt *time.Time `json:"started_at,omitempty"` } -// FromBrowserCdpInputSynthesizeTapGestureCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputSynthesizeTapGestureCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpInputSynthesizeTapGestureCommandData(v BrowserCdpInputSynthesizeTapGestureCommandData) error { - v.Method = "Input.synthesizeTapGesture" - b, err := json.Marshal(v) - t.union = b - return err -} +// ScreenshotRegion defines model for ScreenshotRegion. +type ScreenshotRegion struct { + // Height Height of the region in pixels + Height int `json:"height"` -// MergeBrowserCdpInputSynthesizeTapGestureCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputSynthesizeTapGestureCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputSynthesizeTapGestureCommandData(v BrowserCdpInputSynthesizeTapGestureCommandData) error { - v.Method = "Input.synthesizeTapGesture" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Width Width of the region in pixels + Width int `json:"width"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // X X coordinate of the region's top-left corner + X int `json:"x"` -// AsBrowserCdpDomSetFileInputFilesCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpDomSetFileInputFilesCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpDomSetFileInputFilesCommandData() (BrowserCdpDomSetFileInputFilesCommandData, error) { - var body BrowserCdpDomSetFileInputFilesCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // Y Y coordinate of the region's top-left corner + Y int `json:"y"` } -// FromBrowserCdpDomSetFileInputFilesCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpDomSetFileInputFilesCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpDomSetFileInputFilesCommandData(v BrowserCdpDomSetFileInputFilesCommandData) error { - v.Method = "DOM.setFileInputFiles" - b, err := json.Marshal(v) - t.union = b - return err +// ScreenshotRequest defines model for ScreenshotRequest. +type ScreenshotRequest struct { + Region *ScreenshotRegion `json:"region,omitempty"` } -// MergeBrowserCdpDomSetFileInputFilesCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpDomSetFileInputFilesCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpDomSetFileInputFilesCommandData(v BrowserCdpDomSetFileInputFilesCommandData) error { - v.Method = "DOM.setFileInputFiles" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// ScrollRequest defines model for ScrollRequest. +type ScrollRequest struct { + // DeltaX Horizontal scroll amount. Positive scrolls right, negative scrolls left. + DeltaX *int `json:"delta_x,omitempty"` -// AsBrowserCdpDomFocusCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpDomFocusCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpDomFocusCommandData() (BrowserCdpDomFocusCommandData, error) { - var body BrowserCdpDomFocusCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} + // DeltaY Vertical scroll amount. Positive scrolls down, negative scrolls up. + DeltaY *int `json:"delta_y,omitempty"` -// FromBrowserCdpDomFocusCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpDomFocusCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpDomFocusCommandData(v BrowserCdpDomFocusCommandData) error { - v.Method = "DOM.focus" - b, err := json.Marshal(v) - t.union = b - return err -} + // HoldKeys Modifier keys to hold during the scroll + HoldKeys *[]string `json:"hold_keys,omitempty"` -// MergeBrowserCdpDomFocusCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpDomFocusCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpDomFocusCommandData(v BrowserCdpDomFocusCommandData) error { - v.Method = "DOM.focus" - b, err := json.Marshal(v) - if err != nil { - return err - } + // X X coordinate at which to perform the scroll + X int `json:"x"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // Y Y coordinate at which to perform the scroll + Y int `json:"y"` } -// AsBrowserCdpDomScrollIntoViewIfNeededCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpDomScrollIntoViewIfNeededCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpDomScrollIntoViewIfNeededCommandData() (BrowserCdpDomScrollIntoViewIfNeededCommandData, error) { - var body BrowserCdpDomScrollIntoViewIfNeededCommandData - err := json.Unmarshal(t.union, &body) - return body, err +// SetCursorRequest defines model for SetCursorRequest. +type SetCursorRequest struct { + // Hidden Whether the cursor should be hidden + Hidden bool `json:"hidden"` } -// FromBrowserCdpDomScrollIntoViewIfNeededCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpDomScrollIntoViewIfNeededCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpDomScrollIntoViewIfNeededCommandData(v BrowserCdpDomScrollIntoViewIfNeededCommandData) error { - v.Method = "DOM.scrollIntoViewIfNeeded" - b, err := json.Marshal(v) - t.union = b - return err -} +// SetFilePermissionsRequest defines model for SetFilePermissionsRequest. +type SetFilePermissionsRequest struct { + // Group New group name or GID. + Group *string `json:"group,omitempty"` -// MergeBrowserCdpDomScrollIntoViewIfNeededCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpDomScrollIntoViewIfNeededCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpDomScrollIntoViewIfNeededCommandData(v BrowserCdpDomScrollIntoViewIfNeededCommandData) error { - v.Method = "DOM.scrollIntoViewIfNeeded" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Mode File mode bits (octal string, e.g. 644). + Mode string `json:"mode"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // Owner New owner username or UID. + Owner *string `json:"owner,omitempty"` -// AsBrowserCdpPageBringToFrontCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageBringToFrontCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageBringToFrontCommandData() (BrowserCdpPageBringToFrontCommandData, error) { - var body BrowserCdpPageBringToFrontCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // Path Absolute path whose permissions are to be changed. + Path string `json:"path"` } -// FromBrowserCdpPageBringToFrontCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageBringToFrontCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageBringToFrontCommandData(v BrowserCdpPageBringToFrontCommandData) error { - v.Method = "Page.bringToFront" - b, err := json.Marshal(v) - t.union = b - return err +// SleepAction Pause execution for a specified duration. +type SleepAction struct { + // DurationMs Duration to sleep in milliseconds. + DurationMs int `json:"duration_ms"` } -// MergeBrowserCdpPageBringToFrontCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageBringToFrontCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageBringToFrontCommandData(v BrowserCdpPageBringToFrontCommandData) error { - v.Method = "Page.bringToFront" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// StartFsWatchRequest defines model for StartFsWatchRequest. +type StartFsWatchRequest struct { + // Path Directory to watch. + Path string `json:"path"` -// AsBrowserCdpPageCaptureScreenshotCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageCaptureScreenshotCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageCaptureScreenshotCommandData() (BrowserCdpPageCaptureScreenshotCommandData, error) { - var body BrowserCdpPageCaptureScreenshotCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // Recursive Whether to watch recursively. + Recursive *bool `json:"recursive,omitempty"` } -// FromBrowserCdpPageCaptureScreenshotCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageCaptureScreenshotCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageCaptureScreenshotCommandData(v BrowserCdpPageCaptureScreenshotCommandData) error { - v.Method = "Page.captureScreenshot" - b, err := json.Marshal(v) - t.union = b - return err -} +// StartRecordingRequest defines model for StartRecordingRequest. +type StartRecordingRequest struct { + // Framerate Recording framerate in fps (overrides server default) + Framerate *int `json:"framerate,omitempty"` -// MergeBrowserCdpPageCaptureScreenshotCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageCaptureScreenshotCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageCaptureScreenshotCommandData(v BrowserCdpPageCaptureScreenshotCommandData) error { - v.Method = "Page.captureScreenshot" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Id Optional identifier for this recording session, used to target it from the other /recording endpoints (stop, mark, download, delete) and allowing multiple concurrent recordings. Alphanumeric or hyphen. When omitted, the default recording session is started. + Id *string `json:"id,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // MaxDurationInSeconds Maximum recording duration in seconds (overrides server default) + MaxDurationInSeconds *int `json:"maxDurationInSeconds,omitempty"` -// AsBrowserCdpPageCaptureSnapshotCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageCaptureSnapshotCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageCaptureSnapshotCommandData() (BrowserCdpPageCaptureSnapshotCommandData, error) { - var body BrowserCdpPageCaptureSnapshotCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} + // MaxFileSizeInMB Maximum file size in MB (overrides server default) + MaxFileSizeInMB *int `json:"maxFileSizeInMB,omitempty"` -// FromBrowserCdpPageCaptureSnapshotCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageCaptureSnapshotCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageCaptureSnapshotCommandData(v BrowserCdpPageCaptureSnapshotCommandData) error { - v.Method = "Page.captureSnapshot" - b, err := json.Marshal(v) - t.union = b - return err + // RecordAudio Capture audio alongside video. Requires the server to have an audio source and PulseAudio socket configured (the image sets both by default). When false the recording is video-only. + RecordAudio *bool `json:"recordAudio,omitempty"` } -// MergeBrowserCdpPageCaptureSnapshotCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageCaptureSnapshotCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageCaptureSnapshotCommandData(v BrowserCdpPageCaptureSnapshotCommandData) error { - v.Method = "Page.captureSnapshot" - b, err := json.Marshal(v) - if err != nil { - return err - } +// StopRecordingRequest defines model for StopRecordingRequest. +type StopRecordingRequest struct { + // ForceStop Immediately stop without graceful shutdown. This may result in a corrupted video file. + ForceStop *bool `json:"forceStop,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // Id Identifier of the recording session to stop, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the default recording session is stopped. + Id *string `json:"id,omitempty"` } -// AsBrowserCdpPageHandleJavaScriptDialogCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageHandleJavaScriptDialogCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageHandleJavaScriptDialogCommandData() (BrowserCdpPageHandleJavaScriptDialogCommandData, error) { - var body BrowserCdpPageHandleJavaScriptDialogCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// TelemetryEnvelope The envelope assigned to a successfully published event. +type TelemetryEnvelope struct { + // Event A telemetry event. The wire-level event shape accepted by the publish endpoint and emitted on the SSE stream. Arbitrary `type` strings and `data` payloads are admitted. For browser events emitted by the Kernel image, `data` conforms to the per-type schema documented in the `Browser*Event` / `Browser*EventData` definitions, selected by `type`. + Event TelemetryEvent `json:"event"` -// FromBrowserCdpPageHandleJavaScriptDialogCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageHandleJavaScriptDialogCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageHandleJavaScriptDialogCommandData(v BrowserCdpPageHandleJavaScriptDialogCommandData) error { - v.Method = "Page.handleJavaScriptDialog" - b, err := json.Marshal(v) - t.union = b - return err + // Seq Process-monotonic sequence number assigned across the lifetime of the server. Use with Last-Event-ID to resume the SSE stream from this point. + Seq int64 `json:"seq"` } -// MergeBrowserCdpPageHandleJavaScriptDialogCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageHandleJavaScriptDialogCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageHandleJavaScriptDialogCommandData(v BrowserCdpPageHandleJavaScriptDialogCommandData) error { - v.Method = "Page.handleJavaScriptDialog" - b, err := json.Marshal(v) - if err != nil { - return err - } +// TelemetryEvent A telemetry event. The wire-level event shape accepted by the publish endpoint and emitted on the SSE stream. Arbitrary `type` strings and `data` payloads are admitted. For browser events emitted by the Kernel image, `data` conforms to the per-type schema documented in the `Browser*Event` / `Browser*EventData` definitions, selected by `type`. +type TelemetryEvent struct { + // Category Event category. + Category *TelemetryEventCategory `json:"category,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // Data Arbitrary JSON payload. For browser events listed in `KnownBrowserTelemetryEvent`, the payload conforms to the corresponding `Browser*EventData` schema. + Data interface{} `json:"data,omitempty"` -// AsBrowserCdpPageNavigateCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageNavigateCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageNavigateCommandData() (BrowserCdpPageNavigateCommandData, error) { - var body BrowserCdpPageNavigateCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} + // Source Provenance metadata identifying which producer emitted the event. + Source *BrowserEventSource `json:"source,omitempty"` -// FromBrowserCdpPageNavigateCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageNavigateCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageNavigateCommandData(v BrowserCdpPageNavigateCommandData) error { - v.Method = "Page.navigate" - b, err := json.Marshal(v) - t.union = b - return err -} + // Truncated Set by the server when the data field was truncated to fit the size limit. + Truncated *bool `json:"truncated,omitempty"` -// MergeBrowserCdpPageNavigateCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageNavigateCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageNavigateCommandData(v BrowserCdpPageNavigateCommandData) error { - v.Method = "Page.navigate" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Ts Unix timestamp in microseconds. Defaults to the current time when omitted. + Ts *int64 `json:"ts,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // Type Event type identifier. + Type string `json:"type"` } -// AsBrowserCdpPageNavigateToHistoryEntryCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageNavigateToHistoryEntryCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageNavigateToHistoryEntryCommandData() (BrowserCdpPageNavigateToHistoryEntryCommandData, error) { - var body BrowserCdpPageNavigateToHistoryEntryCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// TelemetryEventCategory Event category. +type TelemetryEventCategory string -// FromBrowserCdpPageNavigateToHistoryEntryCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageNavigateToHistoryEntryCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageNavigateToHistoryEntryCommandData(v BrowserCdpPageNavigateToHistoryEntryCommandData) error { - v.Method = "Page.navigateToHistoryEntry" - b, err := json.Marshal(v) - t.union = b - return err -} +// TelemetryState Current telemetry configuration. +type TelemetryState struct { + // AppliedAt Wall-clock time at which the current configuration was applied. Omitted when telemetry is not configured. + AppliedAt *time.Time `json:"applied_at,omitempty"` -// MergeBrowserCdpPageNavigateToHistoryEntryCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageNavigateToHistoryEntryCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageNavigateToHistoryEntryCommandData(v BrowserCdpPageNavigateToHistoryEntryCommandData) error { - v.Method = "Page.navigateToHistoryEntry" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Config Telemetry configuration for a browser. Selection is opt-in. Omit the browser key (or send an empty object) to capture the default set: lightweight operational signals (control, connection, system, captcha). Within `browser`, only the categories you set enabled: true are captured; anything omitted is off. The CDP categories (console, network, page, interaction), `screenshot` and `platform` are off by default and must be opted into. A `browser` config with nothing enabled clears the telemetry configuration. The `monitor` category (CDP collector health) is not configurable here; it flows automatically whenever a CDP category is captured. + Config BrowserTelemetryConfig `json:"config"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // Seq Process-monotonic sequence number of the last published event. Does not reset across configuration changes. + Seq int64 `json:"seq"` } -// AsBrowserCdpPageReloadCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageReloadCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageReloadCommandData() (BrowserCdpPageReloadCommandData, error) { - var body BrowserCdpPageReloadCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// TypeTextRequest defines model for TypeTextRequest. +type TypeTextRequest struct { + // Delay Delay in milliseconds between keystrokes. Ignored when smooth is true. + Delay *int `json:"delay,omitempty"` -// FromBrowserCdpPageReloadCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageReloadCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageReloadCommandData(v BrowserCdpPageReloadCommandData) error { - v.Method = "Page.reload" - b, err := json.Marshal(v) - t.union = b - return err -} + // Smooth Use human-like variable keystroke timing instead of a fixed delay. + // Defaults to true (same as moveMouse/dragMouse). Set to false for + // xdotool typing with an optional fixed delay between keys (delay=0 is instant). + // When true, text is typed in word-sized chunks with variable intra-word delays + // and natural inter-word pauses. The delay field is ignored when smooth is true. + Smooth *bool `json:"smooth,omitempty"` -// MergeBrowserCdpPageReloadCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageReloadCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageReloadCommandData(v BrowserCdpPageReloadCommandData) error { - v.Method = "Page.reload" - b, err := json.Marshal(v) - if err != nil { - return err - } + // Text Text to type on the host computer + Text string `json:"text"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // TypoChance Per-character typo injection rate; mistakes are corrected with backspace. + // Default 0. Only applies when smooth is true (silently ignored when + // smooth is false). + TypoChance *float32 `json:"typo_chance,omitempty"` } -// AsBrowserCdpPagePrintToPdfCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPagePrintToPdfCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPagePrintToPdfCommandData() (BrowserCdpPagePrintToPdfCommandData, error) { - var body BrowserCdpPagePrintToPdfCommandData - err := json.Unmarshal(t.union, &body) - return body, err +// WriteClipboardRequest defines model for WriteClipboardRequest. +type WriteClipboardRequest struct { + // Text Text to write to the system clipboard + Text string `json:"text"` } -// FromBrowserCdpPagePrintToPdfCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPagePrintToPdfCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPagePrintToPdfCommandData(v BrowserCdpPagePrintToPdfCommandData) error { - v.Method = "Page.printToPDF" - b, err := json.Marshal(v) - t.union = b - return err -} +// BadRequestError defines model for BadRequestError. +type BadRequestError = Error -// MergeBrowserCdpPagePrintToPdfCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPagePrintToPdfCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPagePrintToPdfCommandData(v BrowserCdpPagePrintToPdfCommandData) error { - v.Method = "Page.printToPDF" - b, err := json.Marshal(v) - if err != nil { - return err - } +// ConflictError defines model for ConflictError. +type ConflictError = Error - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// InternalError defines model for InternalError. +type InternalError = Error -// AsBrowserCdpPageStartScreencastCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageStartScreencastCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageStartScreencastCommandData() (BrowserCdpPageStartScreencastCommandData, error) { - var body BrowserCdpPageStartScreencastCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// NotFoundError defines model for NotFoundError. +type NotFoundError = Error -// FromBrowserCdpPageStartScreencastCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageStartScreencastCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageStartScreencastCommandData(v BrowserCdpPageStartScreencastCommandData) error { - v.Method = "Page.startScreencast" - b, err := json.Marshal(v) - t.union = b - return err +// PatchChromiumFlagsJSONBody defines parameters for PatchChromiumFlags. +type PatchChromiumFlagsJSONBody struct { + // Flags Chromium flags to merge (e.g., ["--kiosk", "--disable-gpu"]) + Flags []string `json:"flags"` } -// MergeBrowserCdpPageStartScreencastCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageStartScreencastCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageStartScreencastCommandData(v BrowserCdpPageStartScreencastCommandData) error { - v.Method = "Page.startScreencast" - b, err := json.Marshal(v) - if err != nil { - return err - } +// PatchChromiumPoliciesJSONBody defines parameters for PatchChromiumPolicies. +type PatchChromiumPoliciesJSONBody map[string]interface{} - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// UploadExtensionsAndRestartMultipartBody defines parameters for UploadExtensionsAndRestart. +type UploadExtensionsAndRestartMultipartBody struct { + // Extensions List of extensions to upload and activate + Extensions []struct { + // Name Folder name to place the extension under /home/kernel/extensions/ + Name string `json:"name"` -// AsBrowserCdpPageStopScreencastCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageStopScreencastCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageStopScreencastCommandData() (BrowserCdpPageStopScreencastCommandData, error) { - var body BrowserCdpPageStopScreencastCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // ZipFile Zip archive containing an unpacked Chromium extension (must include manifest.json) + ZipFile openapi_types.File `json:"zip_file"` + } `json:"extensions"` } -// FromBrowserCdpPageStopScreencastCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageStopScreencastCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageStopScreencastCommandData(v BrowserCdpPageStopScreencastCommandData) error { - v.Method = "Page.stopScreencast" - b, err := json.Marshal(v) - t.union = b - return err -} +// ChromiumConfigureMultipartBody defines parameters for ChromiumConfigure. +type ChromiumConfigureMultipartBody struct { + // ChromePolicies UTF-8 JSON policy override map — same semantics as PATCH /chromium/policies. + ChromePolicies *string `json:"chrome_policies,omitempty"` -// MergeBrowserCdpPageStopScreencastCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageStopScreencastCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageStopScreencastCommandData(v BrowserCdpPageStopScreencastCommandData) error { - v.Method = "Page.stopScreencast" - b, err := json.Marshal(v) - if err != nil { - return err - } + // ChromiumFlags UTF-8 JSON object `{"flags":["--kiosk"]}` — same semantics as PATCH /chromium/flags. + ChromiumFlags *string `json:"chromium_flags,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // Display UTF-8 JSON object matching `#/components/schemas/PatchDisplayRequest` (width/height/etc.). When combined with restart-triggering fields, the resize is applied while Chromium is stopped and Chromium is started once at the end. + Display *string `json:"display,omitempty"` -// AsBrowserCdpPageStopLoadingCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageStopLoadingCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageStopLoadingCommandData() (BrowserCdpPageStopLoadingCommandData, error) { - var body BrowserCdpPageStopLoadingCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} + // Extensions Extension zips paired with consecutive extensions.name fields (same as upload-extensions-and-restart). + Extensions *[]struct { + Name string `json:"name"` + ZipFile openapi_types.File `json:"zip_file"` + } `json:"extensions,omitempty"` -// FromBrowserCdpPageStopLoadingCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageStopLoadingCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageStopLoadingCommandData(v BrowserCdpPageStopLoadingCommandData) error { - v.Method = "Page.stopLoading" - b, err := json.Marshal(v) - t.union = b - return err -} + // ProfileArchive tar.zst archive containing the desired `/home/kernel/user-data` profile contents. Prefer archives whose root entries are the profile files/directories themselves (for example `Default/Preferences`). Use `strip_components` only when uploading an archive that includes leading wrapper directories. + ProfileArchive *openapi_types.File `json:"profile_archive,omitempty"` -// MergeBrowserCdpPageStopLoadingCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageStopLoadingCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageStopLoadingCommandData(v BrowserCdpPageStopLoadingCommandData) error { - v.Method = "Page.stopLoading" - b, err := json.Marshal(v) - if err != nil { - return err - } + // StartUrl URL text to navigate after configure. Bare hosts are normalized to https://, length is capped at 2048 bytes, and Chrome decides which schemes are navigable. + StartUrl *string `json:"start_url,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // StripComponents Optional number of leading path components to strip from profile_archive entries (non-negative integer as text). + StripComponents *string `json:"strip_components,omitempty"` } -// AsBrowserCdpPageCloseCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageCloseCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageCloseCommandData() (BrowserCdpPageCloseCommandData, error) { - var body BrowserCdpPageCloseCommandData - err := json.Unmarshal(t.union, &body) - return body, err +// DownloadDirZipParams defines parameters for DownloadDirZip. +type DownloadDirZipParams struct { + // Path Absolute directory path to archive and download. + Path string `form:"path" json:"path"` } -// FromBrowserCdpPageCloseCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageCloseCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageCloseCommandData(v BrowserCdpPageCloseCommandData) error { - v.Method = "Page.close" - b, err := json.Marshal(v) - t.union = b - return err +// DownloadDirZstdParams defines parameters for DownloadDirZstd. +type DownloadDirZstdParams struct { + // Path Absolute directory path to archive and download. + Path string `form:"path" json:"path"` + + // CompressionLevel Compression level. Higher levels produce smaller archives but take longer. + // - fastest: ~zstd level 1, maximum speed (~300-500 MB/s) + // - default: ~zstd level 3, balanced speed/ratio (~150 MB/s) + // - better: ~zstd level 7, better ratio (~50-80 MB/s) + // - best: ~zstd level 11, best ratio (~20-40 MB/s) + CompressionLevel *DownloadDirZstdParamsCompressionLevel `form:"compression_level,omitempty" json:"compression_level,omitempty"` } -// MergeBrowserCdpPageCloseCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageCloseCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageCloseCommandData(v BrowserCdpPageCloseCommandData) error { - v.Method = "Page.close" - b, err := json.Marshal(v) - if err != nil { - return err - } +// DownloadDirZstdParamsCompressionLevel defines parameters for DownloadDirZstd. +type DownloadDirZstdParamsCompressionLevel string - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err +// FileInfoParams defines parameters for FileInfo. +type FileInfoParams struct { + // Path Absolute path of the file or directory. + Path string `form:"path" json:"path"` } -// AsBrowserCdpPageSetWebLifecycleStateCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageSetWebLifecycleStateCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpPageSetWebLifecycleStateCommandData() (BrowserCdpPageSetWebLifecycleStateCommandData, error) { - var body BrowserCdpPageSetWebLifecycleStateCommandData - err := json.Unmarshal(t.union, &body) - return body, err +// ListFilesParams defines parameters for ListFiles. +type ListFilesParams struct { + // Path Absolute directory path. + Path string `form:"path" json:"path"` } -// FromBrowserCdpPageSetWebLifecycleStateCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageSetWebLifecycleStateCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpPageSetWebLifecycleStateCommandData(v BrowserCdpPageSetWebLifecycleStateCommandData) error { - v.Method = "Page.setWebLifecycleState" - b, err := json.Marshal(v) - t.union = b - return err +// ReadFileParams defines parameters for ReadFile. +type ReadFileParams struct { + // Path Absolute file path to read. + Path string `form:"path" json:"path"` } -// MergeBrowserCdpPageSetWebLifecycleStateCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageSetWebLifecycleStateCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageSetWebLifecycleStateCommandData(v BrowserCdpPageSetWebLifecycleStateCommandData) error { - v.Method = "Page.setWebLifecycleState" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err +// UploadFilesMultipartBody defines parameters for UploadFiles. +type UploadFilesMultipartBody struct { + Files []struct { + // DestPath Absolute destination path to write the file. + DestPath string `json:"dest_path"` + File openapi_types.File `json:"file"` + } `json:"files"` } -// AsBrowserCdpTargetActivateTargetCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetActivateTargetCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpTargetActivateTargetCommandData() (BrowserCdpTargetActivateTargetCommandData, error) { - var body BrowserCdpTargetActivateTargetCommandData - err := json.Unmarshal(t.union, &body) - return body, err +// UploadZipMultipartBody defines parameters for UploadZip. +type UploadZipMultipartBody struct { + // DestPath Absolute destination directory to extract the archive to. + DestPath string `json:"dest_path"` + ZipFile openapi_types.File `json:"zip_file"` } -// FromBrowserCdpTargetActivateTargetCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetActivateTargetCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetActivateTargetCommandData(v BrowserCdpTargetActivateTargetCommandData) error { - v.Method = "Target.activateTarget" - b, err := json.Marshal(v) - t.union = b - return err -} +// UploadZstdMultipartBody defines parameters for UploadZstd. +type UploadZstdMultipartBody struct { + // Archive The tar.zst archive file. + Archive openapi_types.File `json:"archive"` -// MergeBrowserCdpTargetActivateTargetCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetActivateTargetCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetActivateTargetCommandData(v BrowserCdpTargetActivateTargetCommandData) error { - v.Method = "Target.activateTarget" - b, err := json.Marshal(v) - if err != nil { - return err - } + // DestPath Absolute destination directory to extract the archive to. + DestPath string `json:"dest_path"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // StripComponents Number of leading path components to strip during extraction (like tar --strip-components). + StripComponents *int `json:"strip_components,omitempty"` } -// AsBrowserCdpTargetCloseTargetCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetCloseTargetCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpTargetCloseTargetCommandData() (BrowserCdpTargetCloseTargetCommandData, error) { - var body BrowserCdpTargetCloseTargetCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// WriteFileParams defines parameters for WriteFile. +type WriteFileParams struct { + // Path Destination absolute file path. + Path string `form:"path" json:"path"` -// FromBrowserCdpTargetCloseTargetCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetCloseTargetCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetCloseTargetCommandData(v BrowserCdpTargetCloseTargetCommandData) error { - v.Method = "Target.closeTarget" - b, err := json.Marshal(v) - t.union = b - return err + // Mode Optional file mode (octal string, e.g. 644). Defaults to 644. + Mode *string `form:"mode,omitempty" json:"mode,omitempty"` } -// MergeBrowserCdpTargetCloseTargetCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetCloseTargetCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetCloseTargetCommandData(v BrowserCdpTargetCloseTargetCommandData) error { - v.Method = "Target.closeTarget" - b, err := json.Marshal(v) - if err != nil { - return err - } +// LogsStreamParams defines parameters for LogsStream. +type LogsStreamParams struct { + Source LogsStreamParamsSource `form:"source" json:"source"` + Follow *bool `form:"follow,omitempty" json:"follow,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} + // Path only required if source is path + Path *string `form:"path,omitempty" json:"path,omitempty"` -// AsBrowserCdpTargetCreateTargetCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetCreateTargetCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpTargetCreateTargetCommandData() (BrowserCdpTargetCreateTargetCommandData, error) { - var body BrowserCdpTargetCreateTargetCommandData - err := json.Unmarshal(t.union, &body) - return body, err + // SupervisorProcess only required if source is supervisor + SupervisorProcess *string `form:"supervisor_process,omitempty" json:"supervisor_process,omitempty"` } -// FromBrowserCdpTargetCreateTargetCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetCreateTargetCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetCreateTargetCommandData(v BrowserCdpTargetCreateTargetCommandData) error { - v.Method = "Target.createTarget" - b, err := json.Marshal(v) - t.union = b - return err +// LogsStreamParamsSource defines parameters for LogsStream. +type LogsStreamParamsSource string + +// DownloadRecordingParams defines parameters for DownloadRecording. +type DownloadRecordingParams struct { + // Id Identifier of the recording session to download, as passed to /recording/start. When omitted, the default recording session is downloaded. + Id *string `form:"id,omitempty" json:"id,omitempty"` } -// MergeBrowserCdpTargetCreateTargetCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetCreateTargetCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetCreateTargetCommandData(v BrowserCdpTargetCreateTargetCommandData) error { - v.Method = "Target.createTarget" - b, err := json.Marshal(v) - if err != nil { - return err - } +// StreamTelemetryEventsParams defines parameters for StreamTelemetryEvents. +type StreamTelemetryEventsParams struct { + // Replay Pass `all` to start from the oldest retained event. Ring buffer caps at 1024; older events are evicted and surface as a first `id` greater than 1. + Replay *StreamTelemetryEventsParamsReplay `form:"replay,omitempty" json:"replay,omitempty"` - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + // LastEventID Resume after this sequence number. Omit or send 0 to start from the current position. Sequence numbers are process-monotonic, so any previous value resumes correctly from that point. Takes precedence over `replay` when both are present, so SSE auto-reconnect resumes cleanly instead of re-replaying history. + LastEventID *string `json:"Last-Event-ID,omitempty"` } -// AsBrowserCdpTargetCreateBrowserContextCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetCreateBrowserContextCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpTargetCreateBrowserContextCommandData() (BrowserCdpTargetCreateBrowserContextCommandData, error) { - var body BrowserCdpTargetCreateBrowserContextCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// StreamTelemetryEventsParamsReplay defines parameters for StreamTelemetryEvents. +type StreamTelemetryEventsParamsReplay string -// FromBrowserCdpTargetCreateBrowserContextCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetCreateBrowserContextCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetCreateBrowserContextCommandData(v BrowserCdpTargetCreateBrowserContextCommandData) error { - v.Method = "Target.createBrowserContext" - b, err := json.Marshal(v) - t.union = b - return err -} +// PatchChromiumFlagsJSONRequestBody defines body for PatchChromiumFlags for application/json ContentType. +type PatchChromiumFlagsJSONRequestBody PatchChromiumFlagsJSONBody -// MergeBrowserCdpTargetCreateBrowserContextCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetCreateBrowserContextCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetCreateBrowserContextCommandData(v BrowserCdpTargetCreateBrowserContextCommandData) error { - v.Method = "Target.createBrowserContext" - b, err := json.Marshal(v) - if err != nil { - return err - } +// PatchChromiumPoliciesJSONRequestBody defines body for PatchChromiumPolicies for application/json ContentType. +type PatchChromiumPoliciesJSONRequestBody PatchChromiumPoliciesJSONBody - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// UploadExtensionsAndRestartMultipartRequestBody defines body for UploadExtensionsAndRestart for multipart/form-data ContentType. +type UploadExtensionsAndRestartMultipartRequestBody UploadExtensionsAndRestartMultipartBody -// AsBrowserCdpTargetDisposeBrowserContextCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetDisposeBrowserContextCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpTargetDisposeBrowserContextCommandData() (BrowserCdpTargetDisposeBrowserContextCommandData, error) { - var body BrowserCdpTargetDisposeBrowserContextCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// BatchComputerActionJSONRequestBody defines body for BatchComputerAction for application/json ContentType. +type BatchComputerActionJSONRequestBody = BatchComputerActionRequest -// FromBrowserCdpTargetDisposeBrowserContextCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetDisposeBrowserContextCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetDisposeBrowserContextCommandData(v BrowserCdpTargetDisposeBrowserContextCommandData) error { - v.Method = "Target.disposeBrowserContext" - b, err := json.Marshal(v) - t.union = b - return err -} +// ClickMouseJSONRequestBody defines body for ClickMouse for application/json ContentType. +type ClickMouseJSONRequestBody = ClickMouseRequest -// MergeBrowserCdpTargetDisposeBrowserContextCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetDisposeBrowserContextCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetDisposeBrowserContextCommandData(v BrowserCdpTargetDisposeBrowserContextCommandData) error { - v.Method = "Target.disposeBrowserContext" - b, err := json.Marshal(v) - if err != nil { - return err - } +// WriteClipboardJSONRequestBody defines body for WriteClipboard for application/json ContentType. +type WriteClipboardJSONRequestBody = WriteClipboardRequest - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// SetCursorJSONRequestBody defines body for SetCursor for application/json ContentType. +type SetCursorJSONRequestBody = SetCursorRequest -// AsBrowserCdpTargetOpenDevToolsCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetOpenDevToolsCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpTargetOpenDevToolsCommandData() (BrowserCdpTargetOpenDevToolsCommandData, error) { - var body BrowserCdpTargetOpenDevToolsCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// DragMouseJSONRequestBody defines body for DragMouse for application/json ContentType. +type DragMouseJSONRequestBody = DragMouseRequest -// FromBrowserCdpTargetOpenDevToolsCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetOpenDevToolsCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetOpenDevToolsCommandData(v BrowserCdpTargetOpenDevToolsCommandData) error { - v.Method = "Target.openDevTools" - b, err := json.Marshal(v) - t.union = b - return err -} +// MoveMouseJSONRequestBody defines body for MoveMouse for application/json ContentType. +type MoveMouseJSONRequestBody = MoveMouseRequest -// MergeBrowserCdpTargetOpenDevToolsCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetOpenDevToolsCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetOpenDevToolsCommandData(v BrowserCdpTargetOpenDevToolsCommandData) error { - v.Method = "Target.openDevTools" - b, err := json.Marshal(v) - if err != nil { - return err - } +// PressKeyJSONRequestBody defines body for PressKey for application/json ContentType. +type PressKeyJSONRequestBody = PressKeyRequest - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// TakeScreenshotJSONRequestBody defines body for TakeScreenshot for application/json ContentType. +type TakeScreenshotJSONRequestBody = ScreenshotRequest -// AsBrowserCdpBrowserCancelDownloadCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpBrowserCancelDownloadCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpBrowserCancelDownloadCommandData() (BrowserCdpBrowserCancelDownloadCommandData, error) { - var body BrowserCdpBrowserCancelDownloadCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// ScrollJSONRequestBody defines body for Scroll for application/json ContentType. +type ScrollJSONRequestBody = ScrollRequest -// FromBrowserCdpBrowserCancelDownloadCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpBrowserCancelDownloadCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpBrowserCancelDownloadCommandData(v BrowserCdpBrowserCancelDownloadCommandData) error { - v.Method = "Browser.cancelDownload" - b, err := json.Marshal(v) - t.union = b - return err -} +// TypeTextJSONRequestBody defines body for TypeText for application/json ContentType. +type TypeTextJSONRequestBody = TypeTextRequest -// MergeBrowserCdpBrowserCancelDownloadCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpBrowserCancelDownloadCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpBrowserCancelDownloadCommandData(v BrowserCdpBrowserCancelDownloadCommandData) error { - v.Method = "Browser.cancelDownload" - b, err := json.Marshal(v) - if err != nil { - return err - } +// ChromiumConfigureMultipartRequestBody defines body for ChromiumConfigure for multipart/form-data ContentType. +type ChromiumConfigureMultipartRequestBody ChromiumConfigureMultipartBody - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// PatchDisplayJSONRequestBody defines body for PatchDisplay for application/json ContentType. +type PatchDisplayJSONRequestBody = PatchDisplayRequest -// AsBrowserCdpBrowserCloseCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpBrowserCloseCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpBrowserCloseCommandData() (BrowserCdpBrowserCloseCommandData, error) { - var body BrowserCdpBrowserCloseCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// CreateDirectoryJSONRequestBody defines body for CreateDirectory for application/json ContentType. +type CreateDirectoryJSONRequestBody = CreateDirectoryRequest -// FromBrowserCdpBrowserCloseCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpBrowserCloseCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpBrowserCloseCommandData(v BrowserCdpBrowserCloseCommandData) error { - v.Method = "Browser.close" - b, err := json.Marshal(v) - t.union = b - return err -} +// DeleteDirectoryJSONRequestBody defines body for DeleteDirectory for application/json ContentType. +type DeleteDirectoryJSONRequestBody = DeletePathRequest -// MergeBrowserCdpBrowserCloseCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpBrowserCloseCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpBrowserCloseCommandData(v BrowserCdpBrowserCloseCommandData) error { - v.Method = "Browser.close" - b, err := json.Marshal(v) - if err != nil { - return err - } +// DeleteFileJSONRequestBody defines body for DeleteFile for application/json ContentType. +type DeleteFileJSONRequestBody = DeletePathRequest - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// MovePathJSONRequestBody defines body for MovePath for application/json ContentType. +type MovePathJSONRequestBody = MovePathRequest -// AsBrowserCdpBrowserSetWindowBoundsCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpBrowserSetWindowBoundsCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpBrowserSetWindowBoundsCommandData() (BrowserCdpBrowserSetWindowBoundsCommandData, error) { - var body BrowserCdpBrowserSetWindowBoundsCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// SetFilePermissionsJSONRequestBody defines body for SetFilePermissions for application/json ContentType. +type SetFilePermissionsJSONRequestBody = SetFilePermissionsRequest -// FromBrowserCdpBrowserSetWindowBoundsCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpBrowserSetWindowBoundsCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpBrowserSetWindowBoundsCommandData(v BrowserCdpBrowserSetWindowBoundsCommandData) error { - v.Method = "Browser.setWindowBounds" - b, err := json.Marshal(v) - t.union = b - return err -} +// UploadFilesMultipartRequestBody defines body for UploadFiles for multipart/form-data ContentType. +type UploadFilesMultipartRequestBody UploadFilesMultipartBody -// MergeBrowserCdpBrowserSetWindowBoundsCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpBrowserSetWindowBoundsCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpBrowserSetWindowBoundsCommandData(v BrowserCdpBrowserSetWindowBoundsCommandData) error { - v.Method = "Browser.setWindowBounds" - b, err := json.Marshal(v) - if err != nil { - return err - } +// UploadZipMultipartRequestBody defines body for UploadZip for multipart/form-data ContentType. +type UploadZipMultipartRequestBody UploadZipMultipartBody - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// UploadZstdMultipartRequestBody defines body for UploadZstd for multipart/form-data ContentType. +type UploadZstdMultipartRequestBody UploadZstdMultipartBody -// AsBrowserCdpBrowserSetContentsSizeCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpBrowserSetContentsSizeCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpBrowserSetContentsSizeCommandData() (BrowserCdpBrowserSetContentsSizeCommandData, error) { - var body BrowserCdpBrowserSetContentsSizeCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// StartFsWatchJSONRequestBody defines body for StartFsWatch for application/json ContentType. +type StartFsWatchJSONRequestBody = StartFsWatchRequest -// FromBrowserCdpBrowserSetContentsSizeCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpBrowserSetContentsSizeCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpBrowserSetContentsSizeCommandData(v BrowserCdpBrowserSetContentsSizeCommandData) error { - v.Method = "Browser.setContentsSize" - b, err := json.Marshal(v) - t.union = b - return err -} +// ExecutePlaywrightCodeJSONRequestBody defines body for ExecutePlaywrightCode for application/json ContentType. +type ExecutePlaywrightCodeJSONRequestBody = ExecutePlaywrightRequest -// MergeBrowserCdpBrowserSetContentsSizeCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpBrowserSetContentsSizeCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpBrowserSetContentsSizeCommandData(v BrowserCdpBrowserSetContentsSizeCommandData) error { - v.Method = "Browser.setContentsSize" - b, err := json.Marshal(v) - if err != nil { - return err - } +// ProcessExecJSONRequestBody defines body for ProcessExec for application/json ContentType. +type ProcessExecJSONRequestBody = ProcessExecRequest - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// ProcessSpawnJSONRequestBody defines body for ProcessSpawn for application/json ContentType. +type ProcessSpawnJSONRequestBody = ProcessSpawnRequest -// AsBrowserCdpAutofillTriggerCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpAutofillTriggerCommandData -func (t BrowserCdpCommandEventData) AsBrowserCdpAutofillTriggerCommandData() (BrowserCdpAutofillTriggerCommandData, error) { - var body BrowserCdpAutofillTriggerCommandData - err := json.Unmarshal(t.union, &body) - return body, err -} +// ProcessKillJSONRequestBody defines body for ProcessKill for application/json ContentType. +type ProcessKillJSONRequestBody = ProcessKillRequest -// FromBrowserCdpAutofillTriggerCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpAutofillTriggerCommandData -func (t *BrowserCdpCommandEventData) FromBrowserCdpAutofillTriggerCommandData(v BrowserCdpAutofillTriggerCommandData) error { - v.Method = "Autofill.trigger" - b, err := json.Marshal(v) - t.union = b - return err -} +// ProcessResizeJSONRequestBody defines body for ProcessResize for application/json ContentType. +type ProcessResizeJSONRequestBody = ProcessResizeRequest -// MergeBrowserCdpAutofillTriggerCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpAutofillTriggerCommandData -func (t *BrowserCdpCommandEventData) MergeBrowserCdpAutofillTriggerCommandData(v BrowserCdpAutofillTriggerCommandData) error { - v.Method = "Autofill.trigger" - b, err := json.Marshal(v) - if err != nil { - return err - } +// ProcessStdinJSONRequestBody defines body for ProcessStdin for application/json ContentType. +type ProcessStdinJSONRequestBody = ProcessStdinRequest - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} +// DeleteRecordingJSONRequestBody defines body for DeleteRecording for application/json ContentType. +type DeleteRecordingJSONRequestBody = DeleteRecordingRequest -func (t BrowserCdpCommandEventData) Discriminator() (string, error) { - var discriminator struct { - Discriminator string `json:"method"` - } - err := json.Unmarshal(t.union, &discriminator) - return discriminator.Discriminator, err -} +// MarkRecordingJSONRequestBody defines body for MarkRecording for application/json ContentType. +type MarkRecordingJSONRequestBody = MarkRecordingRequest -func (t BrowserCdpCommandEventData) ValueByDiscriminator() (interface{}, error) { - discriminator, err := t.Discriminator() - if err != nil { - return nil, err - } - switch discriminator { - case "Autofill.trigger": - return t.AsBrowserCdpAutofillTriggerCommandData() - case "Browser.cancelDownload": - return t.AsBrowserCdpBrowserCancelDownloadCommandData() - case "Browser.close": - return t.AsBrowserCdpBrowserCloseCommandData() - case "Browser.setContentsSize": - return t.AsBrowserCdpBrowserSetContentsSizeCommandData() - case "Browser.setWindowBounds": - return t.AsBrowserCdpBrowserSetWindowBoundsCommandData() - case "DOM.focus": - return t.AsBrowserCdpDomFocusCommandData() - case "DOM.scrollIntoViewIfNeeded": - return t.AsBrowserCdpDomScrollIntoViewIfNeededCommandData() - case "DOM.setFileInputFiles": - return t.AsBrowserCdpDomSetFileInputFilesCommandData() - case "Input.cancelDragging": - return t.AsBrowserCdpInputCancelDraggingCommandData() - case "Input.dispatchDragEvent": - return t.AsBrowserCdpInputDispatchDragEventCommandData() - case "Input.dispatchKeyEvent": - return t.AsBrowserCdpInputDispatchKeyEventCommandData() - case "Input.dispatchMouseEvent": - return t.AsBrowserCdpInputDispatchMouseEventCommandData() - case "Input.dispatchTouchEvent": - return t.AsBrowserCdpInputDispatchTouchEventCommandData() - case "Input.emulateTouchFromMouseEvent": - return t.AsBrowserCdpInputEmulateTouchFromMouseEventCommandData() - case "Input.imeSetComposition": - return t.AsBrowserCdpInputImeSetCompositionCommandData() - case "Input.insertText": - return t.AsBrowserCdpInputInsertTextCommandData() - case "Input.synthesizePinchGesture": - return t.AsBrowserCdpInputSynthesizePinchGestureCommandData() - case "Input.synthesizeScrollGesture": - return t.AsBrowserCdpInputSynthesizeScrollGestureCommandData() - case "Input.synthesizeTapGesture": - return t.AsBrowserCdpInputSynthesizeTapGestureCommandData() - case "Page.bringToFront": - return t.AsBrowserCdpPageBringToFrontCommandData() - case "Page.captureScreenshot": - return t.AsBrowserCdpPageCaptureScreenshotCommandData() - case "Page.captureSnapshot": - return t.AsBrowserCdpPageCaptureSnapshotCommandData() - case "Page.close": - return t.AsBrowserCdpPageCloseCommandData() - case "Page.handleJavaScriptDialog": - return t.AsBrowserCdpPageHandleJavaScriptDialogCommandData() - case "Page.navigate": - return t.AsBrowserCdpPageNavigateCommandData() - case "Page.navigateToHistoryEntry": - return t.AsBrowserCdpPageNavigateToHistoryEntryCommandData() - case "Page.printToPDF": - return t.AsBrowserCdpPagePrintToPdfCommandData() - case "Page.reload": - return t.AsBrowserCdpPageReloadCommandData() - case "Page.setWebLifecycleState": - return t.AsBrowserCdpPageSetWebLifecycleStateCommandData() - case "Page.startScreencast": - return t.AsBrowserCdpPageStartScreencastCommandData() - case "Page.stopLoading": - return t.AsBrowserCdpPageStopLoadingCommandData() - case "Page.stopScreencast": - return t.AsBrowserCdpPageStopScreencastCommandData() - case "Target.activateTarget": - return t.AsBrowserCdpTargetActivateTargetCommandData() - case "Target.closeTarget": - return t.AsBrowserCdpTargetCloseTargetCommandData() - case "Target.createBrowserContext": - return t.AsBrowserCdpTargetCreateBrowserContextCommandData() - case "Target.createTarget": - return t.AsBrowserCdpTargetCreateTargetCommandData() - case "Target.disposeBrowserContext": - return t.AsBrowserCdpTargetDisposeBrowserContextCommandData() - case "Target.openDevTools": - return t.AsBrowserCdpTargetOpenDevToolsCommandData() - default: - return nil, errors.New("unknown discriminator value: " + discriminator) - } -} +// StartRecordingJSONRequestBody defines body for StartRecording for application/json ContentType. +type StartRecordingJSONRequestBody = StartRecordingRequest -func (t BrowserCdpCommandEventData) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} +// StopRecordingJSONRequestBody defines body for StopRecording for application/json ContentType. +type StopRecordingJSONRequestBody = StopRecordingRequest -func (t *BrowserCdpCommandEventData) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} +// PatchTelemetryJSONRequestBody defines body for PatchTelemetry for application/json ContentType. +type PatchTelemetryJSONRequestBody = BrowserTelemetryConfig + +// PutTelemetryJSONRequestBody defines body for PutTelemetry for application/json ContentType. +type PutTelemetryJSONRequestBody = BrowserTelemetryConfig + +// PublishTelemetryEventJSONRequestBody defines body for PublishTelemetryEvent for application/json ContentType. +type PublishTelemetryEventJSONRequestBody = PublishEventRequest // AsBrowserConsoleLogEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserConsoleLogEvent func (t KnownBrowserTelemetryEvent) AsBrowserConsoleLogEvent() (BrowserConsoleLogEvent, error) { @@ -8065,34 +4319,6 @@ func (t *KnownBrowserTelemetryEvent) MergeBrowserNetworkIdleEvent(v BrowserNetwo return err } -// AsBrowserProxyErrorEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserProxyErrorEvent -func (t KnownBrowserTelemetryEvent) AsBrowserProxyErrorEvent() (BrowserProxyErrorEvent, error) { - var body BrowserProxyErrorEvent - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromBrowserProxyErrorEvent overwrites any union data inside the KnownBrowserTelemetryEvent as the provided BrowserProxyErrorEvent -func (t *KnownBrowserTelemetryEvent) FromBrowserProxyErrorEvent(v BrowserProxyErrorEvent) error { - v.Type = "proxy_error" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeBrowserProxyErrorEvent performs a merge with any union data inside the KnownBrowserTelemetryEvent, using the provided BrowserProxyErrorEvent -func (t *KnownBrowserTelemetryEvent) MergeBrowserProxyErrorEvent(v BrowserProxyErrorEvent) error { - v.Type = "proxy_error" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - // AsBrowserPageNavigationEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserPageNavigationEvent func (t KnownBrowserTelemetryEvent) AsBrowserPageNavigationEvent() (BrowserPageNavigationEvent, error) { var body BrowserPageNavigationEvent @@ -8625,34 +4851,6 @@ func (t *KnownBrowserTelemetryEvent) MergeBrowserPlatformApiCallEvent(v BrowserP return err } -// AsBrowserCdpCommandEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserCdpCommandEvent -func (t KnownBrowserTelemetryEvent) AsBrowserCdpCommandEvent() (BrowserCdpCommandEvent, error) { - var body BrowserCdpCommandEvent - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromBrowserCdpCommandEvent overwrites any union data inside the KnownBrowserTelemetryEvent as the provided BrowserCdpCommandEvent -func (t *KnownBrowserTelemetryEvent) FromBrowserCdpCommandEvent(v BrowserCdpCommandEvent) error { - v.Type = "cdp_command" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeBrowserCdpCommandEvent performs a merge with any union data inside the KnownBrowserTelemetryEvent, using the provided BrowserCdpCommandEvent -func (t *KnownBrowserTelemetryEvent) MergeBrowserCdpCommandEvent(v BrowserCdpCommandEvent) error { - v.Type = "cdp_command" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - // AsBrowserCdpConnectEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserCdpConnectEvent func (t KnownBrowserTelemetryEvent) AsBrowserCdpConnectEvent() (BrowserCdpConnectEvent, error) { var body BrowserCdpConnectEvent @@ -8867,8 +5065,6 @@ func (t KnownBrowserTelemetryEvent) ValueByDiscriminator() (interface{}, error) return t.AsBrowserApiCallEvent() case "captcha_solve_result": return t.AsBrowserCaptchaSolveResultEvent() - case "cdp_command": - return t.AsBrowserCdpCommandEvent() case "cdp_connect": return t.AsBrowserCdpConnectEvent() case "cdp_disconnect": @@ -8925,8 +5121,6 @@ func (t KnownBrowserTelemetryEvent) ValueByDiscriminator() (interface{}, error) return t.AsBrowserPageTabOpenedEvent() case "platform_api_call": return t.AsBrowserPlatformApiCallEvent() - case "proxy_error": - return t.AsBrowserProxyErrorEvent() case "service_crashed": return t.AsBrowserServiceCrashedEvent() case "system_oom_kill": @@ -17070,7 +13264,7 @@ type ServerInterface interface { // Update Chromium enterprise policies and restart // (PATCH /chromium/policies) PatchChromiumPolicies(w http.ResponseWriter, r *http.Request) - // Upload one or more unpacked extensions (as zips) and restart Chromium + // Upload and activate one or more unpacked extensions // (POST /chromium/upload-extensions-and-restart) UploadExtensionsAndRestart(w http.ResponseWriter, r *http.Request) // Execute a batch of computer actions sequentially @@ -17250,7 +13444,7 @@ func (_ Unimplemented) PatchChromiumPolicies(w http.ResponseWriter, r *http.Requ w.WriteHeader(http.StatusNotImplemented) } -// Upload one or more unpacked extensions (as zips) and restart Chromium +// Upload and activate one or more unpacked extensions // (POST /chromium/upload-extensions-and-restart) func (_ Unimplemented) UploadExtensionsAndRestart(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) @@ -21327,7 +17521,7 @@ type StrictServerInterface interface { // Update Chromium enterprise policies and restart // (PATCH /chromium/policies) PatchChromiumPolicies(ctx context.Context, request PatchChromiumPoliciesRequestObject) (PatchChromiumPoliciesResponseObject, error) - // Upload one or more unpacked extensions (as zips) and restart Chromium + // Upload and activate one or more unpacked extensions // (POST /chromium/upload-extensions-and-restart) UploadExtensionsAndRestart(ctx context.Context, request UploadExtensionsAndRestartRequestObject) (UploadExtensionsAndRestartResponseObject, error) // Execute a batch of computer actions sequentially @@ -23175,544 +19369,393 @@ func (sh *strictHandler) StreamTelemetryEvents(w http.ResponseWriter, r *http.Re // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "Tq09Bg+wfIH/+vV/AgAA///8WZ2COTsDAA==", + "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", + "/9rSY8kBNgv4jx///wAAAP//RAOsjcrjAQA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/server/openapi.yaml b/server/openapi.yaml index 25f07df0..71f5af79 100644 --- a/server/openapi.yaml +++ b/server/openapi.yaml @@ -1142,11 +1142,13 @@ paths: /chromium/upload-extensions-and-restart: post: - summary: Upload one or more unpacked extensions (as zips) and restart Chromium + summary: Upload and activate one or more unpacked extensions description: | - Upload one or more extension zip archives, extract them under /home/kernel/extensions/, - set runtime extension flags in /chromium/flags, restart Chromium via supervisord, and wait - until the Chromium DevTools "listening" log line is observed before returning success. + Upload one or more extension zip archives and extract them under + /home/kernel/extensions/. Ordinary unpacked extensions are activated immediately over + CDP without restarting Chromium, while their runtime flags are persisted for future starts. + Extensions that require enterprise policy still restart Chromium and wait for DevTools + readiness before returning success. operationId: uploadExtensionsAndRestart x-telemetry-category: platform requestBody: @@ -1174,7 +1176,7 @@ paths: required: [extensions] responses: "201": - description: Extensions uploaded, Chromium restarted, and DevTools is ready + description: Extensions uploaded and activated "400": $ref: "#/components/responses/BadRequestError" "500": From 9441a37359971fbb9957b2eeb306afd9ceb09437 Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:47:30 +0000 Subject: [PATCH 02/10] Harden extension activation fallback --- server/cmd/api/api/api.go | 4 + server/cmd/api/api/chromium.go | 61 ++++--- server/cmd/api/api/chromium_configure.go | 3 + server/cmd/api/api/display.go | 3 + server/lib/oapi/oapi.go | 210 +++++++++++------------ server/openapi.yaml | 1 + 6 files changed, 154 insertions(+), 128 deletions(-) diff --git a/server/cmd/api/api/api.go b/server/cmd/api/api/api.go index 544938ac..2fd6580b 100644 --- a/server/cmd/api/api/api.go +++ b/server/cmd/api/api/api.go @@ -61,6 +61,10 @@ type ApiService struct { upstreamMgr *devtoolsproxy.UpstreamManager stz scaletozero.PinnedController + // chromiumConfigMu serializes configuration changes that may restart Chromium + // or mutate its runtime flags and policies. + chromiumConfigMu sync.Mutex + // inputMu serializes input-related operations (mouse, keyboard, screenshot) inputMu sync.Mutex diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index 36cf7500..b22511fa 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -28,8 +28,11 @@ type extensionZipItem struct { name string } -// chromiumFlagsPath is the runtime flags file read by the chromium-launcher at startup. -const chromiumFlagsPath = "/chromium/flags" +const ( + // chromiumFlagsPath is the runtime flags file read by the chromium-launcher at startup. + chromiumFlagsPath = "/chromium/flags" + extensionsBaseDir = "/home/kernel/extensions" +) // UploadExtensionsAndRestart handles multipart upload of one or more extension zips and extracts // them under /home/kernel/extensions/. Unpacked extensions are loaded immediately over CDP; @@ -145,6 +148,9 @@ func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oap extItems = append(extItems, extensionZipItem{zipTemp: p.zipTemp, name: p.name}) } + s.chromiumConfigMu.Lock() + defer s.chromiumConfigMu.Unlock() + requiresRestart, reqMsg, err := s.applyExtensionZipItems(ctx, extItems) if reqMsg != "" { return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: reqMsg}}, nil @@ -159,10 +165,16 @@ func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oap InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}, }, nil } - } else if err := s.loadUnpackedExtensions(ctx, extItems); err != nil { - return oapi.UploadExtensionsAndRestart500JSONResponse{ - InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}, - }, nil + } else if loadErr := s.loadUnpackedExtensions(ctx, extItems); loadErr != nil { + log.Warn("CDP extension load failed, restarting Chromium", "error", loadErr) + if restartErr := s.restartChromiumAndWait(ctx, "extension upload fallback"); restartErr != nil { + return oapi.UploadExtensionsAndRestart500JSONResponse{ + InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{ + Message: fmt.Sprintf("CDP extension load failed (%v), and fallback restart failed: %v", loadErr, restartErr), + }, + }, nil + } + requiresRestart = true } log.Info("extensions ready", "restarted", requiresRestart, "elapsed", time.Since(start).String()) @@ -173,13 +185,12 @@ func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oap // configuration. The boolean result reports whether enterprise policy requires a restart. func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensionZipItem) (bool, string, error) { log := logger.FromContext(ctx) - extBase := "/home/kernel/extensions" - if err := os.MkdirAll(extBase, 0o755); err != nil { + if err := os.MkdirAll(extensionsBaseDir, 0o755); err != nil { return false, "", fmt.Errorf("failed to create extension base dir: %w", err) } for _, p := range items { - dest := filepath.Join(extBase, p.name) + dest := filepath.Join(extensionsBaseDir, p.name) if _, err := os.Stat(dest); err == nil { return false, fmt.Sprintf("extension name already exists: %s", p.name), nil } else if !os.IsNotExist(err) { @@ -202,7 +213,7 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi }() for _, p := range items { - dest := filepath.Join(extBase, p.name) + dest := filepath.Join(extensionsBaseDir, p.name) if err := os.MkdirAll(dest, 0o755); err != nil { log.Error("failed to create extension dir", "error", err) return false, "", fmt.Errorf("failed to create extension dir: %w", err) @@ -230,7 +241,7 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi requiresRestart := false for _, p := range items { - extensionPath := filepath.Join(extBase, p.name) + extensionPath := filepath.Join(extensionsBaseDir, p.name) extensionName := p.name manifestPath := filepath.Join(extensionPath, "manifest.json") updateXMLPath := filepath.Join(extensionPath, "update.xml") @@ -312,19 +323,17 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi func (s *ApiService) loadUnpackedExtensions(ctx context.Context, items []extensionZipItem) error { log := logger.FromContext(ctx) - for _, item := range items { - path := filepath.Join("/home/kernel/extensions", item.name) - var id string - if err := s.withCDPClient(ctx, func(cdpCtx context.Context, client *cdpclient.Client) error { - loadedID, err := client.LoadUnpackedExtension(cdpCtx, path) - id = loadedID - return err - }); err != nil { - return fmt.Errorf("failed to load extension %s: %w", item.name, err) + return s.withCDPClient(ctx, func(cdpCtx context.Context, client *cdpclient.Client) error { + for _, item := range items { + path := filepath.Join(extensionsBaseDir, item.name) + id, err := client.LoadUnpackedExtension(cdpCtx, path) + if err != nil { + return fmt.Errorf("failed to load extension %s: %w", item.name, err) + } + log.Info("loaded unpacked extension over CDP", "name", item.name, "id", id) } - log.Info("loaded unpacked extension over CDP", "name", item.name, "id", id) - } - return nil + return nil + }) } // mergeAndWriteChromiumFlags reads existing flags, merges them with new flags, @@ -599,6 +608,9 @@ func (s *ApiService) PatchChromiumPolicies(ctx context.Context, request oapi.Pat return oapi.PatchChromiumPolicies400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: err.Error()}}, nil } + s.chromiumConfigMu.Lock() + defer s.chromiumConfigMu.Unlock() + if err := s.policy.ApplyOverrides(overrides); err != nil { if strings.Contains(err.Error(), "invalid chromium policy overrides") || strings.Contains(err.Error(), "cannot be overridden") { return oapi.PatchChromiumPolicies400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: err.Error()}}, nil @@ -644,6 +656,9 @@ func (s *ApiService) PatchChromiumFlags(ctx context.Context, request oapi.PatchC } } + s.chromiumConfigMu.Lock() + defer s.chromiumConfigMu.Unlock() + // Merge and write flags if _, err := s.mergeAndWriteChromiumFlags(ctx, request.Body.Flags); err != nil { return oapi.PatchChromiumFlags500JSONResponse{ diff --git a/server/cmd/api/api/chromium_configure.go b/server/cmd/api/api/chromium_configure.go index 976e3b85..8e6a284f 100644 --- a/server/cmd/api/api/chromium_configure.go +++ b/server/cmd/api/api/chromium_configure.go @@ -77,6 +77,9 @@ func (s *ApiService) ChromiumConfigure(ctx context.Context, request oapi.Chromiu return cfg400("no configuration fields provided"), nil } + s.chromiumConfigMu.Lock() + defer s.chromiumConfigMu.Unlock() + needsStop := chromiumNeedsStopCycle(st) chromiumStopped := false restartAfterStop := func() error { diff --git a/server/cmd/api/api/display.go b/server/cmd/api/api/display.go index 6395dedc..c4abd626 100644 --- a/server/cmd/api/api/display.go +++ b/server/cmd/api/api/display.go @@ -35,6 +35,9 @@ func (s *ApiService) PatchDisplay(ctx context.Context, req oapi.PatchDisplayRequ return oapi.PatchDisplay400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "no display parameters to update"}}, nil } + s.chromiumConfigMu.Lock() + defer s.chromiumConfigMu.Unlock() + // Get current resolution with refresh rate currentWidth, currentHeight, currentRefreshRate, err := s.getCurrentResolution(ctx) if err != nil { diff --git a/server/lib/oapi/oapi.go b/server/lib/oapi/oapi.go index c6432de3..e1882f24 100644 --- a/server/lib/oapi/oapi.go +++ b/server/lib/oapi/oapi.go @@ -19651,111 +19651,111 @@ var swaggerSpec = []string{ "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", - "/9rSY8kBNgv4jx///wAAAP//RAOsjcrjAQA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/server/openapi.yaml b/server/openapi.yaml index 71f5af79..3031e7e4 100644 --- a/server/openapi.yaml +++ b/server/openapi.yaml @@ -1147,6 +1147,7 @@ paths: Upload one or more extension zip archives and extract them under /home/kernel/extensions/. Ordinary unpacked extensions are activated immediately over CDP without restarting Chromium, while their runtime flags are persisted for future starts. + Content scripts are applied to existing pages after their next navigation or reload. Extensions that require enterprise policy still restart Chromium and wait for DevTools readiness before returning success. operationId: uploadExtensionsAndRestart From 7cda3897e8ec8133f15c90d233c332637397b3fc Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:54:31 +0000 Subject: [PATCH 03/10] Prevent nested Chromium configuration locks --- server/cmd/api/api/chromium.go | 5 +++-- server/cmd/api/api/chromium_configure.go | 2 +- server/cmd/api/api/display.go | 17 +++++++++++------ server/cmd/api/api/display_test.go | 24 ++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index b22511fa..4fe30865 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -248,7 +248,7 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi requiresEntPolicy, err := s.policy.RequiresEnterprisePolicy(manifestPath) if err != nil { - log.Warn("failed to read manifest for policy check", "error", err, "extension", extensionName) + return false, fmt.Sprintf("invalid extension %s: %v", extensionName, err), nil } chromeExtensionID := extensionName @@ -323,7 +323,8 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi func (s *ApiService) loadUnpackedExtensions(ctx context.Context, items []extensionZipItem) error { log := logger.FromContext(ctx) - return s.withCDPClient(ctx, func(cdpCtx context.Context, client *cdpclient.Client) error { + timeout := time.Duration(len(items)) * 10 * time.Second + return s.withCDPClientTimeout(ctx, timeout, func(cdpCtx context.Context, client *cdpclient.Client) error { for _, item := range items { path := filepath.Join(extensionsBaseDir, item.name) id, err := client.LoadUnpackedExtension(cdpCtx, path) diff --git a/server/cmd/api/api/chromium_configure.go b/server/cmd/api/api/chromium_configure.go index 8e6a284f..f141ceab 100644 --- a/server/cmd/api/api/chromium_configure.go +++ b/server/cmd/api/api/chromium_configure.go @@ -714,7 +714,7 @@ func chromiumDisplayApplyWhileStopped(ctx context.Context, s *ApiService, plan * } func chromiumRunPatchDisplay(ctx context.Context, s *ApiService, body *oapi.PatchDisplayJSONRequestBody) oapi.ChromiumConfigureResponseObject { - resp, err := s.PatchDisplay(ctx, oapi.PatchDisplayRequestObject{Body: body}) + resp, err := s.patchDisplayLocked(ctx, oapi.PatchDisplayRequestObject{Body: body}) if err != nil { return cfg500ConfigureStep(chromiumConfigureStepDisplay, err.Error()) } diff --git a/server/cmd/api/api/display.go b/server/cmd/api/api/display.go index c4abd626..285ae8ff 100644 --- a/server/cmd/api/api/display.go +++ b/server/cmd/api/api/display.go @@ -24,6 +24,12 @@ import ( // This method automatically detects whether the system is running with Xorg (headful) // or Xvfb (headless) and uses the appropriate method to change resolution. func (s *ApiService) PatchDisplay(ctx context.Context, req oapi.PatchDisplayRequestObject) (oapi.PatchDisplayResponseObject, error) { + s.chromiumConfigMu.Lock() + defer s.chromiumConfigMu.Unlock() + return s.patchDisplayLocked(ctx, req) +} + +func (s *ApiService) patchDisplayLocked(ctx context.Context, req oapi.PatchDisplayRequestObject) (oapi.PatchDisplayResponseObject, error) { log := logger.FromContext(ctx) if req.Body == nil { @@ -35,9 +41,6 @@ func (s *ApiService) PatchDisplay(ctx context.Context, req oapi.PatchDisplayRequ return oapi.PatchDisplay400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "no display parameters to update"}}, nil } - s.chromiumConfigMu.Lock() - defer s.chromiumConfigMu.Unlock() - // Get current resolution with refresh rate currentWidth, currentHeight, currentRefreshRate, err := s.getCurrentResolution(ctx) if err != nil { @@ -397,14 +400,16 @@ func (s *ApiService) backgroundResizeXvfb(ctx context.Context, width, height int // withCDPClient dials the current devtools upstream with a 10s timeout, // hands the connected client to fn, and closes the connection on return. -// Lets the small per-call CDP helpers below avoid duplicating the dial + -// timeout + defer-close scaffolding. func (s *ApiService) withCDPClient(ctx context.Context, fn func(context.Context, *cdpclient.Client) error) error { + return s.withCDPClientTimeout(ctx, 10*time.Second, fn) +} + +func (s *ApiService) withCDPClientTimeout(ctx context.Context, timeout time.Duration, fn func(context.Context, *cdpclient.Client) error) error { upstreamURL := s.upstreamMgr.Current() if upstreamURL == "" { return fmt.Errorf("devtools upstream not available") } - cdpCtx, cancel := context.WithTimeout(ctx, 10*time.Second) + cdpCtx, cancel := context.WithTimeout(ctx, timeout) defer cancel() client, err := cdpclient.Dial(cdpCtx, upstreamURL) if err != nil { diff --git a/server/cmd/api/api/display_test.go b/server/cmd/api/api/display_test.go index c37700c3..008472ea 100644 --- a/server/cmd/api/api/display_test.go +++ b/server/cmd/api/api/display_test.go @@ -570,3 +570,27 @@ func TestAdjustParamsForRemainingBudget(t *testing.T) { assert.Nil(t, adjusted.MaxDurationInSeconds, "should remain nil when not set") }) } + +func TestPatchDisplayLockedDoesNotRelockChromiumConfig(t *testing.T) { + s := &ApiService{} + s.chromiumConfigMu.Lock() + defer s.chromiumConfigMu.Unlock() + + type result struct { + resp oapi.PatchDisplayResponseObject + err error + } + done := make(chan result, 1) + go func() { + resp, err := s.patchDisplayLocked(context.Background(), oapi.PatchDisplayRequestObject{}) + done <- result{resp: resp, err: err} + }() + + select { + case got := <-done: + require.NoError(t, got.err) + require.IsType(t, oapi.PatchDisplay400JSONResponse{}, got.resp) + case <-time.After(time.Second): + t.Fatal("patchDisplayLocked tried to reacquire chromiumConfigMu") + } +} From 21dd0729344b8dc4c8492fac4142555bb8c34896 Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:34:48 +0000 Subject: [PATCH 04/10] Add gradual extension upload endpoint --- server/cmd/api/api/chromium.go | 34 +- server/e2e/e2e_chromium_test.go | 28 +- server/lib/events/category_gen.go | 1 + server/lib/oapi/oapi.go | 997 ++++++++++++++++++------------ server/openapi.yaml | 42 +- 5 files changed, 705 insertions(+), 397 deletions(-) diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index 4fe30865..d1c552df 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -34,10 +34,31 @@ const ( extensionsBaseDir = "/home/kernel/extensions" ) -// UploadExtensionsAndRestart handles multipart upload of one or more extension zips and extracts -// them under /home/kernel/extensions/. Unpacked extensions are loaded immediately over CDP; -// extensions that require enterprise policy restart Chromium after their policy is installed. +// UploadExtensionsAndRestart uploads extensions and always restarts Chromium. func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oapi.UploadExtensionsAndRestartRequestObject) (oapi.UploadExtensionsAndRestartResponseObject, error) { + return s.uploadExtensions(ctx, request, true) +} + +// UploadExtensions uploads extensions and activates ordinary unpacked extensions over CDP. +func (s *ApiService) UploadExtensions(ctx context.Context, request oapi.UploadExtensionsRequestObject) (oapi.UploadExtensionsResponseObject, error) { + response, err := s.uploadExtensions(ctx, oapi.UploadExtensionsAndRestartRequestObject{Body: request.Body}, false) + if err != nil { + return nil, err + } + + switch response := response.(type) { + case oapi.UploadExtensionsAndRestart201Response: + return oapi.UploadExtensions201Response{}, nil + case oapi.UploadExtensionsAndRestart400JSONResponse: + return oapi.UploadExtensions400JSONResponse{BadRequestErrorJSONResponse: response.BadRequestErrorJSONResponse}, nil + case oapi.UploadExtensionsAndRestart500JSONResponse: + return oapi.UploadExtensions500JSONResponse{InternalErrorJSONResponse: response.InternalErrorJSONResponse}, nil + default: + return oapi.UploadExtensions500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: "internal error"}}, nil + } +} + +func (s *ApiService) uploadExtensions(ctx context.Context, request oapi.UploadExtensionsAndRestartRequestObject, forceRestart bool) (oapi.UploadExtensionsAndRestartResponseObject, error) { log := logger.FromContext(ctx) start := time.Now() log.Info("upload extensions: begin") @@ -159,7 +180,8 @@ func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oap return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}}, nil } - if requiresRestart { + restarted := forceRestart || requiresRestart + if restarted { if err := s.restartChromiumAndWait(ctx, "extension upload"); err != nil { return oapi.UploadExtensionsAndRestart500JSONResponse{ InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}, @@ -174,10 +196,10 @@ func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oap }, }, nil } - requiresRestart = true + restarted = true } - log.Info("extensions ready", "restarted", requiresRestart, "elapsed", time.Since(start).String()) + log.Info("extensions ready", "restarted", restarted, "elapsed", time.Since(start).String()) return oapi.UploadExtensionsAndRestart201Response{}, nil } diff --git a/server/e2e/e2e_chromium_test.go b/server/e2e/e2e_chromium_test.go index 5dd3d029..965cc80d 100644 --- a/server/e2e/e2e_chromium_test.go +++ b/server/e2e/e2e_chromium_test.go @@ -278,11 +278,11 @@ func TestExtensionUploadAndActivation(t *testing.T) { err = w.Close() require.NoError(t, err) start := time.Now() - rsp, err := client.UploadExtensionsAndRestartWithBodyWithResponse(ctx, w.FormDataContentType(), &body) + rsp, err := client.UploadExtensionsWithBodyWithResponse(ctx, w.FormDataContentType(), &body) elapsed := time.Since(start) - require.NoError(t, err, "uploadExtensionsAndRestart request error") + require.NoError(t, err, "uploadExtensions request error") require.Equal(t, http.StatusCreated, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) - t.Logf("/chromium/upload-extensions-and-restart completed in %s (%d ms)", elapsed.String(), elapsed.Milliseconds()) + t.Logf("/chromium/upload-extensions completed in %s (%d ms)", elapsed.String(), elapsed.Milliseconds()) } browserWebSocketAfter, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) @@ -302,6 +302,28 @@ func TestExtensionUploadAndActivation(t *testing.T) { out, err := cmd.CombinedOutput() require.NoError(t, err, "title verify failed: %v output=%s", err, string(out)) } + + // The legacy endpoint retains its unconditional restart behavior. + { + client, err := c.APIClient() + require.NoError(t, err) + var body bytes.Buffer + w := multipart.NewWriter(&body) + fw, err := w.CreateFormFile("extensions.zip_file", "ext.zip") + require.NoError(t, err) + _, err = io.Copy(fw, bytes.NewReader(extZip)) + require.NoError(t, err) + require.NoError(t, w.WriteField("extensions.name", "restart-testext")) + require.NoError(t, w.Close()) + + rsp, err := client.UploadExtensionsAndRestartWithBodyWithResponse(ctx, w.FormDataContentType(), &body) + require.NoError(t, err, "uploadExtensionsAndRestart request error") + require.Equal(t, http.StatusCreated, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) + } + + browserWebSocketAfterRestart, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) + require.NoError(t, err, "get browser WebSocket URL after legacy extension upload") + require.NotEqual(t, browserWebSocketAfter, browserWebSocketAfterRestart, "legacy endpoint did not restart Chromium") } func TestScreenshotHeadless(t *testing.T) { diff --git a/server/lib/events/category_gen.go b/server/lib/events/category_gen.go index 2729d421..f97893dc 100644 --- a/server/lib/events/category_gen.go +++ b/server/lib/events/category_gen.go @@ -99,6 +99,7 @@ var categoryByOperationID = map[string]oapi.TelemetryEventCategory{ "StreamTelemetryEvents": oapi.TelemetryEventCategory("platform"), "TakeScreenshot": oapi.TelemetryEventCategory("control"), "TypeText": oapi.TelemetryEventCategory("control"), + "UploadExtensions": oapi.TelemetryEventCategory("platform"), "UploadExtensionsAndRestart": oapi.TelemetryEventCategory("platform"), "UploadFiles": oapi.TelemetryEventCategory("platform"), "UploadZip": oapi.TelemetryEventCategory("platform"), diff --git a/server/lib/oapi/oapi.go b/server/lib/oapi/oapi.go index e1882f24..2876dc03 100644 --- a/server/lib/oapi/oapi.go +++ b/server/lib/oapi/oapi.go @@ -3891,6 +3891,18 @@ type PatchChromiumFlagsJSONBody struct { // PatchChromiumPoliciesJSONBody defines parameters for PatchChromiumPolicies. type PatchChromiumPoliciesJSONBody map[string]interface{} +// UploadExtensionsMultipartBody defines parameters for UploadExtensions. +type UploadExtensionsMultipartBody struct { + // Extensions List of extensions to upload and activate + Extensions []struct { + // Name Folder name to place the extension under /home/kernel/extensions/ + Name string `json:"name"` + + // ZipFile Zip archive containing an unpacked Chromium extension (must include manifest.json) + ZipFile openapi_types.File `json:"zip_file"` + } `json:"extensions"` +} + // UploadExtensionsAndRestartMultipartBody defines parameters for UploadExtensionsAndRestart. type UploadExtensionsAndRestartMultipartBody struct { // Extensions List of extensions to upload and activate @@ -4046,6 +4058,9 @@ type PatchChromiumFlagsJSONRequestBody PatchChromiumFlagsJSONBody // PatchChromiumPoliciesJSONRequestBody defines body for PatchChromiumPolicies for application/json ContentType. type PatchChromiumPoliciesJSONRequestBody PatchChromiumPoliciesJSONBody +// UploadExtensionsMultipartRequestBody defines body for UploadExtensions for multipart/form-data ContentType. +type UploadExtensionsMultipartRequestBody UploadExtensionsMultipartBody + // UploadExtensionsAndRestartMultipartRequestBody defines body for UploadExtensionsAndRestart for multipart/form-data ContentType. type UploadExtensionsAndRestartMultipartRequestBody UploadExtensionsAndRestartMultipartBody @@ -5223,6 +5238,9 @@ type ClientInterface interface { PatchChromiumPolicies(ctx context.Context, body PatchChromiumPoliciesJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // UploadExtensionsWithBody request with any body + UploadExtensionsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // UploadExtensionsAndRestartWithBody request with any body UploadExtensionsAndRestartWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -5494,6 +5512,18 @@ func (c *Client) PatchChromiumPolicies(ctx context.Context, body PatchChromiumPo return c.Client.Do(req) } +func (c *Client) UploadExtensionsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUploadExtensionsRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) UploadExtensionsAndRestartWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewUploadExtensionsAndRestartRequestWithBody(c.Server, contentType, body) if err != nil { @@ -6582,6 +6612,35 @@ func NewPatchChromiumPoliciesRequestWithBody(server string, contentType string, return req, nil } +// NewUploadExtensionsRequestWithBody generates requests for UploadExtensions with any type of body +func NewUploadExtensionsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/chromium/upload-extensions") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewUploadExtensionsAndRestartRequestWithBody generates requests for UploadExtensionsAndRestart with any type of body func NewUploadExtensionsAndRestartRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error @@ -8809,6 +8868,9 @@ type ClientWithResponsesInterface interface { PatchChromiumPoliciesWithResponse(ctx context.Context, body PatchChromiumPoliciesJSONRequestBody, reqEditors ...RequestEditorFn) (*PatchChromiumPoliciesResponse, error) + // UploadExtensionsWithBodyWithResponse request with any body + UploadExtensionsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UploadExtensionsResponse, error) + // UploadExtensionsAndRestartWithBodyWithResponse request with any body UploadExtensionsAndRestartWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UploadExtensionsAndRestartResponse, error) @@ -9078,6 +9140,29 @@ func (r PatchChromiumPoliciesResponse) StatusCode() int { return 0 } +type UploadExtensionsResponse struct { + Body []byte + HTTPResponse *http.Response + JSON400 *BadRequestError + JSON500 *InternalError +} + +// Status returns HTTPResponse.Status +func (r UploadExtensionsResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r UploadExtensionsResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type UploadExtensionsAndRestartResponse struct { Body []byte HTTPResponse *http.Response @@ -10398,6 +10483,15 @@ func (c *ClientWithResponses) PatchChromiumPoliciesWithResponse(ctx context.Cont return ParsePatchChromiumPoliciesResponse(rsp) } +// UploadExtensionsWithBodyWithResponse request with arbitrary body returning *UploadExtensionsResponse +func (c *ClientWithResponses) UploadExtensionsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UploadExtensionsResponse, error) { + rsp, err := c.UploadExtensionsWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUploadExtensionsResponse(rsp) +} + // UploadExtensionsAndRestartWithBodyWithResponse request with arbitrary body returning *UploadExtensionsAndRestartResponse func (c *ClientWithResponses) UploadExtensionsAndRestartWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UploadExtensionsAndRestartResponse, error) { rsp, err := c.UploadExtensionsAndRestartWithBody(ctx, contentType, body, reqEditors...) @@ -11190,6 +11284,39 @@ func ParsePatchChromiumPoliciesResponse(rsp *http.Response) (*PatchChromiumPolic return response, nil } +// ParseUploadExtensionsResponse parses an HTTP response from a UploadExtensionsWithResponse call +func ParseUploadExtensionsResponse(rsp *http.Response) (*UploadExtensionsResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &UploadExtensionsResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest BadRequestError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: + var dest InternalError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON500 = &dest + + } + + return response, nil +} + // ParseUploadExtensionsAndRestartResponse parses an HTTP response from a UploadExtensionsAndRestartWithResponse call func ParseUploadExtensionsAndRestartResponse(rsp *http.Response) (*UploadExtensionsAndRestartResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -13265,6 +13392,9 @@ type ServerInterface interface { // (PATCH /chromium/policies) PatchChromiumPolicies(w http.ResponseWriter, r *http.Request) // Upload and activate one or more unpacked extensions + // (POST /chromium/upload-extensions) + UploadExtensions(w http.ResponseWriter, r *http.Request) + // Upload one or more unpacked extensions (as zips) and restart Chromium // (POST /chromium/upload-extensions-and-restart) UploadExtensionsAndRestart(w http.ResponseWriter, r *http.Request) // Execute a batch of computer actions sequentially @@ -13445,6 +13575,12 @@ func (_ Unimplemented) PatchChromiumPolicies(w http.ResponseWriter, r *http.Requ } // Upload and activate one or more unpacked extensions +// (POST /chromium/upload-extensions) +func (_ Unimplemented) UploadExtensions(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotImplemented) +} + +// Upload one or more unpacked extensions (as zips) and restart Chromium // (POST /chromium/upload-extensions-and-restart) func (_ Unimplemented) UploadExtensionsAndRestart(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) @@ -13805,6 +13941,20 @@ func (siw *ServerInterfaceWrapper) PatchChromiumPolicies(w http.ResponseWriter, handler.ServeHTTP(w, r) } +// UploadExtensions operation middleware +func (siw *ServerInterfaceWrapper) UploadExtensions(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.UploadExtensions(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // UploadExtensionsAndRestart operation middleware func (siw *ServerInterfaceWrapper) UploadExtensionsAndRestart(w http.ResponseWriter, r *http.Request) { @@ -14984,6 +15134,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Patch(options.BaseURL+"/chromium/policies", wrapper.PatchChromiumPolicies) }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/chromium/upload-extensions", wrapper.UploadExtensions) + }) r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/chromium/upload-extensions-and-restart", wrapper.UploadExtensionsAndRestart) }) @@ -15226,6 +15379,40 @@ func (response PatchChromiumPolicies500JSONResponse) VisitPatchChromiumPoliciesR return json.NewEncoder(w).Encode(response) } +type UploadExtensionsRequestObject struct { + Body *multipart.Reader +} + +type UploadExtensionsResponseObject interface { + VisitUploadExtensionsResponse(w http.ResponseWriter) error +} + +type UploadExtensions201Response struct { +} + +func (response UploadExtensions201Response) VisitUploadExtensionsResponse(w http.ResponseWriter) error { + w.WriteHeader(201) + return nil +} + +type UploadExtensions400JSONResponse struct{ BadRequestErrorJSONResponse } + +func (response UploadExtensions400JSONResponse) VisitUploadExtensionsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(400) + + return json.NewEncoder(w).Encode(response) +} + +type UploadExtensions500JSONResponse struct{ InternalErrorJSONResponse } + +func (response UploadExtensions500JSONResponse) VisitUploadExtensionsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(500) + + return json.NewEncoder(w).Encode(response) +} + type UploadExtensionsAndRestartRequestObject struct { Body *multipart.Reader } @@ -17522,6 +17709,9 @@ type StrictServerInterface interface { // (PATCH /chromium/policies) PatchChromiumPolicies(ctx context.Context, request PatchChromiumPoliciesRequestObject) (PatchChromiumPoliciesResponseObject, error) // Upload and activate one or more unpacked extensions + // (POST /chromium/upload-extensions) + UploadExtensions(ctx context.Context, request UploadExtensionsRequestObject) (UploadExtensionsResponseObject, error) + // Upload one or more unpacked extensions (as zips) and restart Chromium // (POST /chromium/upload-extensions-and-restart) UploadExtensionsAndRestart(ctx context.Context, request UploadExtensionsAndRestartRequestObject) (UploadExtensionsAndRestartResponseObject, error) // Execute a batch of computer actions sequentially @@ -17776,6 +17966,37 @@ func (sh *strictHandler) PatchChromiumPolicies(w http.ResponseWriter, r *http.Re } } +// UploadExtensions operation middleware +func (sh *strictHandler) UploadExtensions(w http.ResponseWriter, r *http.Request) { + var request UploadExtensionsRequestObject + + if reader, err := r.MultipartReader(); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode multipart body: %w", err)) + return + } else { + request.Body = reader + } + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.UploadExtensions(ctx, request.(UploadExtensionsRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "UploadExtensions") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(UploadExtensionsResponseObject); ok { + if err := validResponse.VisitUploadExtensionsResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + // UploadExtensionsAndRestart operation middleware func (sh *strictHandler) UploadExtensionsAndRestart(w http.ResponseWriter, r *http.Request) { var request UploadExtensionsAndRestartRequestObject @@ -19369,393 +19590,395 @@ func (sh *strictHandler) StreamTelemetryEvents(w http.ResponseWriter, r *http.Re // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "CR3d+5eWHksOsFnAf/r0/wcAAP//oIjT6DrpAQA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/server/openapi.yaml b/server/openapi.yaml index 3031e7e4..e60094da 100644 --- a/server/openapi.yaml +++ b/server/openapi.yaml @@ -1141,6 +1141,46 @@ paths: $ref: "#/components/responses/InternalError" /chromium/upload-extensions-and-restart: + post: + summary: Upload one or more unpacked extensions (as zips) and restart Chromium + description: | + Upload one or more extension zip archives, extract them under /home/kernel/extensions/, + set runtime extension flags in /chromium/flags, restart Chromium via supervisord, and wait + until the Chromium DevTools "listening" log line is observed before returning success. + operationId: uploadExtensionsAndRestart + x-telemetry-category: platform + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + extensions: + type: array + description: List of extensions to upload and activate + items: + type: object + properties: + zip_file: + type: string + format: binary + description: Zip archive containing an unpacked Chromium extension (must include manifest.json) + name: + type: string + description: Folder name to place the extension under /home/kernel/extensions/ + pattern: "^[A-Za-z0-9._-]{1,255}$" + required: [zip_file, name] + required: [extensions] + responses: + "201": + description: Extensions uploaded, Chromium restarted, and DevTools is ready + "400": + $ref: "#/components/responses/BadRequestError" + "500": + $ref: "#/components/responses/InternalError" + + /chromium/upload-extensions: post: summary: Upload and activate one or more unpacked extensions description: | @@ -1150,7 +1190,7 @@ paths: Content scripts are applied to existing pages after their next navigation or reload. Extensions that require enterprise policy still restart Chromium and wait for DevTools readiness before returning success. - operationId: uploadExtensionsAndRestart + operationId: uploadExtensions x-telemetry-category: platform requestBody: required: true From 80332d2fec3c185b24a7561b1da43c1e0329b45f Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Tue, 18 Aug 2026 22:01:04 +0000 Subject: [PATCH 05/10] Log unexpected extension upload responses --- server/cmd/api/api/chromium.go | 1 + 1 file changed, 1 insertion(+) diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index d1c552df..09a2ac55 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -54,6 +54,7 @@ func (s *ApiService) UploadExtensions(ctx context.Context, request oapi.UploadEx case oapi.UploadExtensionsAndRestart500JSONResponse: return oapi.UploadExtensions500JSONResponse{InternalErrorJSONResponse: response.InternalErrorJSONResponse}, nil default: + logger.FromContext(ctx).Error("unexpected extension upload response", "type", fmt.Sprintf("%T", response)) return oapi.UploadExtensions500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: "internal error"}}, nil } } From 497e04365e60bde9ed68cdb826f673d5426a5d81 Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:23:41 +0000 Subject: [PATCH 06/10] Address extension upload review --- server/cmd/api/api/chromium.go | 515 +- .../cmd/api/api/chromium_extensions_test.go | 86 + server/cmd/api/api/display_test.go | 18 +- server/e2e/e2e_chromium_test.go | 31 +- server/e2e/e2e_combined_flow_test.go | 4 +- server/e2e/e2e_enterprise_extension_test.go | 14 +- server/lib/oapi/oapi.go | 9281 ++++++++++++----- server/lib/policy/policy.go | 66 +- server/lib/policy/policy_test.go | 19 + server/openapi.yaml | 60 +- 10 files changed, 7158 insertions(+), 2936 deletions(-) create mode 100644 server/cmd/api/api/chromium_extensions_test.go diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index 09a2ac55..224aff72 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -2,6 +2,7 @@ package api import ( "context" + "errors" "fmt" "io" "mime/multipart" @@ -36,63 +37,117 @@ const ( // UploadExtensionsAndRestart uploads extensions and always restarts Chromium. func (s *ApiService) UploadExtensionsAndRestart(ctx context.Context, request oapi.UploadExtensionsAndRestartRequestObject) (oapi.UploadExtensionsAndRestartResponseObject, error) { - return s.uploadExtensions(ctx, request, true) + if uploadErr := s.uploadExtensions(ctx, request.Body, true); uploadErr != nil { + if uploadErr.kind == extensionUploadBadRequest { + return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: uploadErr.message}}, nil + } + return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: uploadErr.message}}, nil + } + return oapi.UploadExtensionsAndRestart201Response{}, nil } // UploadExtensions uploads extensions and activates ordinary unpacked extensions over CDP. func (s *ApiService) UploadExtensions(ctx context.Context, request oapi.UploadExtensionsRequestObject) (oapi.UploadExtensionsResponseObject, error) { - response, err := s.uploadExtensions(ctx, oapi.UploadExtensionsAndRestartRequestObject{Body: request.Body}, false) - if err != nil { - return nil, err + if uploadErr := s.uploadExtensions(ctx, request.Body, false); uploadErr != nil { + if uploadErr.kind == extensionUploadBadRequest { + return oapi.UploadExtensions400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: uploadErr.message}}, nil + } + return oapi.UploadExtensions500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: uploadErr.message}}, nil } + return oapi.UploadExtensions201Response{}, nil +} - switch response := response.(type) { - case oapi.UploadExtensionsAndRestart201Response: - return oapi.UploadExtensions201Response{}, nil - case oapi.UploadExtensionsAndRestart400JSONResponse: - return oapi.UploadExtensions400JSONResponse{BadRequestErrorJSONResponse: response.BadRequestErrorJSONResponse}, nil - case oapi.UploadExtensionsAndRestart500JSONResponse: - return oapi.UploadExtensions500JSONResponse{InternalErrorJSONResponse: response.InternalErrorJSONResponse}, nil - default: - logger.FromContext(ctx).Error("unexpected extension upload response", "type", fmt.Sprintf("%T", response)) - return oapi.UploadExtensions500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: "internal error"}}, nil - } +type extensionUploadErrorKind uint8 + +const ( + extensionUploadBadRequest extensionUploadErrorKind = iota + extensionUploadInternal + + maxExtensionUploadCount = 20 + maxExtensionZipBytes = int64(50 << 20) + extensionActivationTimeout = 30 * time.Second +) + +type extensionUploadError struct { + kind extensionUploadErrorKind + message string +} + +func badExtensionUpload(message string) *extensionUploadError { + return &extensionUploadError{kind: extensionUploadBadRequest, message: message} } -func (s *ApiService) uploadExtensions(ctx context.Context, request oapi.UploadExtensionsAndRestartRequestObject, forceRestart bool) (oapi.UploadExtensionsAndRestartResponseObject, error) { +func internalExtensionUpload(message string) *extensionUploadError { + return &extensionUploadError{kind: extensionUploadInternal, message: message} +} + +func (s *ApiService) uploadExtensions(ctx context.Context, mr *multipart.Reader, forceRestart bool) *extensionUploadError { log := logger.FromContext(ctx) start := time.Now() log.Info("upload extensions: begin") - if request.Body == nil { - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "request body required"}}, nil + if mr == nil { + return badExtensionUpload("request body required") } - // Strict handler gives us *multipart.Reader; use NextPart() directly - mr, ok := any(request.Body).(interface { - NextPart() (*multipart.Part, error) - }) - if !ok { - return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: "multipart reader not available"}}, nil + extItems, cleanup, uploadErr := readExtensionUpload(mr) + defer cleanup() + if uploadErr != nil { + return uploadErr } - temps := []string{} - defer func() { - for _, p := range temps { - _ = os.Remove(p) + prepared, reqMsg, err := s.prepareExtensionZipItems(ctx, extItems) + if reqMsg != "" { + return badExtensionUpload(reqMsg) + } + if err != nil { + return internalExtensionUpload(err.Error()) + } + defer prepared.cleanup() + + s.chromiumConfigMu.Lock() + defer s.chromiumConfigMu.Unlock() + + requiresRestart, reqMsg, err := s.commitPreparedExtensions(ctx, prepared) + if reqMsg != "" { + return badExtensionUpload(reqMsg) + } + if err != nil { + return internalExtensionUpload(err.Error()) + } + + restarted := forceRestart || requiresRestart + if restarted { + if err := s.restartChromiumAndWait(ctx, "extension upload"); err != nil { + return internalExtensionUpload(err.Error()) } - }() + } else if loadErr := s.loadUnpackedExtensions(ctx, extItems); loadErr != nil { + log.Warn("CDP extension load failed, restarting Chromium", "error", loadErr) + if restartErr := s.restartChromiumAndWait(ctx, "extension upload fallback"); restartErr != nil { + return internalExtensionUpload(fmt.Sprintf("CDP extension load failed (%v), and fallback restart failed: %v", loadErr, restartErr)) + } + restarted = true + } + + log.Info("extensions ready", "restarted", restarted, "elapsed", time.Since(start).String()) + return nil +} + +func readExtensionUpload(mr *multipart.Reader) ([]extensionZipItem, func(), *extensionUploadError) { + temps := make([]string, 0) + cleanup := func() { + for _, path := range temps { + _ = os.Remove(path) + } + } type pending struct { zipTemp string name string zipReceived bool } - // Process consecutive pairs of fields: - // extensions.name (text) - // extensions.zip_file (file) - // Order may be name then zip or zip then name, but they must be consecutive. - items := []pending{} + items := make([]extensionZipItem, 0) + seenNames := make(map[string]struct{}) var current *pending for { @@ -101,253 +156,339 @@ func (s *ApiService) uploadExtensions(ctx context.Context, request oapi.UploadEx break } if err != nil { - log.Error("read form part", "error", err) - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "failed to read form part"}}, nil + return nil, cleanup, badExtensionUpload("failed to read form part") } if current == nil { + if len(items) >= maxExtensionUploadCount { + return nil, cleanup, badExtensionUpload(fmt.Sprintf("too many extensions; maximum is %d", maxExtensionUploadCount)) + } current = &pending{} } + switch part.FormName() { case "extensions.zip_file": + if current.zipReceived { + return nil, cleanup, badExtensionUpload("duplicate zip_file in pair") + } tmp, err := os.CreateTemp("", "ext-*.zip") if err != nil { - log.Error("failed to create temporary file", "error", err) - return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: "internal error"}}, nil + return nil, cleanup, internalExtensionUpload("internal error") } temps = append(temps, tmp.Name()) - if _, err := io.Copy(tmp, part); err != nil { - tmp.Close() - log.Error("failed to read zip file", "error", err) - return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: "failed to read zip file"}}, nil - } - if err := tmp.Close(); err != nil { - log.Error("failed to finalize temporary file", "error", err) - return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: "internal error"}}, nil + _, copyErr := copyExtensionZip(tmp, part, maxExtensionZipBytes) + closeErr := tmp.Close() + if copyErr != nil { + return nil, cleanup, copyErr } - if current.zipReceived { - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "duplicate zip_file in pair"}}, nil + if closeErr != nil { + return nil, cleanup, internalExtensionUpload("internal error") } current.zipTemp = tmp.Name() current.zipReceived = true case "extensions.name": - b, err := io.ReadAll(part) + if current.name != "" { + return nil, cleanup, badExtensionUpload("duplicate name in pair") + } + nameBytes, err := io.ReadAll(io.LimitReader(part, 256)) if err != nil { - log.Error("failed to read name", "error", err) - return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: "failed to read name"}}, nil + return nil, cleanup, internalExtensionUpload("failed to read name") } - name := strings.TrimSpace(string(b)) + name := strings.TrimSpace(string(nameBytes)) if name == "" || !nameRegex.MatchString(name) { - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "invalid extension name"}}, nil + return nil, cleanup, badExtensionUpload("invalid extension name") } - if current.name != "" { - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "duplicate name in pair"}}, nil + if _, exists := seenNames[name]; exists { + return nil, cleanup, badExtensionUpload(fmt.Sprintf("duplicate extension name: %s", name)) } current.name = name default: - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: fmt.Sprintf("invalid field: %s", part.FormName())}}, nil + return nil, cleanup, badExtensionUpload(fmt.Sprintf("invalid field: %s", part.FormName())) } - // If we have both fields, finalize this item - if current != nil && current.zipReceived && current.name != "" { - items = append(items, *current) + + if current.zipReceived && current.name != "" { + items = append(items, extensionZipItem{zipTemp: current.zipTemp, name: current.name}) + seenNames[current.name] = struct{}{} current = nil } } - // If the last pair is incomplete, reject the request - if current != nil && (!current.zipReceived || current.name == "") { - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "each extension must include consecutive name and zip_file"}}, nil + if current != nil { + return nil, cleanup, badExtensionUpload("each extension must include consecutive name and zip_file") } - if len(items) == 0 { - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "no extensions provided"}}, nil + return nil, cleanup, badExtensionUpload("no extensions provided") } + return items, cleanup, nil +} - extItems := make([]extensionZipItem, 0, len(items)) - for _, p := range items { - if !p.zipReceived || p.name == "" { - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: "each item must include zip_file and name"}}, nil - } - extItems = append(extItems, extensionZipItem{zipTemp: p.zipTemp, name: p.name}) +func copyExtensionZip(dst io.Writer, src io.Reader, maxBytes int64) (int64, *extensionUploadError) { + written, err := io.Copy(dst, io.LimitReader(src, maxBytes+1)) + if err != nil { + return written, internalExtensionUpload("failed to read zip file") } + if written > maxBytes { + return written, badExtensionUpload("extension zip exceeds maximum allowed size (50 MiB)") + } + return written, nil +} - s.chromiumConfigMu.Lock() - defer s.chromiumConfigMu.Unlock() +type preparedExtension struct { + name string + stagingPath string + finalPath string + chromeExtensionID string + requiresEnterprisePolicy bool +} - requiresRestart, reqMsg, err := s.applyExtensionZipItems(ctx, extItems) - if reqMsg != "" { - return oapi.UploadExtensionsAndRestart400JSONResponse{BadRequestErrorJSONResponse: oapi.BadRequestErrorJSONResponse{Message: reqMsg}}, nil - } - if err != nil { - return oapi.UploadExtensionsAndRestart500JSONResponse{InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}}, nil - } +type preparedExtensionBatch struct { + stagingRoot string + extensions []preparedExtension + flagPaths []string + requiresRestart bool +} - restarted := forceRestart || requiresRestart - if restarted { - if err := s.restartChromiumAndWait(ctx, "extension upload"); err != nil { - return oapi.UploadExtensionsAndRestart500JSONResponse{ - InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{Message: err.Error()}, - }, nil - } - } else if loadErr := s.loadUnpackedExtensions(ctx, extItems); loadErr != nil { - log.Warn("CDP extension load failed, restarting Chromium", "error", loadErr) - if restartErr := s.restartChromiumAndWait(ctx, "extension upload fallback"); restartErr != nil { - return oapi.UploadExtensionsAndRestart500JSONResponse{ - InternalErrorJSONResponse: oapi.InternalErrorJSONResponse{ - Message: fmt.Sprintf("CDP extension load failed (%v), and fallback restart failed: %v", loadErr, restartErr), - }, - }, nil - } - restarted = true +func (batch *preparedExtensionBatch) cleanup() { + if batch != nil && batch.stagingRoot != "" { + _ = os.RemoveAll(batch.stagingRoot) } - - log.Info("extensions ready", "restarted", restarted, "elapsed", time.Since(start).String()) - return oapi.UploadExtensionsAndRestart201Response{}, nil } // applyExtensionZipItems installs name+zipTemp extension pairs and persists their startup // configuration. The boolean result reports whether enterprise policy requires a restart. func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensionZipItem) (bool, string, error) { + prepared, reqMsg, err := s.prepareExtensionZipItems(ctx, items) + if prepared != nil { + defer prepared.cleanup() + } + if reqMsg != "" || err != nil { + return false, reqMsg, err + } + return s.commitPreparedExtensions(ctx, prepared) +} + +// prepareExtensionZipItems performs archive extraction and validation before the global Chromium +// configuration lock is acquired. commitPreparedExtensions rechecks destination names under lock. +func (s *ApiService) prepareExtensionZipItems(ctx context.Context, items []extensionZipItem) (*preparedExtensionBatch, string, error) { log := logger.FromContext(ctx) if err := os.MkdirAll(extensionsBaseDir, 0o755); err != nil { - return false, "", fmt.Errorf("failed to create extension base dir: %w", err) + return nil, "", fmt.Errorf("failed to create extension base dir: %w", err) } - for _, p := range items { - dest := filepath.Join(extensionsBaseDir, p.name) - if _, err := os.Stat(dest); err == nil { - return false, fmt.Sprintf("extension name already exists: %s", p.name), nil - } else if !os.IsNotExist(err) { - log.Error("failed to check extension dir", "error", err) - return false, "", fmt.Errorf("failed to check extension dir: %w", err) - } + stagingRoot, err := os.MkdirTemp(extensionsBaseDir, ".upload-*") + if err != nil { + return nil, "", fmt.Errorf("failed to create extension staging dir: %w", err) } - - var createdDests []string - success := false + batch := &preparedExtensionBatch{ + stagingRoot: stagingRoot, + extensions: make([]preparedExtension, 0, len(items)), + flagPaths: make([]string, 0, len(items)), + } + failed := true defer func() { - if success { - return - } - for _, dest := range createdDests { - if removeErr := os.RemoveAll(dest); removeErr != nil { - log.Warn("failed to clean up partial extension dir", "error", removeErr, "dest", dest) - } + if failed { + batch.cleanup() } }() - for _, p := range items { - dest := filepath.Join(extensionsBaseDir, p.name) - if err := os.MkdirAll(dest, 0o755); err != nil { - log.Error("failed to create extension dir", "error", err) - return false, "", fmt.Errorf("failed to create extension dir: %w", err) - } - createdDests = append(createdDests, dest) - if err := ziputil.Unzip(p.zipTemp, dest); err != nil { - log.Error("failed to unzip zip file", "error", err) - return false, "invalid zip file", nil + seenNames := make(map[string]struct{}, len(items)) + for _, item := range items { + if _, exists := seenNames[item.name]; exists { + return nil, fmt.Sprintf("duplicate extension name: %s", item.name), nil } + seenNames[item.name] = struct{}{} - updateXMLPath := filepath.Join(dest, "update.xml") - if err := policy.RewriteUpdateXMLUrls(updateXMLPath, p.name); err != nil { - log.Warn("failed to rewrite update.xml URLs", "error", err, "extension", p.name) + stagingPath := filepath.Join(stagingRoot, item.name) + finalPath := filepath.Join(extensionsBaseDir, item.name) + if err := os.Mkdir(stagingPath, 0o755); err != nil { + return nil, "", fmt.Errorf("failed to create extension staging directory: %w", err) } - - if err := exec.Command("chown", "-R", "kernel:kernel", dest).Run(); err != nil { - log.Error("failed to chown extension dir", "error", err) - return false, "", fmt.Errorf("failed to chown extension dir: %w", err) + if err := ziputil.Unzip(item.zipTemp, stagingPath); err != nil { + return nil, "invalid zip file", nil } - log.Info("installed extension", "name", p.name) - } - - var pathsNeedingFlags []string - requiresRestart := false - - for _, p := range items { - extensionPath := filepath.Join(extensionsBaseDir, p.name) - extensionName := p.name - manifestPath := filepath.Join(extensionPath, "manifest.json") - updateXMLPath := filepath.Join(extensionPath, "update.xml") + updateXMLPath := filepath.Join(stagingPath, "update.xml") + if err := policy.RewriteUpdateXMLUrls(updateXMLPath, item.name); err != nil { + log.Warn("failed to rewrite update.xml URLs", "error", err, "extension", item.name) + } + if err := exec.Command("chown", "-R", "kernel:kernel", stagingPath).Run(); err != nil { + return nil, "", fmt.Errorf("failed to chown extension dir: %w", err) + } - requiresEntPolicy, err := s.policy.RequiresEnterprisePolicy(manifestPath) + requiresEnterprisePolicy, err := s.policy.RequiresEnterprisePolicy(filepath.Join(stagingPath, "manifest.json")) if err != nil { - return false, fmt.Sprintf("invalid extension %s: %v", extensionName, err), nil + return nil, fmt.Sprintf("invalid extension %s: %v", item.name, err), nil } - chromeExtensionID := extensionName - var extractionErr error - if extractedID, err := policy.ExtractExtensionIDFromUpdateXML(updateXMLPath); err == nil { + chromeExtensionID := item.name + extractedID, extractionErr := policy.ExtractExtensionIDFromUpdateXML(updateXMLPath) + if extractionErr == nil { chromeExtensionID = extractedID - log.Info("extracted Chrome extension ID from update.xml", "name", extensionName, "chromeExtensionID", chromeExtensionID) - } else { - extractionErr = err - log.Info("no Chrome extension ID in update.xml, using name as ID", "name", extensionName, "error", err) + log.Info("extracted Chrome extension ID from update.xml", "name", item.name, "chromeExtensionID", chromeExtensionID) } - if requiresEntPolicy { - log.Info("extension requires enterprise policy", "name", extensionName) - + if requiresEnterprisePolicy { hasUpdateXML := false hasCRX := false - if _, err := os.Stat(updateXMLPath); err == nil { if extractionErr != nil { - return false, fmt.Sprintf("extension %s requires enterprise policy but update.xml is invalid: %v", extensionName, extractionErr), nil + return nil, fmt.Sprintf("extension %s requires enterprise policy but update.xml is invalid: %v", item.name, extractionErr), nil } hasUpdateXML = true - log.Info("found update.xml in extension zip", "name", extensionName) + } else if !os.IsNotExist(err) { + return nil, "", fmt.Errorf("failed to inspect update.xml for %s: %w", item.name, err) } - entries, err := os.ReadDir(extensionPath) - if err == nil { - for _, entry := range entries { - if !entry.IsDir() && filepath.Ext(entry.Name()) == ".crx" { - hasCRX = true - log.Info("found .crx file in extension zip", "name", extensionName, "crx_file", entry.Name()) - break - } + entries, err := os.ReadDir(stagingPath) + if err != nil { + return nil, "", fmt.Errorf("failed to inspect extension %s: %w", item.name, err) + } + for _, entry := range entries { + if !entry.IsDir() && filepath.Ext(entry.Name()) == ".crx" { + hasCRX = true + break } } if !hasUpdateXML || !hasCRX { log.Info("extension missing policy files, falling back to --load-extension", - "name", extensionName, "hasUpdateXML", hasUpdateXML, "hasCRX", hasCRX) - requiresEntPolicy = false - pathsNeedingFlags = append(pathsNeedingFlags, extensionPath) + "name", item.name, "hasUpdateXML", hasUpdateXML, "hasCRX", hasCRX) + requiresEnterprisePolicy = false } else { - requiresRestart = true + batch.requiresRestart = true } - } else { - pathsNeedingFlags = append(pathsNeedingFlags, extensionPath) } - if err := s.policy.AddExtension(extensionName, chromeExtensionID, extensionPath, requiresEntPolicy); err != nil { - log.Error("failed to update enterprise policy", "error", err, "extension", extensionName) - return false, "", fmt.Errorf("failed to update enterprise policy for %s: %w", extensionName, err) + if !requiresEnterprisePolicy { + batch.flagPaths = append(batch.flagPaths, finalPath) } + batch.extensions = append(batch.extensions, preparedExtension{ + name: item.name, + stagingPath: stagingPath, + finalPath: finalPath, + chromeExtensionID: chromeExtensionID, + requiresEnterprisePolicy: requiresEnterprisePolicy, + }) + } + + failed = false + return batch, "", nil +} + +type optionalFileSnapshot struct { + path string + data []byte + mode os.FileMode + exists bool +} - log.Info("updated enterprise policy", "extension", extensionName, "chromeExtensionID", chromeExtensionID, "requiresEnterprisePolicy", requiresEntPolicy) +func captureOptionalFileSnapshot(path string) (optionalFileSnapshot, error) { + data, err := os.ReadFile(path) + if err != nil { + if os.IsNotExist(err) { + return optionalFileSnapshot{path: path}, nil + } + return optionalFileSnapshot{}, err } + info, err := os.Stat(path) + if err != nil { + return optionalFileSnapshot{}, err + } + return optionalFileSnapshot{path: path, data: data, mode: info.Mode().Perm(), exists: true}, nil +} - var newTokens []string - if len(pathsNeedingFlags) > 0 { - newTokens = []string{ - fmt.Sprintf("--load-extension=%s", strings.Join(pathsNeedingFlags, ",")), +func restoreOptionalFileSnapshot(snapshot optionalFileSnapshot) error { + if !snapshot.exists { + if err := os.Remove(snapshot.path); err != nil && !os.IsNotExist(err) { + return err } + return nil + } + if err := os.MkdirAll(filepath.Dir(snapshot.path), 0o755); err != nil { + return err + } + return os.WriteFile(snapshot.path, snapshot.data, snapshot.mode) +} + +func (s *ApiService) commitPreparedExtensions(ctx context.Context, batch *preparedExtensionBatch) (requiresRestart bool, reqMsg string, err error) { + for _, extension := range batch.extensions { + if _, statErr := os.Stat(extension.finalPath); statErr == nil { + return false, fmt.Sprintf("extension name already exists: %s", extension.name), nil + } else if !os.IsNotExist(statErr) { + return false, "", fmt.Errorf("failed to check extension dir: %w", statErr) + } + } + + flagsSnapshot, err := captureOptionalFileSnapshot(chromiumFlagsPath) + if err != nil { + return false, "", fmt.Errorf("failed to snapshot chromium flags: %w", err) + } + policySnapshot, err := captureOptionalFileSnapshot(policy.PolicyPath) + if err != nil { + return false, "", fmt.Errorf("failed to snapshot chromium policy: %w", err) } + committedPaths := make([]string, 0, len(batch.extensions)) + committed := false + defer func() { + if committed { + return + } + var rollbackErr error + for _, path := range committedPaths { + if removeErr := os.RemoveAll(path); removeErr != nil { + rollbackErr = errors.Join(rollbackErr, fmt.Errorf("remove extension directory %s: %w", path, removeErr)) + } + } + if restoreErr := restoreOptionalFileSnapshot(policySnapshot); restoreErr != nil { + rollbackErr = errors.Join(rollbackErr, fmt.Errorf("restore chromium policy: %w", restoreErr)) + } + if restoreErr := restoreOptionalFileSnapshot(flagsSnapshot); restoreErr != nil { + rollbackErr = errors.Join(rollbackErr, fmt.Errorf("restore chromium flags: %w", restoreErr)) + } + if rollbackErr != nil { + reqMsg = "" + err = errors.Join(err, fmt.Errorf("rollback extension installation: %w", rollbackErr)) + } + }() + + registrations := make([]policy.ExtensionRegistration, 0, len(batch.extensions)) + for _, extension := range batch.extensions { + if err := os.Rename(extension.stagingPath, extension.finalPath); err != nil { + return false, "", fmt.Errorf("commit extension directory %s: %w", extension.name, err) + } + committedPaths = append(committedPaths, extension.finalPath) + registrations = append(registrations, policy.ExtensionRegistration{ + Name: extension.name, + ChromeExtensionID: extension.chromeExtensionID, + RequiresEnterprisePolicy: extension.requiresEnterprisePolicy, + }) + } + + if err := s.policy.AddExtensions(registrations); err != nil { + return false, "", fmt.Errorf("failed to update enterprise policy: %w", err) + } + + var newTokens []string + if len(batch.flagPaths) > 0 { + newTokens = []string{fmt.Sprintf("--load-extension=%s", strings.Join(batch.flagPaths, ","))} + } if _, err := s.mergeAndWriteChromiumFlags(ctx, newTokens); err != nil { return false, "", err } - success = true - return requiresRestart, "", nil + committed = true + for _, extension := range batch.extensions { + logger.FromContext(ctx).Info("installed extension", + "name", extension.name, + "chromeExtensionID", extension.chromeExtensionID, + "requiresEnterprisePolicy", extension.requiresEnterprisePolicy) + } + return batch.requiresRestart, "", nil } func (s *ApiService) loadUnpackedExtensions(ctx context.Context, items []extensionZipItem) error { log := logger.FromContext(ctx) - timeout := time.Duration(len(items)) * 10 * time.Second - return s.withCDPClientTimeout(ctx, timeout, func(cdpCtx context.Context, client *cdpclient.Client) error { + return s.withCDPClientTimeout(ctx, extensionActivationTimeout, func(cdpCtx context.Context, client *cdpclient.Client) error { for _, item := range items { path := filepath.Join(extensionsBaseDir, item.name) id, err := client.LoadUnpackedExtension(cdpCtx, path) diff --git a/server/cmd/api/api/chromium_extensions_test.go b/server/cmd/api/api/chromium_extensions_test.go new file mode 100644 index 00000000..71120968 --- /dev/null +++ b/server/cmd/api/api/chromium_extensions_test.go @@ -0,0 +1,86 @@ +package api + +import ( + "bytes" + "io" + "mime/multipart" + "os" + "path/filepath" + "strconv" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func extensionUploadReader(t *testing.T, count int, name func(int) string) *multipart.Reader { + t.Helper() + var body bytes.Buffer + writer := multipart.NewWriter(&body) + for i := 0; i < count; i++ { + part, err := writer.CreateFormFile("extensions.zip_file", "extension.zip") + require.NoError(t, err) + _, err = io.WriteString(part, "zip") + require.NoError(t, err) + require.NoError(t, writer.WriteField("extensions.name", name(i))) + } + require.NoError(t, writer.Close()) + return multipart.NewReader(&body, writer.Boundary()) +} + +func TestReadExtensionUploadLimitsCount(t *testing.T) { + reader := extensionUploadReader(t, maxExtensionUploadCount+1, func(i int) string { + return "extension-" + strconv.Itoa(i) + }) + items, cleanup, uploadErr := readExtensionUpload(reader) + defer cleanup() + + require.Nil(t, items) + require.NotNil(t, uploadErr) + require.Equal(t, extensionUploadBadRequest, uploadErr.kind) + require.Contains(t, uploadErr.message, "too many extensions") +} + +func TestReadExtensionUploadRejectsDuplicateNames(t *testing.T) { + reader := extensionUploadReader(t, 2, func(int) string { return "duplicate" }) + items, cleanup, uploadErr := readExtensionUpload(reader) + defer cleanup() + + require.Nil(t, items) + require.NotNil(t, uploadErr) + require.Equal(t, extensionUploadBadRequest, uploadErr.kind) + require.Equal(t, "duplicate extension name: duplicate", uploadErr.message) +} + +func TestCopyExtensionZipLimitsBytes(t *testing.T) { + var dst bytes.Buffer + written, uploadErr := copyExtensionZip(&dst, strings.NewReader("12345"), 4) + + require.EqualValues(t, 5, written) + require.NotNil(t, uploadErr) + require.Equal(t, extensionUploadBadRequest, uploadErr.kind) +} + +func TestOptionalFileSnapshotRestoresExistingAndMissingFiles(t *testing.T) { + dir := t.TempDir() + existingPath := filepath.Join(dir, "existing") + require.NoError(t, os.WriteFile(existingPath, []byte("before"), 0o600)) + existing, err := captureOptionalFileSnapshot(existingPath) + require.NoError(t, err) + require.NoError(t, os.WriteFile(existingPath, []byte("after"), 0o644)) + require.NoError(t, restoreOptionalFileSnapshot(existing)) + data, err := os.ReadFile(existingPath) + require.NoError(t, err) + require.Equal(t, "before", string(data)) + info, err := os.Stat(existingPath) + require.NoError(t, err) + require.Equal(t, os.FileMode(0o600), info.Mode().Perm()) + + missingPath := filepath.Join(dir, "missing") + missing, err := captureOptionalFileSnapshot(missingPath) + require.NoError(t, err) + require.NoError(t, os.WriteFile(missingPath, []byte("created"), 0o644)) + require.NoError(t, restoreOptionalFileSnapshot(missing)) + _, err = os.Stat(missingPath) + require.True(t, os.IsNotExist(err)) +} diff --git a/server/cmd/api/api/display_test.go b/server/cmd/api/api/display_test.go index 008472ea..d4838276 100644 --- a/server/cmd/api/api/display_test.go +++ b/server/cmd/api/api/display_test.go @@ -571,26 +571,20 @@ func TestAdjustParamsForRemainingBudget(t *testing.T) { }) } -func TestPatchDisplayLockedDoesNotRelockChromiumConfig(t *testing.T) { +func TestChromiumRunPatchDisplayDoesNotRelockChromiumConfig(t *testing.T) { s := &ApiService{} s.chromiumConfigMu.Lock() defer s.chromiumConfigMu.Unlock() - type result struct { - resp oapi.PatchDisplayResponseObject - err error - } - done := make(chan result, 1) + done := make(chan oapi.ChromiumConfigureResponseObject, 1) go func() { - resp, err := s.patchDisplayLocked(context.Background(), oapi.PatchDisplayRequestObject{}) - done <- result{resp: resp, err: err} + done <- chromiumRunPatchDisplay(context.Background(), s, nil) }() select { - case got := <-done: - require.NoError(t, got.err) - require.IsType(t, oapi.PatchDisplay400JSONResponse{}, got.resp) + case response := <-done: + require.IsType(t, oapi.ChromiumConfigure400JSONResponse{}, response) case <-time.After(time.Second): - t.Fatal("patchDisplayLocked tried to reacquire chromiumConfigMu") + t.Fatal("chromiumRunPatchDisplay tried to reacquire chromiumConfigMu") } } diff --git a/server/e2e/e2e_chromium_test.go b/server/e2e/e2e_chromium_test.go index 965cc80d..25b7bcf4 100644 --- a/server/e2e/e2e_chromium_test.go +++ b/server/e2e/e2e_chromium_test.go @@ -303,6 +303,35 @@ func TestExtensionUploadAndActivation(t *testing.T) { require.NoError(t, err, "title verify failed: %v output=%s", err, string(out)) } + // A manifest that passes server-side JSON validation but is rejected by Chromium forces + // the CDP activation failure path. The endpoint falls back to a restart and still succeeds. + invalidExtDir := t.TempDir() + require.NoError(t, os.WriteFile(filepath.Join(invalidExtDir, "manifest.json"), []byte(`{ + "manifest_version": 3, + "name": "Missing Version Extension" +}`), 0o600)) + invalidExtZip, err := zipDirToBytes(invalidExtDir) + require.NoError(t, err, "zip invalid extension") + { + client, err := c.APIClient() + require.NoError(t, err) + var body bytes.Buffer + w := multipart.NewWriter(&body) + fw, err := w.CreateFormFile("extensions.zip_file", "invalid-ext.zip") + require.NoError(t, err) + _, err = io.Copy(fw, bytes.NewReader(invalidExtZip)) + require.NoError(t, err) + require.NoError(t, w.WriteField("extensions.name", "cdp-fallback-testext")) + require.NoError(t, w.Close()) + + rsp, err := client.UploadExtensionsWithBodyWithResponse(ctx, w.FormDataContentType(), &body) + require.NoError(t, err, "uploadExtensions fallback request error") + require.Equal(t, http.StatusCreated, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) + } + browserWebSocketAfterFallback, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) + require.NoError(t, err, "get browser WebSocket URL after CDP fallback") + require.NotEqual(t, browserWebSocketAfter, browserWebSocketAfterFallback, "CDP activation failure did not fall back to restart") + // The legacy endpoint retains its unconditional restart behavior. { client, err := c.APIClient() @@ -323,7 +352,7 @@ func TestExtensionUploadAndActivation(t *testing.T) { browserWebSocketAfterRestart, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) require.NoError(t, err, "get browser WebSocket URL after legacy extension upload") - require.NotEqual(t, browserWebSocketAfter, browserWebSocketAfterRestart, "legacy endpoint did not restart Chromium") + require.NotEqual(t, browserWebSocketAfterFallback, browserWebSocketAfterRestart, "legacy endpoint did not restart Chromium") } func TestScreenshotHeadless(t *testing.T) { diff --git a/server/e2e/e2e_combined_flow_test.go b/server/e2e/e2e_combined_flow_test.go index 3e0ef394..896db467 100644 --- a/server/e2e/e2e_combined_flow_test.go +++ b/server/e2e/e2e_combined_flow_test.go @@ -178,9 +178,9 @@ func uploadExtension(t *testing.T, ctx context.Context, client *instanceoapi.Cli require.NoError(t, err) start := time.Now() - rsp, err := client.UploadExtensionsAndRestartWithBodyWithResponse(ctx, w.FormDataContentType(), &body) + rsp, err := client.UploadExtensionsWithBodyWithResponse(ctx, w.FormDataContentType(), &body) elapsed := time.Since(start) - require.NoError(t, err, "uploadExtensionsAndRestart request error") + require.NoError(t, err, "uploadExtensions request error") require.Equal(t, http.StatusCreated, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) t.Logf("[extension] uploaded in %s", elapsed) } diff --git a/server/e2e/e2e_enterprise_extension_test.go b/server/e2e/e2e_enterprise_extension_test.go index cea92493..62bb4dd6 100644 --- a/server/e2e/e2e_enterprise_extension_test.go +++ b/server/e2e/e2e_enterprise_extension_test.go @@ -16,6 +16,7 @@ import ( "testing" "time" + "github.com/kernel/kernel-images/server/lib/cdpclient" instanceoapi "github.com/kernel/kernel-images/server/lib/oapi" "github.com/stretchr/testify/require" ) @@ -82,9 +83,16 @@ func runEnterpriseExtensionTest(t *testing.T, image string) { downloadLogBaseline := extensionDownloadLogSnapshot(t, ctx, c) - // Upload the enterprise test extension (with update.xml and .crx) + // Upload the enterprise test extension through the new endpoint and verify its policy + // requirement selects the restart path. + versionURL := "http" + strings.TrimPrefix(c.CDPURL(), "ws") + "json/version" + browserWebSocketBefore, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) + require.NoError(t, err, "get browser WebSocket URL before enterprise extension upload") t.Log("[test] uploading enterprise test extension (with update.xml and .crx)") uploadEnterpriseTestExtension(t, ctx, c) + browserWebSocketAfter, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) + require.NoError(t, err, "get browser WebSocket URL after enterprise extension upload") + require.NotEqual(t, browserWebSocketBefore, browserWebSocketAfter, "enterprise extension did not restart Chromium") // Check what files were extracted on the server t.Log("[test] checking extracted extension files on server") @@ -203,9 +211,9 @@ func uploadEnterpriseTestExtension(t *testing.T, ctx context.Context, c *TestCon require.NoError(t, err) start := time.Now() - rsp, err := client.UploadExtensionsAndRestartWithBodyWithResponse(ctx, w.FormDataContentType(), &body) + rsp, err := client.UploadExtensionsWithBodyWithResponse(ctx, w.FormDataContentType(), &body) elapsed := time.Since(start) - require.NoError(t, err, "uploadExtensionsAndRestart request error") + require.NoError(t, err, "uploadExtensions request error") // The key assertion: this should return 201 require.Equal(t, http.StatusCreated, rsp.StatusCode(), diff --git a/server/lib/oapi/oapi.go b/server/lib/oapi/oapi.go index 2876dc03..ac634311 100644 --- a/server/lib/oapi/oapi.go +++ b/server/lib/oapi/oapi.go @@ -140,1563 +140,4516 @@ func (e BrowserCaptchaSolveResultEventDataStatus) Valid() bool { } } -// Defines values for BrowserCdpConnectEventCategory. +// Defines values for BrowserCdpAutofillMode. const ( - BrowserCdpConnectEventCategoryConnection BrowserCdpConnectEventCategory = "connection" + Address BrowserCdpAutofillMode = "address" + Card BrowserCdpAutofillMode = "card" ) -// Valid indicates whether the value is a known member of the BrowserCdpConnectEventCategory enum. -func (e BrowserCdpConnectEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpAutofillMode enum. +func (e BrowserCdpAutofillMode) Valid() bool { switch e { - case BrowserCdpConnectEventCategoryConnection: + case Address: + return true + case Card: return true default: return false } } -// Defines values for BrowserCdpConnectEventType. +// Defines values for BrowserCdpAutofillTriggerCommandDataMethod. const ( - CdpConnect BrowserCdpConnectEventType = "cdp_connect" + BrowserCdpAutofillTriggerCommandDataMethodAutofillTrigger BrowserCdpAutofillTriggerCommandDataMethod = "Autofill.trigger" ) -// Valid indicates whether the value is a known member of the BrowserCdpConnectEventType enum. -func (e BrowserCdpConnectEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpAutofillTriggerCommandDataMethod enum. +func (e BrowserCdpAutofillTriggerCommandDataMethod) Valid() bool { switch e { - case CdpConnect: + case BrowserCdpAutofillTriggerCommandDataMethodAutofillTrigger: return true default: return false } } -// Defines values for BrowserCdpDisconnectEventCategory. +// Defines values for BrowserCdpBrowserCancelDownloadCommandDataMethod. const ( - BrowserCdpDisconnectEventCategoryConnection BrowserCdpDisconnectEventCategory = "connection" + BrowserCancelDownload BrowserCdpBrowserCancelDownloadCommandDataMethod = "Browser.cancelDownload" ) -// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventCategory enum. -func (e BrowserCdpDisconnectEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpBrowserCancelDownloadCommandDataMethod enum. +func (e BrowserCdpBrowserCancelDownloadCommandDataMethod) Valid() bool { switch e { - case BrowserCdpDisconnectEventCategoryConnection: + case BrowserCancelDownload: return true default: return false } } -// Defines values for BrowserCdpDisconnectEventType. +// Defines values for BrowserCdpBrowserCloseCommandDataMethod. const ( - CdpDisconnect BrowserCdpDisconnectEventType = "cdp_disconnect" + BrowserClose BrowserCdpBrowserCloseCommandDataMethod = "Browser.close" ) -// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventType enum. -func (e BrowserCdpDisconnectEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpBrowserCloseCommandDataMethod enum. +func (e BrowserCdpBrowserCloseCommandDataMethod) Valid() bool { switch e { - case CdpDisconnect: + case BrowserClose: return true default: return false } } -// Defines values for BrowserCdpDisconnectEventDataReason. +// Defines values for BrowserCdpBrowserSetContentsSizeCommandDataMethod. const ( - ClientClose BrowserCdpDisconnectEventDataReason = "client_close" - ContextCancelled BrowserCdpDisconnectEventDataReason = "context_cancelled" - UpstreamChanged BrowserCdpDisconnectEventDataReason = "upstream_changed" - UpstreamError BrowserCdpDisconnectEventDataReason = "upstream_error" + BrowserSetContentsSize BrowserCdpBrowserSetContentsSizeCommandDataMethod = "Browser.setContentsSize" ) -// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventDataReason enum. -func (e BrowserCdpDisconnectEventDataReason) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpBrowserSetContentsSizeCommandDataMethod enum. +func (e BrowserCdpBrowserSetContentsSizeCommandDataMethod) Valid() bool { switch e { - case ClientClose: - return true - case ContextCancelled: - return true - case UpstreamChanged: - return true - case UpstreamError: + case BrowserSetContentsSize: return true default: return false } } -// Defines values for BrowserConsoleErrorEventCategory. +// Defines values for BrowserCdpBrowserSetWindowBoundsCommandDataMethod. const ( - BrowserConsoleErrorEventCategoryConsole BrowserConsoleErrorEventCategory = "console" + BrowserSetWindowBounds BrowserCdpBrowserSetWindowBoundsCommandDataMethod = "Browser.setWindowBounds" ) -// Valid indicates whether the value is a known member of the BrowserConsoleErrorEventCategory enum. -func (e BrowserConsoleErrorEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpBrowserSetWindowBoundsCommandDataMethod enum. +func (e BrowserCdpBrowserSetWindowBoundsCommandDataMethod) Valid() bool { switch e { - case BrowserConsoleErrorEventCategoryConsole: + case BrowserSetWindowBounds: return true default: return false } } -// Defines values for BrowserConsoleErrorEventType. +// Defines values for BrowserCdpCommandEventCategory. const ( - ConsoleError BrowserConsoleErrorEventType = "console_error" + BrowserCdpCommandEventCategoryControl BrowserCdpCommandEventCategory = "control" ) -// Valid indicates whether the value is a known member of the BrowserConsoleErrorEventType enum. -func (e BrowserConsoleErrorEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpCommandEventCategory enum. +func (e BrowserCdpCommandEventCategory) Valid() bool { switch e { - case ConsoleError: + case BrowserCdpCommandEventCategoryControl: return true default: return false } } -// Defines values for BrowserConsoleLogEventCategory. +// Defines values for BrowserCdpCommandEventType. const ( - BrowserConsoleLogEventCategoryConsole BrowserConsoleLogEventCategory = "console" + CdpCommand BrowserCdpCommandEventType = "cdp_command" ) -// Valid indicates whether the value is a known member of the BrowserConsoleLogEventCategory enum. -func (e BrowserConsoleLogEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpCommandEventType enum. +func (e BrowserCdpCommandEventType) Valid() bool { switch e { - case BrowserConsoleLogEventCategoryConsole: + case CdpCommand: return true default: return false } } -// Defines values for BrowserConsoleLogEventType. +// Defines values for BrowserCdpCommandMethod. const ( - ConsoleLog BrowserConsoleLogEventType = "console_log" + BrowserCdpCommandMethodAutofillTrigger BrowserCdpCommandMethod = "Autofill.trigger" + BrowserCdpCommandMethodBrowserCancelDownload BrowserCdpCommandMethod = "Browser.cancelDownload" + BrowserCdpCommandMethodBrowserClose BrowserCdpCommandMethod = "Browser.close" + BrowserCdpCommandMethodBrowserSetContentsSize BrowserCdpCommandMethod = "Browser.setContentsSize" + BrowserCdpCommandMethodBrowserSetWindowBounds BrowserCdpCommandMethod = "Browser.setWindowBounds" + BrowserCdpCommandMethodDOMFocus BrowserCdpCommandMethod = "DOM.focus" + BrowserCdpCommandMethodDOMScrollIntoViewIfNeeded BrowserCdpCommandMethod = "DOM.scrollIntoViewIfNeeded" + BrowserCdpCommandMethodDOMSetFileInputFiles BrowserCdpCommandMethod = "DOM.setFileInputFiles" + BrowserCdpCommandMethodInputCancelDragging BrowserCdpCommandMethod = "Input.cancelDragging" + BrowserCdpCommandMethodInputDispatchDragEvent BrowserCdpCommandMethod = "Input.dispatchDragEvent" + BrowserCdpCommandMethodInputDispatchKeyEvent BrowserCdpCommandMethod = "Input.dispatchKeyEvent" + BrowserCdpCommandMethodInputDispatchMouseEvent BrowserCdpCommandMethod = "Input.dispatchMouseEvent" + BrowserCdpCommandMethodInputDispatchTouchEvent BrowserCdpCommandMethod = "Input.dispatchTouchEvent" + BrowserCdpCommandMethodInputEmulateTouchFromMouseEvent BrowserCdpCommandMethod = "Input.emulateTouchFromMouseEvent" + BrowserCdpCommandMethodInputImeSetComposition BrowserCdpCommandMethod = "Input.imeSetComposition" + BrowserCdpCommandMethodInputInsertText BrowserCdpCommandMethod = "Input.insertText" + BrowserCdpCommandMethodInputSynthesizePinchGesture BrowserCdpCommandMethod = "Input.synthesizePinchGesture" + BrowserCdpCommandMethodInputSynthesizeScrollGesture BrowserCdpCommandMethod = "Input.synthesizeScrollGesture" + BrowserCdpCommandMethodInputSynthesizeTapGesture BrowserCdpCommandMethod = "Input.synthesizeTapGesture" + BrowserCdpCommandMethodPageBringToFront BrowserCdpCommandMethod = "Page.bringToFront" + BrowserCdpCommandMethodPageCaptureScreenshot BrowserCdpCommandMethod = "Page.captureScreenshot" + BrowserCdpCommandMethodPageCaptureSnapshot BrowserCdpCommandMethod = "Page.captureSnapshot" + BrowserCdpCommandMethodPageClose BrowserCdpCommandMethod = "Page.close" + BrowserCdpCommandMethodPageHandleJavaScriptDialog BrowserCdpCommandMethod = "Page.handleJavaScriptDialog" + BrowserCdpCommandMethodPageNavigate BrowserCdpCommandMethod = "Page.navigate" + BrowserCdpCommandMethodPageNavigateToHistoryEntry BrowserCdpCommandMethod = "Page.navigateToHistoryEntry" + BrowserCdpCommandMethodPagePrintToPDF BrowserCdpCommandMethod = "Page.printToPDF" + BrowserCdpCommandMethodPageReload BrowserCdpCommandMethod = "Page.reload" + BrowserCdpCommandMethodPageSetWebLifecycleState BrowserCdpCommandMethod = "Page.setWebLifecycleState" + BrowserCdpCommandMethodPageStartScreencast BrowserCdpCommandMethod = "Page.startScreencast" + BrowserCdpCommandMethodPageStopLoading BrowserCdpCommandMethod = "Page.stopLoading" + BrowserCdpCommandMethodPageStopScreencast BrowserCdpCommandMethod = "Page.stopScreencast" + BrowserCdpCommandMethodTargetActivateTarget BrowserCdpCommandMethod = "Target.activateTarget" + BrowserCdpCommandMethodTargetCloseTarget BrowserCdpCommandMethod = "Target.closeTarget" + BrowserCdpCommandMethodTargetCreateBrowserContext BrowserCdpCommandMethod = "Target.createBrowserContext" + BrowserCdpCommandMethodTargetCreateTarget BrowserCdpCommandMethod = "Target.createTarget" + BrowserCdpCommandMethodTargetDisposeBrowserContext BrowserCdpCommandMethod = "Target.disposeBrowserContext" + BrowserCdpCommandMethodTargetOpenDevTools BrowserCdpCommandMethod = "Target.openDevTools" ) -// Valid indicates whether the value is a known member of the BrowserConsoleLogEventType enum. -func (e BrowserConsoleLogEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpCommandMethod enum. +func (e BrowserCdpCommandMethod) Valid() bool { switch e { - case ConsoleLog: + case BrowserCdpCommandMethodAutofillTrigger: + return true + case BrowserCdpCommandMethodBrowserCancelDownload: + return true + case BrowserCdpCommandMethodBrowserClose: + return true + case BrowserCdpCommandMethodBrowserSetContentsSize: + return true + case BrowserCdpCommandMethodBrowserSetWindowBounds: + return true + case BrowserCdpCommandMethodDOMFocus: + return true + case BrowserCdpCommandMethodDOMScrollIntoViewIfNeeded: + return true + case BrowserCdpCommandMethodDOMSetFileInputFiles: + return true + case BrowserCdpCommandMethodInputCancelDragging: + return true + case BrowserCdpCommandMethodInputDispatchDragEvent: + return true + case BrowserCdpCommandMethodInputDispatchKeyEvent: + return true + case BrowserCdpCommandMethodInputDispatchMouseEvent: + return true + case BrowserCdpCommandMethodInputDispatchTouchEvent: + return true + case BrowserCdpCommandMethodInputEmulateTouchFromMouseEvent: + return true + case BrowserCdpCommandMethodInputImeSetComposition: + return true + case BrowserCdpCommandMethodInputInsertText: + return true + case BrowserCdpCommandMethodInputSynthesizePinchGesture: + return true + case BrowserCdpCommandMethodInputSynthesizeScrollGesture: + return true + case BrowserCdpCommandMethodInputSynthesizeTapGesture: + return true + case BrowserCdpCommandMethodPageBringToFront: + return true + case BrowserCdpCommandMethodPageCaptureScreenshot: + return true + case BrowserCdpCommandMethodPageCaptureSnapshot: + return true + case BrowserCdpCommandMethodPageClose: + return true + case BrowserCdpCommandMethodPageHandleJavaScriptDialog: + return true + case BrowserCdpCommandMethodPageNavigate: + return true + case BrowserCdpCommandMethodPageNavigateToHistoryEntry: + return true + case BrowserCdpCommandMethodPagePrintToPDF: + return true + case BrowserCdpCommandMethodPageReload: + return true + case BrowserCdpCommandMethodPageSetWebLifecycleState: + return true + case BrowserCdpCommandMethodPageStartScreencast: + return true + case BrowserCdpCommandMethodPageStopLoading: + return true + case BrowserCdpCommandMethodPageStopScreencast: + return true + case BrowserCdpCommandMethodTargetActivateTarget: + return true + case BrowserCdpCommandMethodTargetCloseTarget: + return true + case BrowserCdpCommandMethodTargetCreateBrowserContext: + return true + case BrowserCdpCommandMethodTargetCreateTarget: + return true + case BrowserCdpCommandMethodTargetDisposeBrowserContext: + return true + case BrowserCdpCommandMethodTargetOpenDevTools: return true default: return false } } -// Defines values for BrowserEventSourceKind. +// Defines values for BrowserCdpConnectEventCategory. const ( - Cdp BrowserEventSourceKind = "cdp" - Extension BrowserEventSourceKind = "extension" - KernelApi BrowserEventSourceKind = "kernel_api" - LocalProcess BrowserEventSourceKind = "local_process" + BrowserCdpConnectEventCategoryConnection BrowserCdpConnectEventCategory = "connection" ) -// Valid indicates whether the value is a known member of the BrowserEventSourceKind enum. -func (e BrowserEventSourceKind) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpConnectEventCategory enum. +func (e BrowserCdpConnectEventCategory) Valid() bool { switch e { - case Cdp: - return true - case Extension: - return true - case KernelApi: - return true - case LocalProcess: + case BrowserCdpConnectEventCategoryConnection: return true default: return false } } -// Defines values for BrowserInteractionClickEventCategory. +// Defines values for BrowserCdpConnectEventType. const ( - BrowserInteractionClickEventCategoryInteraction BrowserInteractionClickEventCategory = "interaction" + CdpConnect BrowserCdpConnectEventType = "cdp_connect" ) -// Valid indicates whether the value is a known member of the BrowserInteractionClickEventCategory enum. -func (e BrowserInteractionClickEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpConnectEventType enum. +func (e BrowserCdpConnectEventType) Valid() bool { switch e { - case BrowserInteractionClickEventCategoryInteraction: + case CdpConnect: return true default: return false } } -// Defines values for BrowserInteractionClickEventType. +// Defines values for BrowserCdpDisconnectEventCategory. const ( - InteractionClick BrowserInteractionClickEventType = "interaction_click" + BrowserCdpDisconnectEventCategoryConnection BrowserCdpDisconnectEventCategory = "connection" ) -// Valid indicates whether the value is a known member of the BrowserInteractionClickEventType enum. -func (e BrowserInteractionClickEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventCategory enum. +func (e BrowserCdpDisconnectEventCategory) Valid() bool { switch e { - case InteractionClick: + case BrowserCdpDisconnectEventCategoryConnection: return true default: return false } } -// Defines values for BrowserInteractionKeyEventCategory. +// Defines values for BrowserCdpDisconnectEventType. const ( - BrowserInteractionKeyEventCategoryInteraction BrowserInteractionKeyEventCategory = "interaction" + CdpDisconnect BrowserCdpDisconnectEventType = "cdp_disconnect" ) -// Valid indicates whether the value is a known member of the BrowserInteractionKeyEventCategory enum. -func (e BrowserInteractionKeyEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventType enum. +func (e BrowserCdpDisconnectEventType) Valid() bool { switch e { - case BrowserInteractionKeyEventCategoryInteraction: + case CdpDisconnect: return true default: return false } } -// Defines values for BrowserInteractionKeyEventType. +// Defines values for BrowserCdpDisconnectEventDataReason. const ( - InteractionKey BrowserInteractionKeyEventType = "interaction_key" + ClientClose BrowserCdpDisconnectEventDataReason = "client_close" + ContextCancelled BrowserCdpDisconnectEventDataReason = "context_cancelled" + UpstreamChanged BrowserCdpDisconnectEventDataReason = "upstream_changed" + UpstreamError BrowserCdpDisconnectEventDataReason = "upstream_error" ) -// Valid indicates whether the value is a known member of the BrowserInteractionKeyEventType enum. -func (e BrowserInteractionKeyEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDisconnectEventDataReason enum. +func (e BrowserCdpDisconnectEventDataReason) Valid() bool { switch e { - case InteractionKey: + case ClientClose: + return true + case ContextCancelled: + return true + case UpstreamChanged: + return true + case UpstreamError: return true default: return false } } -// Defines values for BrowserInteractionScrollSettledEventCategory. +// Defines values for BrowserCdpDomFocusCommandDataMethod. const ( - Interaction BrowserInteractionScrollSettledEventCategory = "interaction" + DOMFocus BrowserCdpDomFocusCommandDataMethod = "DOM.focus" ) -// Valid indicates whether the value is a known member of the BrowserInteractionScrollSettledEventCategory enum. -func (e BrowserInteractionScrollSettledEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDomFocusCommandDataMethod enum. +func (e BrowserCdpDomFocusCommandDataMethod) Valid() bool { switch e { - case Interaction: + case DOMFocus: return true default: return false } } -// Defines values for BrowserInteractionScrollSettledEventType. +// Defines values for BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod. const ( - InteractionScrollSettled BrowserInteractionScrollSettledEventType = "interaction_scroll_settled" + DOMScrollIntoViewIfNeeded BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod = "DOM.scrollIntoViewIfNeeded" ) -// Valid indicates whether the value is a known member of the BrowserInteractionScrollSettledEventType enum. -func (e BrowserInteractionScrollSettledEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod enum. +func (e BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod) Valid() bool { switch e { - case InteractionScrollSettled: + case DOMScrollIntoViewIfNeeded: return true default: return false } } -// Defines values for BrowserLiveViewConnectEventCategory. +// Defines values for BrowserCdpDomSetFileInputFilesCommandDataMethod. const ( - BrowserLiveViewConnectEventCategoryConnection BrowserLiveViewConnectEventCategory = "connection" + DOMSetFileInputFiles BrowserCdpDomSetFileInputFilesCommandDataMethod = "DOM.setFileInputFiles" ) -// Valid indicates whether the value is a known member of the BrowserLiveViewConnectEventCategory enum. -func (e BrowserLiveViewConnectEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDomSetFileInputFilesCommandDataMethod enum. +func (e BrowserCdpDomSetFileInputFilesCommandDataMethod) Valid() bool { switch e { - case BrowserLiveViewConnectEventCategoryConnection: + case DOMSetFileInputFiles: return true default: return false } } -// Defines values for BrowserLiveViewConnectEventType. +// Defines values for BrowserCdpDragEventType. const ( - LiveViewConnect BrowserLiveViewConnectEventType = "live_view_connect" + BrowserCdpDragEventTypeDragCancel BrowserCdpDragEventType = "dragCancel" + BrowserCdpDragEventTypeDragEnter BrowserCdpDragEventType = "dragEnter" + BrowserCdpDragEventTypeDragOver BrowserCdpDragEventType = "dragOver" + BrowserCdpDragEventTypeDrop BrowserCdpDragEventType = "drop" + BrowserCdpDragEventTypeOther BrowserCdpDragEventType = "other" ) -// Valid indicates whether the value is a known member of the BrowserLiveViewConnectEventType enum. -func (e BrowserLiveViewConnectEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDragEventType enum. +func (e BrowserCdpDragEventType) Valid() bool { switch e { - case LiveViewConnect: + case BrowserCdpDragEventTypeDragCancel: + return true + case BrowserCdpDragEventTypeDragEnter: + return true + case BrowserCdpDragEventTypeDragOver: + return true + case BrowserCdpDragEventTypeDrop: + return true + case BrowserCdpDragEventTypeOther: return true default: return false } } -// Defines values for BrowserLiveViewDisconnectEventCategory. +// Defines values for BrowserCdpDragMimeCategory. const ( - BrowserLiveViewDisconnectEventCategoryConnection BrowserLiveViewDisconnectEventCategory = "connection" + BrowserCdpDragMimeCategoryApplication BrowserCdpDragMimeCategory = "application" + BrowserCdpDragMimeCategoryAudio BrowserCdpDragMimeCategory = "audio" + BrowserCdpDragMimeCategoryFont BrowserCdpDragMimeCategory = "font" + BrowserCdpDragMimeCategoryImage BrowserCdpDragMimeCategory = "image" + BrowserCdpDragMimeCategoryMessage BrowserCdpDragMimeCategory = "message" + BrowserCdpDragMimeCategoryModel BrowserCdpDragMimeCategory = "model" + BrowserCdpDragMimeCategoryMultipart BrowserCdpDragMimeCategory = "multipart" + BrowserCdpDragMimeCategoryOther BrowserCdpDragMimeCategory = "other" + BrowserCdpDragMimeCategoryText BrowserCdpDragMimeCategory = "text" + BrowserCdpDragMimeCategoryVideo BrowserCdpDragMimeCategory = "video" ) -// Valid indicates whether the value is a known member of the BrowserLiveViewDisconnectEventCategory enum. -func (e BrowserLiveViewDisconnectEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpDragMimeCategory enum. +func (e BrowserCdpDragMimeCategory) Valid() bool { switch e { - case BrowserLiveViewDisconnectEventCategoryConnection: + case BrowserCdpDragMimeCategoryApplication: + return true + case BrowserCdpDragMimeCategoryAudio: + return true + case BrowserCdpDragMimeCategoryFont: + return true + case BrowserCdpDragMimeCategoryImage: + return true + case BrowserCdpDragMimeCategoryMessage: + return true + case BrowserCdpDragMimeCategoryModel: + return true + case BrowserCdpDragMimeCategoryMultipart: + return true + case BrowserCdpDragMimeCategoryOther: + return true + case BrowserCdpDragMimeCategoryText: + return true + case BrowserCdpDragMimeCategoryVideo: return true default: return false } } -// Defines values for BrowserLiveViewDisconnectEventType. +// Defines values for BrowserCdpGestureSourceType. const ( - LiveViewDisconnect BrowserLiveViewDisconnectEventType = "live_view_disconnect" + BrowserCdpGestureSourceTypeDefault BrowserCdpGestureSourceType = "default" + BrowserCdpGestureSourceTypeMouse BrowserCdpGestureSourceType = "mouse" + BrowserCdpGestureSourceTypeOther BrowserCdpGestureSourceType = "other" + BrowserCdpGestureSourceTypeTouch BrowserCdpGestureSourceType = "touch" ) -// Valid indicates whether the value is a known member of the BrowserLiveViewDisconnectEventType enum. -func (e BrowserLiveViewDisconnectEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpGestureSourceType enum. +func (e BrowserCdpGestureSourceType) Valid() bool { switch e { - case LiveViewDisconnect: + case BrowserCdpGestureSourceTypeDefault: + return true + case BrowserCdpGestureSourceTypeMouse: + return true + case BrowserCdpGestureSourceTypeOther: + return true + case BrowserCdpGestureSourceTypeTouch: return true default: return false } } -// Defines values for BrowserMonitorDisconnectedEventCategory. +// Defines values for BrowserCdpInputCancelDraggingCommandDataMethod. const ( - BrowserMonitorDisconnectedEventCategoryMonitor BrowserMonitorDisconnectedEventCategory = "monitor" + InputCancelDragging BrowserCdpInputCancelDraggingCommandDataMethod = "Input.cancelDragging" ) -// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventCategory enum. -func (e BrowserMonitorDisconnectedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputCancelDraggingCommandDataMethod enum. +func (e BrowserCdpInputCancelDraggingCommandDataMethod) Valid() bool { switch e { - case BrowserMonitorDisconnectedEventCategoryMonitor: + case InputCancelDragging: return true default: return false } } -// Defines values for BrowserMonitorDisconnectedEventType. +// Defines values for BrowserCdpInputDispatchDragEventCommandDataMethod. const ( - MonitorDisconnected BrowserMonitorDisconnectedEventType = "monitor_disconnected" + InputDispatchDragEvent BrowserCdpInputDispatchDragEventCommandDataMethod = "Input.dispatchDragEvent" ) -// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventType enum. -func (e BrowserMonitorDisconnectedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputDispatchDragEventCommandDataMethod enum. +func (e BrowserCdpInputDispatchDragEventCommandDataMethod) Valid() bool { switch e { - case MonitorDisconnected: + case InputDispatchDragEvent: return true default: return false } } -// Defines values for BrowserMonitorDisconnectedEventDataReason. +// Defines values for BrowserCdpInputDispatchKeyEventCommandDataMethod. const ( - ChromeRestarted BrowserMonitorDisconnectedEventDataReason = "chrome_restarted" + InputDispatchKeyEvent BrowserCdpInputDispatchKeyEventCommandDataMethod = "Input.dispatchKeyEvent" ) -// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventDataReason enum. -func (e BrowserMonitorDisconnectedEventDataReason) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputDispatchKeyEventCommandDataMethod enum. +func (e BrowserCdpInputDispatchKeyEventCommandDataMethod) Valid() bool { switch e { - case ChromeRestarted: + case InputDispatchKeyEvent: return true default: return false } } -// Defines values for BrowserMonitorInitFailedEventCategory. +// Defines values for BrowserCdpInputDispatchMouseEventCommandDataMethod. const ( - BrowserMonitorInitFailedEventCategoryMonitor BrowserMonitorInitFailedEventCategory = "monitor" + InputDispatchMouseEvent BrowserCdpInputDispatchMouseEventCommandDataMethod = "Input.dispatchMouseEvent" ) -// Valid indicates whether the value is a known member of the BrowserMonitorInitFailedEventCategory enum. -func (e BrowserMonitorInitFailedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputDispatchMouseEventCommandDataMethod enum. +func (e BrowserCdpInputDispatchMouseEventCommandDataMethod) Valid() bool { switch e { - case BrowserMonitorInitFailedEventCategoryMonitor: + case InputDispatchMouseEvent: return true default: return false } } -// Defines values for BrowserMonitorInitFailedEventType. +// Defines values for BrowserCdpInputDispatchTouchEventCommandDataMethod. const ( - MonitorInitFailed BrowserMonitorInitFailedEventType = "monitor_init_failed" + InputDispatchTouchEvent BrowserCdpInputDispatchTouchEventCommandDataMethod = "Input.dispatchTouchEvent" ) -// Valid indicates whether the value is a known member of the BrowserMonitorInitFailedEventType enum. -func (e BrowserMonitorInitFailedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputDispatchTouchEventCommandDataMethod enum. +func (e BrowserCdpInputDispatchTouchEventCommandDataMethod) Valid() bool { switch e { - case MonitorInitFailed: + case InputDispatchTouchEvent: return true default: return false } } -// Defines values for BrowserMonitorReconnectFailedEventCategory. +// Defines values for BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod. const ( - BrowserMonitorReconnectFailedEventCategoryMonitor BrowserMonitorReconnectFailedEventCategory = "monitor" + InputEmulateTouchFromMouseEvent BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod = "Input.emulateTouchFromMouseEvent" ) -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventCategory enum. -func (e BrowserMonitorReconnectFailedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod enum. +func (e BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod) Valid() bool { switch e { - case BrowserMonitorReconnectFailedEventCategoryMonitor: + case InputEmulateTouchFromMouseEvent: return true default: return false } } -// Defines values for BrowserMonitorReconnectFailedEventType. +// Defines values for BrowserCdpInputImeSetCompositionCommandDataMethod. const ( - MonitorReconnectFailed BrowserMonitorReconnectFailedEventType = "monitor_reconnect_failed" + InputImeSetComposition BrowserCdpInputImeSetCompositionCommandDataMethod = "Input.imeSetComposition" ) -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventType enum. -func (e BrowserMonitorReconnectFailedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputImeSetCompositionCommandDataMethod enum. +func (e BrowserCdpInputImeSetCompositionCommandDataMethod) Valid() bool { switch e { - case MonitorReconnectFailed: + case InputImeSetComposition: return true default: return false } } -// Defines values for BrowserMonitorReconnectFailedEventDataReason. +// Defines values for BrowserCdpInputInsertTextCommandDataMethod. const ( - ReconnectExhausted BrowserMonitorReconnectFailedEventDataReason = "reconnect_exhausted" + InputInsertText BrowserCdpInputInsertTextCommandDataMethod = "Input.insertText" ) -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventDataReason enum. -func (e BrowserMonitorReconnectFailedEventDataReason) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputInsertTextCommandDataMethod enum. +func (e BrowserCdpInputInsertTextCommandDataMethod) Valid() bool { switch e { - case ReconnectExhausted: + case InputInsertText: return true default: return false } } -// Defines values for BrowserMonitorReconnectedEventCategory. +// Defines values for BrowserCdpInputSynthesizePinchGestureCommandDataMethod. const ( - BrowserMonitorReconnectedEventCategoryMonitor BrowserMonitorReconnectedEventCategory = "monitor" + InputSynthesizePinchGesture BrowserCdpInputSynthesizePinchGestureCommandDataMethod = "Input.synthesizePinchGesture" ) -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectedEventCategory enum. -func (e BrowserMonitorReconnectedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputSynthesizePinchGestureCommandDataMethod enum. +func (e BrowserCdpInputSynthesizePinchGestureCommandDataMethod) Valid() bool { switch e { - case BrowserMonitorReconnectedEventCategoryMonitor: + case InputSynthesizePinchGesture: return true default: return false } } -// Defines values for BrowserMonitorReconnectedEventType. +// Defines values for BrowserCdpInputSynthesizeScrollGestureCommandDataMethod. const ( - MonitorReconnected BrowserMonitorReconnectedEventType = "monitor_reconnected" + InputSynthesizeScrollGesture BrowserCdpInputSynthesizeScrollGestureCommandDataMethod = "Input.synthesizeScrollGesture" ) -// Valid indicates whether the value is a known member of the BrowserMonitorReconnectedEventType enum. -func (e BrowserMonitorReconnectedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputSynthesizeScrollGestureCommandDataMethod enum. +func (e BrowserCdpInputSynthesizeScrollGestureCommandDataMethod) Valid() bool { switch e { - case MonitorReconnected: + case InputSynthesizeScrollGesture: return true default: return false } } -// Defines values for BrowserMonitorScreenshotEventCategory. +// Defines values for BrowserCdpInputSynthesizeTapGestureCommandDataMethod. const ( - Screenshot BrowserMonitorScreenshotEventCategory = "screenshot" + InputSynthesizeTapGesture BrowserCdpInputSynthesizeTapGestureCommandDataMethod = "Input.synthesizeTapGesture" ) -// Valid indicates whether the value is a known member of the BrowserMonitorScreenshotEventCategory enum. -func (e BrowserMonitorScreenshotEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpInputSynthesizeTapGestureCommandDataMethod enum. +func (e BrowserCdpInputSynthesizeTapGestureCommandDataMethod) Valid() bool { switch e { - case Screenshot: + case InputSynthesizeTapGesture: return true default: return false } } -// Defines values for BrowserMonitorScreenshotEventType. +// Defines values for BrowserCdpKeyEventType. const ( - MonitorScreenshot BrowserMonitorScreenshotEventType = "monitor_screenshot" + BrowserCdpKeyEventTypeChar BrowserCdpKeyEventType = "char" + BrowserCdpKeyEventTypeKeyDown BrowserCdpKeyEventType = "keyDown" + BrowserCdpKeyEventTypeKeyUp BrowserCdpKeyEventType = "keyUp" + BrowserCdpKeyEventTypeOther BrowserCdpKeyEventType = "other" + BrowserCdpKeyEventTypeRawKeyDown BrowserCdpKeyEventType = "rawKeyDown" ) -// Valid indicates whether the value is a known member of the BrowserMonitorScreenshotEventType enum. -func (e BrowserMonitorScreenshotEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpKeyEventType enum. +func (e BrowserCdpKeyEventType) Valid() bool { switch e { - case MonitorScreenshot: + case BrowserCdpKeyEventTypeChar: + return true + case BrowserCdpKeyEventTypeKeyDown: + return true + case BrowserCdpKeyEventTypeKeyUp: + return true + case BrowserCdpKeyEventTypeOther: + return true + case BrowserCdpKeyEventTypeRawKeyDown: return true default: return false } } -// Defines values for BrowserNetworkIdleEventCategory. +// Defines values for BrowserCdpMouseButton. const ( - BrowserNetworkIdleEventCategoryNetwork BrowserNetworkIdleEventCategory = "network" + BrowserCdpMouseButtonBack BrowserCdpMouseButton = "back" + BrowserCdpMouseButtonForward BrowserCdpMouseButton = "forward" + BrowserCdpMouseButtonLeft BrowserCdpMouseButton = "left" + BrowserCdpMouseButtonMiddle BrowserCdpMouseButton = "middle" + BrowserCdpMouseButtonNone BrowserCdpMouseButton = "none" + BrowserCdpMouseButtonOther BrowserCdpMouseButton = "other" + BrowserCdpMouseButtonRight BrowserCdpMouseButton = "right" ) -// Valid indicates whether the value is a known member of the BrowserNetworkIdleEventCategory enum. -func (e BrowserNetworkIdleEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpMouseButton enum. +func (e BrowserCdpMouseButton) Valid() bool { switch e { - case BrowserNetworkIdleEventCategoryNetwork: + case BrowserCdpMouseButtonBack: + return true + case BrowserCdpMouseButtonForward: + return true + case BrowserCdpMouseButtonLeft: + return true + case BrowserCdpMouseButtonMiddle: + return true + case BrowserCdpMouseButtonNone: + return true + case BrowserCdpMouseButtonOther: + return true + case BrowserCdpMouseButtonRight: return true default: return false } } -// Defines values for BrowserNetworkIdleEventType. +// Defines values for BrowserCdpMouseEventType. const ( - NetworkIdle BrowserNetworkIdleEventType = "network_idle" + BrowserCdpMouseEventTypeMouseMoved BrowserCdpMouseEventType = "mouseMoved" + BrowserCdpMouseEventTypeMousePressed BrowserCdpMouseEventType = "mousePressed" + BrowserCdpMouseEventTypeMouseReleased BrowserCdpMouseEventType = "mouseReleased" + BrowserCdpMouseEventTypeMouseWheel BrowserCdpMouseEventType = "mouseWheel" + BrowserCdpMouseEventTypeOther BrowserCdpMouseEventType = "other" ) -// Valid indicates whether the value is a known member of the BrowserNetworkIdleEventType enum. -func (e BrowserNetworkIdleEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpMouseEventType enum. +func (e BrowserCdpMouseEventType) Valid() bool { switch e { - case NetworkIdle: + case BrowserCdpMouseEventTypeMouseMoved: + return true + case BrowserCdpMouseEventTypeMousePressed: + return true + case BrowserCdpMouseEventTypeMouseReleased: + return true + case BrowserCdpMouseEventTypeMouseWheel: + return true + case BrowserCdpMouseEventTypeOther: return true default: return false } } -// Defines values for BrowserNetworkLoadingFailedEventCategory. +// Defines values for BrowserCdpPageBringToFrontCommandDataMethod. const ( - BrowserNetworkLoadingFailedEventCategoryNetwork BrowserNetworkLoadingFailedEventCategory = "network" + PageBringToFront BrowserCdpPageBringToFrontCommandDataMethod = "Page.bringToFront" ) -// Valid indicates whether the value is a known member of the BrowserNetworkLoadingFailedEventCategory enum. -func (e BrowserNetworkLoadingFailedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageBringToFrontCommandDataMethod enum. +func (e BrowserCdpPageBringToFrontCommandDataMethod) Valid() bool { switch e { - case BrowserNetworkLoadingFailedEventCategoryNetwork: + case PageBringToFront: return true default: return false } } -// Defines values for BrowserNetworkLoadingFailedEventType. +// Defines values for BrowserCdpPageCaptureScreenshotCommandDataMethod. const ( - NetworkLoadingFailed BrowserNetworkLoadingFailedEventType = "network_loading_failed" + PageCaptureScreenshot BrowserCdpPageCaptureScreenshotCommandDataMethod = "Page.captureScreenshot" ) -// Valid indicates whether the value is a known member of the BrowserNetworkLoadingFailedEventType enum. -func (e BrowserNetworkLoadingFailedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageCaptureScreenshotCommandDataMethod enum. +func (e BrowserCdpPageCaptureScreenshotCommandDataMethod) Valid() bool { switch e { - case NetworkLoadingFailed: + case PageCaptureScreenshot: return true default: return false } } -// Defines values for BrowserNetworkRequestEventCategory. +// Defines values for BrowserCdpPageCaptureSnapshotCommandDataMethod. const ( - BrowserNetworkRequestEventCategoryNetwork BrowserNetworkRequestEventCategory = "network" + PageCaptureSnapshot BrowserCdpPageCaptureSnapshotCommandDataMethod = "Page.captureSnapshot" ) -// Valid indicates whether the value is a known member of the BrowserNetworkRequestEventCategory enum. -func (e BrowserNetworkRequestEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageCaptureSnapshotCommandDataMethod enum. +func (e BrowserCdpPageCaptureSnapshotCommandDataMethod) Valid() bool { switch e { - case BrowserNetworkRequestEventCategoryNetwork: + case PageCaptureSnapshot: return true default: return false } } -// Defines values for BrowserNetworkRequestEventType. +// Defines values for BrowserCdpPageCloseCommandDataMethod. const ( - NetworkRequest BrowserNetworkRequestEventType = "network_request" + PageClose BrowserCdpPageCloseCommandDataMethod = "Page.close" ) -// Valid indicates whether the value is a known member of the BrowserNetworkRequestEventType enum. -func (e BrowserNetworkRequestEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageCloseCommandDataMethod enum. +func (e BrowserCdpPageCloseCommandDataMethod) Valid() bool { switch e { - case NetworkRequest: + case PageClose: return true default: return false } } -// Defines values for BrowserNetworkResponseEventCategory. +// Defines values for BrowserCdpPageHandleJavaScriptDialogCommandDataMethod. const ( - BrowserNetworkResponseEventCategoryNetwork BrowserNetworkResponseEventCategory = "network" + PageHandleJavaScriptDialog BrowserCdpPageHandleJavaScriptDialogCommandDataMethod = "Page.handleJavaScriptDialog" ) -// Valid indicates whether the value is a known member of the BrowserNetworkResponseEventCategory enum. -func (e BrowserNetworkResponseEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageHandleJavaScriptDialogCommandDataMethod enum. +func (e BrowserCdpPageHandleJavaScriptDialogCommandDataMethod) Valid() bool { switch e { - case BrowserNetworkResponseEventCategoryNetwork: + case PageHandleJavaScriptDialog: return true default: return false } } -// Defines values for BrowserNetworkResponseEventType. +// Defines values for BrowserCdpPageNavigateCommandDataMethod. const ( - NetworkResponse BrowserNetworkResponseEventType = "network_response" + PageNavigate BrowserCdpPageNavigateCommandDataMethod = "Page.navigate" ) -// Valid indicates whether the value is a known member of the BrowserNetworkResponseEventType enum. -func (e BrowserNetworkResponseEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageNavigateCommandDataMethod enum. +func (e BrowserCdpPageNavigateCommandDataMethod) Valid() bool { switch e { - case NetworkResponse: + case PageNavigate: return true default: return false } } -// Defines values for BrowserPageCrashedEventCategory. +// Defines values for BrowserCdpPageNavigateToHistoryEntryCommandDataMethod. const ( - BrowserPageCrashedEventCategoryPage BrowserPageCrashedEventCategory = "page" + PageNavigateToHistoryEntry BrowserCdpPageNavigateToHistoryEntryCommandDataMethod = "Page.navigateToHistoryEntry" ) -// Valid indicates whether the value is a known member of the BrowserPageCrashedEventCategory enum. -func (e BrowserPageCrashedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageNavigateToHistoryEntryCommandDataMethod enum. +func (e BrowserCdpPageNavigateToHistoryEntryCommandDataMethod) Valid() bool { switch e { - case BrowserPageCrashedEventCategoryPage: + case PageNavigateToHistoryEntry: return true default: return false } } -// Defines values for BrowserPageCrashedEventType. +// Defines values for BrowserCdpPagePrintToPdfCommandDataMethod. const ( - PageCrashed BrowserPageCrashedEventType = "page_crashed" + PagePrintToPDF BrowserCdpPagePrintToPdfCommandDataMethod = "Page.printToPDF" ) -// Valid indicates whether the value is a known member of the BrowserPageCrashedEventType enum. -func (e BrowserPageCrashedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPagePrintToPdfCommandDataMethod enum. +func (e BrowserCdpPagePrintToPdfCommandDataMethod) Valid() bool { switch e { - case PageCrashed: + case PagePrintToPDF: return true default: return false } } -// Defines values for BrowserPageDomContentLoadedEventCategory. +// Defines values for BrowserCdpPageReloadCommandDataMethod. const ( - BrowserPageDomContentLoadedEventCategoryPage BrowserPageDomContentLoadedEventCategory = "page" + PageReload BrowserCdpPageReloadCommandDataMethod = "Page.reload" ) -// Valid indicates whether the value is a known member of the BrowserPageDomContentLoadedEventCategory enum. -func (e BrowserPageDomContentLoadedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageReloadCommandDataMethod enum. +func (e BrowserCdpPageReloadCommandDataMethod) Valid() bool { switch e { - case BrowserPageDomContentLoadedEventCategoryPage: + case PageReload: return true default: return false } } -// Defines values for BrowserPageDomContentLoadedEventType. +// Defines values for BrowserCdpPageSetWebLifecycleStateCommandDataMethod. const ( - PageDomContentLoaded BrowserPageDomContentLoadedEventType = "page_dom_content_loaded" + PageSetWebLifecycleState BrowserCdpPageSetWebLifecycleStateCommandDataMethod = "Page.setWebLifecycleState" ) -// Valid indicates whether the value is a known member of the BrowserPageDomContentLoadedEventType enum. -func (e BrowserPageDomContentLoadedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageSetWebLifecycleStateCommandDataMethod enum. +func (e BrowserCdpPageSetWebLifecycleStateCommandDataMethod) Valid() bool { switch e { - case PageDomContentLoaded: + case PageSetWebLifecycleState: return true default: return false } } -// Defines values for BrowserPageLayoutSettledEventCategory. +// Defines values for BrowserCdpPageStartScreencastCommandDataMethod. const ( - BrowserPageLayoutSettledEventCategoryPage BrowserPageLayoutSettledEventCategory = "page" + PageStartScreencast BrowserCdpPageStartScreencastCommandDataMethod = "Page.startScreencast" ) -// Valid indicates whether the value is a known member of the BrowserPageLayoutSettledEventCategory enum. -func (e BrowserPageLayoutSettledEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageStartScreencastCommandDataMethod enum. +func (e BrowserCdpPageStartScreencastCommandDataMethod) Valid() bool { switch e { - case BrowserPageLayoutSettledEventCategoryPage: + case PageStartScreencast: return true default: return false } } -// Defines values for BrowserPageLayoutSettledEventType. +// Defines values for BrowserCdpPageStopLoadingCommandDataMethod. const ( - PageLayoutSettled BrowserPageLayoutSettledEventType = "page_layout_settled" + PageStopLoading BrowserCdpPageStopLoadingCommandDataMethod = "Page.stopLoading" ) -// Valid indicates whether the value is a known member of the BrowserPageLayoutSettledEventType enum. -func (e BrowserPageLayoutSettledEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageStopLoadingCommandDataMethod enum. +func (e BrowserCdpPageStopLoadingCommandDataMethod) Valid() bool { switch e { - case PageLayoutSettled: + case PageStopLoading: return true default: return false } } -// Defines values for BrowserPageLayoutShiftEventCategory. +// Defines values for BrowserCdpPageStopScreencastCommandDataMethod. const ( - BrowserPageLayoutShiftEventCategoryPage BrowserPageLayoutShiftEventCategory = "page" + PageStopScreencast BrowserCdpPageStopScreencastCommandDataMethod = "Page.stopScreencast" ) -// Valid indicates whether the value is a known member of the BrowserPageLayoutShiftEventCategory enum. -func (e BrowserPageLayoutShiftEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPageStopScreencastCommandDataMethod enum. +func (e BrowserCdpPageStopScreencastCommandDataMethod) Valid() bool { switch e { - case BrowserPageLayoutShiftEventCategoryPage: + case PageStopScreencast: return true default: return false } } -// Defines values for BrowserPageLayoutShiftEventType. +// Defines values for BrowserCdpPdfTransferMode. const ( - PageLayoutShift BrowserPageLayoutShiftEventType = "page_layout_shift" + BrowserCdpPdfTransferModeOther BrowserCdpPdfTransferMode = "other" + BrowserCdpPdfTransferModeReturnAsBase64 BrowserCdpPdfTransferMode = "ReturnAsBase64" + BrowserCdpPdfTransferModeReturnAsStream BrowserCdpPdfTransferMode = "ReturnAsStream" ) -// Valid indicates whether the value is a known member of the BrowserPageLayoutShiftEventType enum. -func (e BrowserPageLayoutShiftEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPdfTransferMode enum. +func (e BrowserCdpPdfTransferMode) Valid() bool { switch e { - case PageLayoutShift: + case BrowserCdpPdfTransferModeOther: + return true + case BrowserCdpPdfTransferModeReturnAsBase64: + return true + case BrowserCdpPdfTransferModeReturnAsStream: return true default: return false } } -// Defines values for BrowserPageLcpEventCategory. +// Defines values for BrowserCdpPointerType. const ( - BrowserPageLcpEventCategoryPage BrowserPageLcpEventCategory = "page" + BrowserCdpPointerTypeMouse BrowserCdpPointerType = "mouse" + BrowserCdpPointerTypeOther BrowserCdpPointerType = "other" + BrowserCdpPointerTypePen BrowserCdpPointerType = "pen" ) -// Valid indicates whether the value is a known member of the BrowserPageLcpEventCategory enum. -func (e BrowserPageLcpEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpPointerType enum. +func (e BrowserCdpPointerType) Valid() bool { switch e { - case BrowserPageLcpEventCategoryPage: + case BrowserCdpPointerTypeMouse: + return true + case BrowserCdpPointerTypeOther: + return true + case BrowserCdpPointerTypePen: return true default: return false } } -// Defines values for BrowserPageLcpEventType. +// Defines values for BrowserCdpReferrerPolicy. const ( - PageLcp BrowserPageLcpEventType = "page_lcp" + BrowserCdpReferrerPolicyNoReferrer BrowserCdpReferrerPolicy = "noReferrer" + BrowserCdpReferrerPolicyNoReferrerWhenDowngrade BrowserCdpReferrerPolicy = "noReferrerWhenDowngrade" + BrowserCdpReferrerPolicyOrigin BrowserCdpReferrerPolicy = "origin" + BrowserCdpReferrerPolicyOriginWhenCrossOrigin BrowserCdpReferrerPolicy = "originWhenCrossOrigin" + BrowserCdpReferrerPolicyOther BrowserCdpReferrerPolicy = "other" + BrowserCdpReferrerPolicySameOrigin BrowserCdpReferrerPolicy = "sameOrigin" + BrowserCdpReferrerPolicyStrictOrigin BrowserCdpReferrerPolicy = "strictOrigin" + BrowserCdpReferrerPolicyStrictOriginWhenCrossOrigin BrowserCdpReferrerPolicy = "strictOriginWhenCrossOrigin" + BrowserCdpReferrerPolicyUnsafeUrl BrowserCdpReferrerPolicy = "unsafeUrl" ) -// Valid indicates whether the value is a known member of the BrowserPageLcpEventType enum. -func (e BrowserPageLcpEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpReferrerPolicy enum. +func (e BrowserCdpReferrerPolicy) Valid() bool { switch e { - case PageLcp: + case BrowserCdpReferrerPolicyNoReferrer: + return true + case BrowserCdpReferrerPolicyNoReferrerWhenDowngrade: + return true + case BrowserCdpReferrerPolicyOrigin: + return true + case BrowserCdpReferrerPolicyOriginWhenCrossOrigin: + return true + case BrowserCdpReferrerPolicyOther: + return true + case BrowserCdpReferrerPolicySameOrigin: + return true + case BrowserCdpReferrerPolicyStrictOrigin: + return true + case BrowserCdpReferrerPolicyStrictOriginWhenCrossOrigin: + return true + case BrowserCdpReferrerPolicyUnsafeUrl: return true default: return false } } -// Defines values for BrowserPageLoadEventCategory. +// Defines values for BrowserCdpScreencastFormat. const ( - BrowserPageLoadEventCategoryPage BrowserPageLoadEventCategory = "page" + BrowserCdpScreencastFormatJpeg BrowserCdpScreencastFormat = "jpeg" + BrowserCdpScreencastFormatOther BrowserCdpScreencastFormat = "other" + BrowserCdpScreencastFormatPng BrowserCdpScreencastFormat = "png" ) -// Valid indicates whether the value is a known member of the BrowserPageLoadEventCategory enum. -func (e BrowserPageLoadEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpScreencastFormat enum. +func (e BrowserCdpScreencastFormat) Valid() bool { switch e { - case BrowserPageLoadEventCategoryPage: + case BrowserCdpScreencastFormatJpeg: + return true + case BrowserCdpScreencastFormatOther: + return true + case BrowserCdpScreencastFormatPng: return true default: return false } } -// Defines values for BrowserPageLoadEventType. +// Defines values for BrowserCdpScreenshotFormat. const ( - PageLoad BrowserPageLoadEventType = "page_load" + BrowserCdpScreenshotFormatJpeg BrowserCdpScreenshotFormat = "jpeg" + BrowserCdpScreenshotFormatOther BrowserCdpScreenshotFormat = "other" + BrowserCdpScreenshotFormatPng BrowserCdpScreenshotFormat = "png" + BrowserCdpScreenshotFormatWebp BrowserCdpScreenshotFormat = "webp" ) -// Valid indicates whether the value is a known member of the BrowserPageLoadEventType enum. -func (e BrowserPageLoadEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpScreenshotFormat enum. +func (e BrowserCdpScreenshotFormat) Valid() bool { switch e { - case PageLoad: + case BrowserCdpScreenshotFormatJpeg: + return true + case BrowserCdpScreenshotFormatOther: + return true + case BrowserCdpScreenshotFormatPng: + return true + case BrowserCdpScreenshotFormatWebp: return true default: return false } } -// Defines values for BrowserPageNavigationEventCategory. +// Defines values for BrowserCdpSnapshotFormat. const ( - BrowserPageNavigationEventCategoryPage BrowserPageNavigationEventCategory = "page" + BrowserCdpSnapshotFormatMhtml BrowserCdpSnapshotFormat = "mhtml" + BrowserCdpSnapshotFormatOther BrowserCdpSnapshotFormat = "other" ) -// Valid indicates whether the value is a known member of the BrowserPageNavigationEventCategory enum. -func (e BrowserPageNavigationEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpSnapshotFormat enum. +func (e BrowserCdpSnapshotFormat) Valid() bool { switch e { - case BrowserPageNavigationEventCategoryPage: + case BrowserCdpSnapshotFormatMhtml: + return true + case BrowserCdpSnapshotFormatOther: return true default: return false } } -// Defines values for BrowserPageNavigationEventType. +// Defines values for BrowserCdpTargetActivateTargetCommandDataMethod. const ( - PageNavigation BrowserPageNavigationEventType = "page_navigation" + TargetActivateTarget BrowserCdpTargetActivateTargetCommandDataMethod = "Target.activateTarget" ) -// Valid indicates whether the value is a known member of the BrowserPageNavigationEventType enum. -func (e BrowserPageNavigationEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpTargetActivateTargetCommandDataMethod enum. +func (e BrowserCdpTargetActivateTargetCommandDataMethod) Valid() bool { switch e { - case PageNavigation: + case TargetActivateTarget: return true default: return false } } -// Defines values for BrowserPageNavigationSettledEventCategory. +// Defines values for BrowserCdpTargetCloseTargetCommandDataMethod. const ( - BrowserPageNavigationSettledEventCategoryPage BrowserPageNavigationSettledEventCategory = "page" + TargetCloseTarget BrowserCdpTargetCloseTargetCommandDataMethod = "Target.closeTarget" ) -// Valid indicates whether the value is a known member of the BrowserPageNavigationSettledEventCategory enum. -func (e BrowserPageNavigationSettledEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpTargetCloseTargetCommandDataMethod enum. +func (e BrowserCdpTargetCloseTargetCommandDataMethod) Valid() bool { switch e { - case BrowserPageNavigationSettledEventCategoryPage: + case TargetCloseTarget: return true default: return false } } -// Defines values for BrowserPageNavigationSettledEventType. +// Defines values for BrowserCdpTargetCreateBrowserContextCommandDataMethod. const ( - PageNavigationSettled BrowserPageNavigationSettledEventType = "page_navigation_settled" + TargetCreateBrowserContext BrowserCdpTargetCreateBrowserContextCommandDataMethod = "Target.createBrowserContext" ) -// Valid indicates whether the value is a known member of the BrowserPageNavigationSettledEventType enum. -func (e BrowserPageNavigationSettledEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpTargetCreateBrowserContextCommandDataMethod enum. +func (e BrowserCdpTargetCreateBrowserContextCommandDataMethod) Valid() bool { switch e { - case PageNavigationSettled: + case TargetCreateBrowserContext: return true default: return false } } -// Defines values for BrowserPageTabOpenedEventCategory. +// Defines values for BrowserCdpTargetCreateTargetCommandDataMethod. const ( - Page BrowserPageTabOpenedEventCategory = "page" + TargetCreateTarget BrowserCdpTargetCreateTargetCommandDataMethod = "Target.createTarget" ) -// Valid indicates whether the value is a known member of the BrowserPageTabOpenedEventCategory enum. -func (e BrowserPageTabOpenedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpTargetCreateTargetCommandDataMethod enum. +func (e BrowserCdpTargetCreateTargetCommandDataMethod) Valid() bool { switch e { - case Page: + case TargetCreateTarget: return true default: return false } } -// Defines values for BrowserPageTabOpenedEventType. +// Defines values for BrowserCdpTargetDisposeBrowserContextCommandDataMethod. const ( - PageTabOpened BrowserPageTabOpenedEventType = "page_tab_opened" + TargetDisposeBrowserContext BrowserCdpTargetDisposeBrowserContextCommandDataMethod = "Target.disposeBrowserContext" ) -// Valid indicates whether the value is a known member of the BrowserPageTabOpenedEventType enum. -func (e BrowserPageTabOpenedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpTargetDisposeBrowserContextCommandDataMethod enum. +func (e BrowserCdpTargetDisposeBrowserContextCommandDataMethod) Valid() bool { switch e { - case PageTabOpened: + case TargetDisposeBrowserContext: return true default: return false } } -// Defines values for BrowserPlatformApiCallEventCategory. +// Defines values for BrowserCdpTargetOpenDevToolsCommandDataMethod. const ( - Platform BrowserPlatformApiCallEventCategory = "platform" + TargetOpenDevTools BrowserCdpTargetOpenDevToolsCommandDataMethod = "Target.openDevTools" ) -// Valid indicates whether the value is a known member of the BrowserPlatformApiCallEventCategory enum. -func (e BrowserPlatformApiCallEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpTargetOpenDevToolsCommandDataMethod enum. +func (e BrowserCdpTargetOpenDevToolsCommandDataMethod) Valid() bool { switch e { - case Platform: + case TargetOpenDevTools: return true default: return false } } -// Defines values for BrowserPlatformApiCallEventType. +// Defines values for BrowserCdpTouchEventType. const ( - PlatformApiCall BrowserPlatformApiCallEventType = "platform_api_call" + BrowserCdpTouchEventTypeOther BrowserCdpTouchEventType = "other" + BrowserCdpTouchEventTypeTouchCancel BrowserCdpTouchEventType = "touchCancel" + BrowserCdpTouchEventTypeTouchEnd BrowserCdpTouchEventType = "touchEnd" + BrowserCdpTouchEventTypeTouchMove BrowserCdpTouchEventType = "touchMove" + BrowserCdpTouchEventTypeTouchStart BrowserCdpTouchEventType = "touchStart" ) -// Valid indicates whether the value is a known member of the BrowserPlatformApiCallEventType enum. -func (e BrowserPlatformApiCallEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpTouchEventType enum. +func (e BrowserCdpTouchEventType) Valid() bool { switch e { - case PlatformApiCall: + case BrowserCdpTouchEventTypeOther: + return true + case BrowserCdpTouchEventTypeTouchCancel: + return true + case BrowserCdpTouchEventTypeTouchEnd: + return true + case BrowserCdpTouchEventTypeTouchMove: + return true + case BrowserCdpTouchEventTypeTouchStart: return true default: return false } } -// Defines values for BrowserServiceCrashedEventCategory. +// Defines values for BrowserCdpTransitionType. const ( - BrowserServiceCrashedEventCategorySystem BrowserServiceCrashedEventCategory = "system" + BrowserCdpTransitionTypeAddressBar BrowserCdpTransitionType = "address_bar" + BrowserCdpTransitionTypeAutoBookmark BrowserCdpTransitionType = "auto_bookmark" + BrowserCdpTransitionTypeAutoSubframe BrowserCdpTransitionType = "auto_subframe" + BrowserCdpTransitionTypeAutoToplevel BrowserCdpTransitionType = "auto_toplevel" + BrowserCdpTransitionTypeFormSubmit BrowserCdpTransitionType = "form_submit" + BrowserCdpTransitionTypeGenerated BrowserCdpTransitionType = "generated" + BrowserCdpTransitionTypeKeyword BrowserCdpTransitionType = "keyword" + BrowserCdpTransitionTypeKeywordGenerated BrowserCdpTransitionType = "keyword_generated" + BrowserCdpTransitionTypeLink BrowserCdpTransitionType = "link" + BrowserCdpTransitionTypeManualSubframe BrowserCdpTransitionType = "manual_subframe" + BrowserCdpTransitionTypeOther BrowserCdpTransitionType = "other" + BrowserCdpTransitionTypeReload BrowserCdpTransitionType = "reload" + BrowserCdpTransitionTypeTyped BrowserCdpTransitionType = "typed" ) -// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventCategory enum. -func (e BrowserServiceCrashedEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpTransitionType enum. +func (e BrowserCdpTransitionType) Valid() bool { switch e { - case BrowserServiceCrashedEventCategorySystem: + case BrowserCdpTransitionTypeAddressBar: + return true + case BrowserCdpTransitionTypeAutoBookmark: + return true + case BrowserCdpTransitionTypeAutoSubframe: + return true + case BrowserCdpTransitionTypeAutoToplevel: + return true + case BrowserCdpTransitionTypeFormSubmit: + return true + case BrowserCdpTransitionTypeGenerated: + return true + case BrowserCdpTransitionTypeKeyword: + return true + case BrowserCdpTransitionTypeKeywordGenerated: + return true + case BrowserCdpTransitionTypeLink: + return true + case BrowserCdpTransitionTypeManualSubframe: + return true + case BrowserCdpTransitionTypeOther: + return true + case BrowserCdpTransitionTypeReload: + return true + case BrowserCdpTransitionTypeTyped: return true default: return false } } -// Defines values for BrowserServiceCrashedEventType. +// Defines values for BrowserCdpWebLifecycleState. const ( - ServiceCrashed BrowserServiceCrashedEventType = "service_crashed" + BrowserCdpWebLifecycleStateActive BrowserCdpWebLifecycleState = "active" + BrowserCdpWebLifecycleStateFrozen BrowserCdpWebLifecycleState = "frozen" + BrowserCdpWebLifecycleStateOther BrowserCdpWebLifecycleState = "other" ) -// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventType enum. -func (e BrowserServiceCrashedEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpWebLifecycleState enum. +func (e BrowserCdpWebLifecycleState) Valid() bool { switch e { - case ServiceCrashed: + case BrowserCdpWebLifecycleStateActive: + return true + case BrowserCdpWebLifecycleStateFrozen: + return true + case BrowserCdpWebLifecycleStateOther: return true default: return false } } -// Defines values for BrowserServiceCrashedEventDataPhase. +// Defines values for BrowserCdpWindowState. const ( - BrowserServiceCrashedEventDataPhaseGaveUp BrowserServiceCrashedEventDataPhase = "gave_up" - BrowserServiceCrashedEventDataPhaseRunning BrowserServiceCrashedEventDataPhase = "running" - BrowserServiceCrashedEventDataPhaseStartup BrowserServiceCrashedEventDataPhase = "startup" + BrowserCdpWindowStateFullscreen BrowserCdpWindowState = "fullscreen" + BrowserCdpWindowStateMaximized BrowserCdpWindowState = "maximized" + BrowserCdpWindowStateMinimized BrowserCdpWindowState = "minimized" + BrowserCdpWindowStateNormal BrowserCdpWindowState = "normal" + BrowserCdpWindowStateOther BrowserCdpWindowState = "other" ) -// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventDataPhase enum. -func (e BrowserServiceCrashedEventDataPhase) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserCdpWindowState enum. +func (e BrowserCdpWindowState) Valid() bool { switch e { - case BrowserServiceCrashedEventDataPhaseGaveUp: + case BrowserCdpWindowStateFullscreen: return true - case BrowserServiceCrashedEventDataPhaseRunning: + case BrowserCdpWindowStateMaximized: return true - case BrowserServiceCrashedEventDataPhaseStartup: + case BrowserCdpWindowStateMinimized: + return true + case BrowserCdpWindowStateNormal: + return true + case BrowserCdpWindowStateOther: return true default: return false } } -// Defines values for BrowserSystemOomKillEventCategory. +// Defines values for BrowserConsoleErrorEventCategory. const ( - BrowserSystemOomKillEventCategorySystem BrowserSystemOomKillEventCategory = "system" + BrowserConsoleErrorEventCategoryConsole BrowserConsoleErrorEventCategory = "console" ) -// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventCategory enum. -func (e BrowserSystemOomKillEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserConsoleErrorEventCategory enum. +func (e BrowserConsoleErrorEventCategory) Valid() bool { switch e { - case BrowserSystemOomKillEventCategorySystem: + case BrowserConsoleErrorEventCategoryConsole: return true default: return false } } -// Defines values for BrowserSystemOomKillEventType. +// Defines values for BrowserConsoleErrorEventType. const ( - SystemOomKill BrowserSystemOomKillEventType = "system_oom_kill" + ConsoleError BrowserConsoleErrorEventType = "console_error" ) -// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventType enum. -func (e BrowserSystemOomKillEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserConsoleErrorEventType enum. +func (e BrowserConsoleErrorEventType) Valid() bool { switch e { - case SystemOomKill: + case ConsoleError: return true default: return false } } -// Defines values for BrowserSystemOomKillEventDataConstraint. +// Defines values for BrowserConsoleLogEventCategory. const ( - Cpuset BrowserSystemOomKillEventDataConstraint = "cpuset" - Memcg BrowserSystemOomKillEventDataConstraint = "memcg" - MemoryPolicy BrowserSystemOomKillEventDataConstraint = "memory_policy" - None BrowserSystemOomKillEventDataConstraint = "none" + BrowserConsoleLogEventCategoryConsole BrowserConsoleLogEventCategory = "console" ) -// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventDataConstraint enum. -func (e BrowserSystemOomKillEventDataConstraint) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserConsoleLogEventCategory enum. +func (e BrowserConsoleLogEventCategory) Valid() bool { switch e { - case Cpuset: - return true - case Memcg: - return true - case MemoryPolicy: - return true - case None: + case BrowserConsoleLogEventCategoryConsole: return true default: return false } } -// Defines values for BrowserTargetType. +// Defines values for BrowserConsoleLogEventType. const ( - BrowserTargetTypeBackgroundPage BrowserTargetType = "background_page" - BrowserTargetTypeOther BrowserTargetType = "other" - BrowserTargetTypePage BrowserTargetType = "page" - BrowserTargetTypeServiceWorker BrowserTargetType = "service_worker" - BrowserTargetTypeSharedWorker BrowserTargetType = "shared_worker" + ConsoleLog BrowserConsoleLogEventType = "console_log" ) -// Valid indicates whether the value is a known member of the BrowserTargetType enum. -func (e BrowserTargetType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserConsoleLogEventType enum. +func (e BrowserConsoleLogEventType) Valid() bool { switch e { - case BrowserTargetTypeBackgroundPage: - return true - case BrowserTargetTypeOther: - return true - case BrowserTargetTypePage: - return true - case BrowserTargetTypeServiceWorker: - return true - case BrowserTargetTypeSharedWorker: + case ConsoleLog: return true default: return false } } -// Defines values for ChromiumConfigureErrorPhase. +// Defines values for BrowserEventSourceKind. const ( - ConfigurePhase ChromiumConfigureErrorPhase = "configure_phase" - NavigatePhase ChromiumConfigureErrorPhase = "navigate_phase" + Cdp BrowserEventSourceKind = "cdp" + Extension BrowserEventSourceKind = "extension" + KernelApi BrowserEventSourceKind = "kernel_api" + LocalProcess BrowserEventSourceKind = "local_process" ) -// Valid indicates whether the value is a known member of the ChromiumConfigureErrorPhase enum. -func (e ChromiumConfigureErrorPhase) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserEventSourceKind enum. +func (e BrowserEventSourceKind) Valid() bool { switch e { - case ConfigurePhase: + case Cdp: return true - case NavigatePhase: + case Extension: + return true + case KernelApi: + return true + case LocalProcess: return true default: return false } } -// Defines values for ChromiumConfigureErrorStep. +// Defines values for BrowserInteractionClickEventCategory. const ( - ChromePolicies ChromiumConfigureErrorStep = "chrome_policies" - ChromiumFlags ChromiumConfigureErrorStep = "chromium_flags" - Display ChromiumConfigureErrorStep = "display" - Extensions ChromiumConfigureErrorStep = "extensions" - Profile ChromiumConfigureErrorStep = "profile" - StartChromium ChromiumConfigureErrorStep = "start_chromium" - StopChromium ChromiumConfigureErrorStep = "stop_chromium" + BrowserInteractionClickEventCategoryInteraction BrowserInteractionClickEventCategory = "interaction" ) -// Valid indicates whether the value is a known member of the ChromiumConfigureErrorStep enum. -func (e ChromiumConfigureErrorStep) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionClickEventCategory enum. +func (e BrowserInteractionClickEventCategory) Valid() bool { switch e { - case ChromePolicies: - return true - case ChromiumFlags: - return true - case Display: - return true - case Extensions: - return true - case Profile: - return true - case StartChromium: - return true - case StopChromium: + case BrowserInteractionClickEventCategoryInteraction: return true default: return false } } -// Defines values for ClickMouseRequestButton. +// Defines values for BrowserInteractionClickEventType. const ( - ClickMouseRequestButtonBack ClickMouseRequestButton = "back" - ClickMouseRequestButtonForward ClickMouseRequestButton = "forward" - ClickMouseRequestButtonLeft ClickMouseRequestButton = "left" - ClickMouseRequestButtonMiddle ClickMouseRequestButton = "middle" - ClickMouseRequestButtonRight ClickMouseRequestButton = "right" + InteractionClick BrowserInteractionClickEventType = "interaction_click" ) -// Valid indicates whether the value is a known member of the ClickMouseRequestButton enum. -func (e ClickMouseRequestButton) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionClickEventType enum. +func (e BrowserInteractionClickEventType) Valid() bool { switch e { - case ClickMouseRequestButtonBack: - return true - case ClickMouseRequestButtonForward: - return true - case ClickMouseRequestButtonLeft: - return true - case ClickMouseRequestButtonMiddle: - return true - case ClickMouseRequestButtonRight: + case InteractionClick: return true default: return false } } -// Defines values for ClickMouseRequestClickType. +// Defines values for BrowserInteractionKeyEventCategory. const ( - Click ClickMouseRequestClickType = "click" - Down ClickMouseRequestClickType = "down" - Up ClickMouseRequestClickType = "up" + BrowserInteractionKeyEventCategoryInteraction BrowserInteractionKeyEventCategory = "interaction" ) -// Valid indicates whether the value is a known member of the ClickMouseRequestClickType enum. -func (e ClickMouseRequestClickType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionKeyEventCategory enum. +func (e BrowserInteractionKeyEventCategory) Valid() bool { switch e { - case Click: - return true - case Down: - return true - case Up: + case BrowserInteractionKeyEventCategoryInteraction: return true default: return false } } -// Defines values for ComputerActionType. +// Defines values for BrowserInteractionKeyEventType. const ( - ClickMouse ComputerActionType = "click_mouse" - DragMouse ComputerActionType = "drag_mouse" - MoveMouse ComputerActionType = "move_mouse" - PressKey ComputerActionType = "press_key" - Scroll ComputerActionType = "scroll" - SetCursor ComputerActionType = "set_cursor" - Sleep ComputerActionType = "sleep" - TypeText ComputerActionType = "type_text" + InteractionKey BrowserInteractionKeyEventType = "interaction_key" ) -// Valid indicates whether the value is a known member of the ComputerActionType enum. -func (e ComputerActionType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionKeyEventType enum. +func (e BrowserInteractionKeyEventType) Valid() bool { switch e { - case ClickMouse: - return true - case DragMouse: - return true - case MoveMouse: - return true - case PressKey: - return true - case Scroll: - return true - case SetCursor: - return true - case Sleep: - return true - case TypeText: + case InteractionKey: return true default: return false } } -// Defines values for DragMouseRequestButton. +// Defines values for BrowserInteractionScrollSettledEventCategory. const ( - DragMouseRequestButtonLeft DragMouseRequestButton = "left" - DragMouseRequestButtonMiddle DragMouseRequestButton = "middle" - DragMouseRequestButtonRight DragMouseRequestButton = "right" + BrowserInteractionScrollSettledEventCategoryInteraction BrowserInteractionScrollSettledEventCategory = "interaction" ) -// Valid indicates whether the value is a known member of the DragMouseRequestButton enum. -func (e DragMouseRequestButton) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionScrollSettledEventCategory enum. +func (e BrowserInteractionScrollSettledEventCategory) Valid() bool { switch e { - case DragMouseRequestButtonLeft: - return true - case DragMouseRequestButtonMiddle: - return true - case DragMouseRequestButtonRight: + case BrowserInteractionScrollSettledEventCategoryInteraction: return true default: return false } } -// Defines values for FileSystemEventType. +// Defines values for BrowserInteractionScrollSettledEventType. const ( - CREATE FileSystemEventType = "CREATE" - DELETE FileSystemEventType = "DELETE" - RENAME FileSystemEventType = "RENAME" - WRITE FileSystemEventType = "WRITE" + InteractionScrollSettled BrowserInteractionScrollSettledEventType = "interaction_scroll_settled" ) -// Valid indicates whether the value is a known member of the FileSystemEventType enum. -func (e FileSystemEventType) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserInteractionScrollSettledEventType enum. +func (e BrowserInteractionScrollSettledEventType) Valid() bool { switch e { - case CREATE: - return true - case DELETE: - return true - case RENAME: - return true - case WRITE: + case InteractionScrollSettled: return true default: return false } } -// Defines values for PatchDisplayRequestRefreshRate. +// Defines values for BrowserLiveViewConnectEventCategory. const ( - N10 PatchDisplayRequestRefreshRate = 10 - N25 PatchDisplayRequestRefreshRate = 25 - N30 PatchDisplayRequestRefreshRate = 30 - N60 PatchDisplayRequestRefreshRate = 60 + BrowserLiveViewConnectEventCategoryConnection BrowserLiveViewConnectEventCategory = "connection" ) -// Valid indicates whether the value is a known member of the PatchDisplayRequestRefreshRate enum. -func (e PatchDisplayRequestRefreshRate) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserLiveViewConnectEventCategory enum. +func (e BrowserLiveViewConnectEventCategory) Valid() bool { switch e { - case N10: - return true - case N25: - return true - case N30: - return true - case N60: + case BrowserLiveViewConnectEventCategoryConnection: return true default: return false } } -// Defines values for ProcessKillRequestSignal. +// Defines values for BrowserLiveViewConnectEventType. const ( - HUP ProcessKillRequestSignal = "HUP" - INT ProcessKillRequestSignal = "INT" - KILL ProcessKillRequestSignal = "KILL" - TERM ProcessKillRequestSignal = "TERM" + LiveViewConnect BrowserLiveViewConnectEventType = "live_view_connect" ) -// Valid indicates whether the value is a known member of the ProcessKillRequestSignal enum. -func (e ProcessKillRequestSignal) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserLiveViewConnectEventType enum. +func (e BrowserLiveViewConnectEventType) Valid() bool { switch e { - case HUP: - return true - case INT: - return true - case KILL: - return true - case TERM: + case LiveViewConnect: return true default: return false } } -// Defines values for ProcessStatusState. +// Defines values for BrowserLiveViewDisconnectEventCategory. const ( - ProcessStatusStateExited ProcessStatusState = "exited" - ProcessStatusStateRunning ProcessStatusState = "running" + BrowserLiveViewDisconnectEventCategoryConnection BrowserLiveViewDisconnectEventCategory = "connection" ) -// Valid indicates whether the value is a known member of the ProcessStatusState enum. -func (e ProcessStatusState) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserLiveViewDisconnectEventCategory enum. +func (e BrowserLiveViewDisconnectEventCategory) Valid() bool { switch e { - case ProcessStatusStateExited: - return true - case ProcessStatusStateRunning: + case BrowserLiveViewDisconnectEventCategoryConnection: return true default: return false } } -// Defines values for ProcessStreamEventEvent. +// Defines values for BrowserLiveViewDisconnectEventType. const ( - Exit ProcessStreamEventEvent = "exit" + LiveViewDisconnect BrowserLiveViewDisconnectEventType = "live_view_disconnect" ) -// Valid indicates whether the value is a known member of the ProcessStreamEventEvent enum. -func (e ProcessStreamEventEvent) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserLiveViewDisconnectEventType enum. +func (e BrowserLiveViewDisconnectEventType) Valid() bool { switch e { - case Exit: + case LiveViewDisconnect: return true default: return false } } -// Defines values for ProcessStreamEventStream. +// Defines values for BrowserMonitorDisconnectedEventCategory. const ( - Stderr ProcessStreamEventStream = "stderr" - Stdout ProcessStreamEventStream = "stdout" + BrowserMonitorDisconnectedEventCategoryMonitor BrowserMonitorDisconnectedEventCategory = "monitor" ) -// Valid indicates whether the value is a known member of the ProcessStreamEventStream enum. -func (e ProcessStreamEventStream) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventCategory enum. +func (e BrowserMonitorDisconnectedEventCategory) Valid() bool { switch e { - case Stderr: - return true - case Stdout: + case BrowserMonitorDisconnectedEventCategoryMonitor: return true default: return false } } -// Defines values for PublishEventRequestCategory. +// Defines values for BrowserMonitorDisconnectedEventType. const ( - PublishEventRequestCategoryCaptcha PublishEventRequestCategory = "captcha" - PublishEventRequestCategoryConnection PublishEventRequestCategory = "connection" - PublishEventRequestCategoryConsole PublishEventRequestCategory = "console" - PublishEventRequestCategoryControl PublishEventRequestCategory = "control" - PublishEventRequestCategoryInteraction PublishEventRequestCategory = "interaction" - PublishEventRequestCategoryMonitor PublishEventRequestCategory = "monitor" - PublishEventRequestCategoryNetwork PublishEventRequestCategory = "network" - PublishEventRequestCategoryPage PublishEventRequestCategory = "page" - PublishEventRequestCategoryPlatform PublishEventRequestCategory = "platform" - PublishEventRequestCategoryScreenshot PublishEventRequestCategory = "screenshot" - PublishEventRequestCategorySystem PublishEventRequestCategory = "system" + MonitorDisconnected BrowserMonitorDisconnectedEventType = "monitor_disconnected" ) -// Valid indicates whether the value is a known member of the PublishEventRequestCategory enum. -func (e PublishEventRequestCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventType enum. +func (e BrowserMonitorDisconnectedEventType) Valid() bool { switch e { - case PublishEventRequestCategoryCaptcha: - return true - case PublishEventRequestCategoryConnection: - return true - case PublishEventRequestCategoryConsole: - return true - case PublishEventRequestCategoryControl: - return true - case PublishEventRequestCategoryInteraction: - return true - case PublishEventRequestCategoryMonitor: - return true - case PublishEventRequestCategoryNetwork: - return true - case PublishEventRequestCategoryPage: - return true - case PublishEventRequestCategoryPlatform: - return true - case PublishEventRequestCategoryScreenshot: - return true - case PublishEventRequestCategorySystem: + case MonitorDisconnected: return true default: return false } } -// Defines values for TelemetryEventCategory. +// Defines values for BrowserMonitorDisconnectedEventDataReason. const ( - TelemetryEventCategoryCaptcha TelemetryEventCategory = "captcha" - TelemetryEventCategoryConnection TelemetryEventCategory = "connection" - TelemetryEventCategoryConsole TelemetryEventCategory = "console" - TelemetryEventCategoryControl TelemetryEventCategory = "control" - TelemetryEventCategoryInteraction TelemetryEventCategory = "interaction" - TelemetryEventCategoryMonitor TelemetryEventCategory = "monitor" - TelemetryEventCategoryNetwork TelemetryEventCategory = "network" - TelemetryEventCategoryPage TelemetryEventCategory = "page" - TelemetryEventCategoryPlatform TelemetryEventCategory = "platform" - TelemetryEventCategoryScreenshot TelemetryEventCategory = "screenshot" - TelemetryEventCategorySystem TelemetryEventCategory = "system" + ChromeRestarted BrowserMonitorDisconnectedEventDataReason = "chrome_restarted" ) -// Valid indicates whether the value is a known member of the TelemetryEventCategory enum. -func (e TelemetryEventCategory) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorDisconnectedEventDataReason enum. +func (e BrowserMonitorDisconnectedEventDataReason) Valid() bool { switch e { - case TelemetryEventCategoryCaptcha: - return true - case TelemetryEventCategoryConnection: - return true - case TelemetryEventCategoryConsole: - return true - case TelemetryEventCategoryControl: - return true - case TelemetryEventCategoryInteraction: - return true - case TelemetryEventCategoryMonitor: - return true - case TelemetryEventCategoryNetwork: - return true - case TelemetryEventCategoryPage: - return true - case TelemetryEventCategoryPlatform: - return true - case TelemetryEventCategoryScreenshot: - return true - case TelemetryEventCategorySystem: + case ChromeRestarted: return true default: return false } } -// Defines values for DownloadDirZstdParamsCompressionLevel. +// Defines values for BrowserMonitorInitFailedEventCategory. const ( - Best DownloadDirZstdParamsCompressionLevel = "best" - Better DownloadDirZstdParamsCompressionLevel = "better" - Default DownloadDirZstdParamsCompressionLevel = "default" - Fastest DownloadDirZstdParamsCompressionLevel = "fastest" + BrowserMonitorInitFailedEventCategoryMonitor BrowserMonitorInitFailedEventCategory = "monitor" ) -// Valid indicates whether the value is a known member of the DownloadDirZstdParamsCompressionLevel enum. -func (e DownloadDirZstdParamsCompressionLevel) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorInitFailedEventCategory enum. +func (e BrowserMonitorInitFailedEventCategory) Valid() bool { switch e { - case Best: - return true - case Better: - return true - case Default: - return true - case Fastest: + case BrowserMonitorInitFailedEventCategoryMonitor: return true default: return false } } -// Defines values for LogsStreamParamsSource. +// Defines values for BrowserMonitorInitFailedEventType. const ( - Path LogsStreamParamsSource = "path" - Supervisor LogsStreamParamsSource = "supervisor" + MonitorInitFailed BrowserMonitorInitFailedEventType = "monitor_init_failed" ) -// Valid indicates whether the value is a known member of the LogsStreamParamsSource enum. -func (e LogsStreamParamsSource) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorInitFailedEventType enum. +func (e BrowserMonitorInitFailedEventType) Valid() bool { switch e { - case Path: - return true - case Supervisor: + case MonitorInitFailed: return true default: return false } } -// Defines values for StreamTelemetryEventsParamsReplay. +// Defines values for BrowserMonitorReconnectFailedEventCategory. const ( - All StreamTelemetryEventsParamsReplay = "all" + BrowserMonitorReconnectFailedEventCategoryMonitor BrowserMonitorReconnectFailedEventCategory = "monitor" ) -// Valid indicates whether the value is a known member of the StreamTelemetryEventsParamsReplay enum. -func (e StreamTelemetryEventsParamsReplay) Valid() bool { +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventCategory enum. +func (e BrowserMonitorReconnectFailedEventCategory) Valid() bool { switch e { - case All: + case BrowserMonitorReconnectFailedEventCategoryMonitor: return true default: return false } } -// BatchComputerActionRequest A batch of computer actions to execute sequentially. -type BatchComputerActionRequest struct { - // Actions Ordered list of actions to execute. Execution stops on the first error. - Actions []ComputerAction `json:"actions"` -} +// Defines values for BrowserMonitorReconnectFailedEventType. +const ( + MonitorReconnectFailed BrowserMonitorReconnectFailedEventType = "monitor_reconnect_failed" +) -// BrowserApiCallEvent A call that drives the browser, handled by the kernel-images-api server: computer-control actions, Playwright code execution, screenshots and clipboard access. Calls that manage the VM instead emit `platform_api_call`. -type BrowserApiCallEvent struct { - Category BrowserApiCallEventCategory `json:"category"` +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventType enum. +func (e BrowserMonitorReconnectFailedEventType) Valid() bool { + switch e { + case MonitorReconnectFailed: + return true + default: + return false + } +} - // Data Per-call payload for `api_call` events. - Data *BrowserApiCallEventData `json:"data,omitempty"` +// Defines values for BrowserMonitorReconnectFailedEventDataReason. +const ( + ReconnectExhausted BrowserMonitorReconnectFailedEventDataReason = "reconnect_exhausted" +) - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectFailedEventDataReason enum. +func (e BrowserMonitorReconnectFailedEventDataReason) Valid() bool { + switch e { + case ReconnectExhausted: + return true + default: + return false + } +} - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` +// Defines values for BrowserMonitorReconnectedEventCategory. +const ( + BrowserMonitorReconnectedEventCategoryMonitor BrowserMonitorReconnectedEventCategory = "monitor" +) - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserApiCallEventType `json:"type"` +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectedEventCategory enum. +func (e BrowserMonitorReconnectedEventCategory) Valid() bool { + switch e { + case BrowserMonitorReconnectedEventCategoryMonitor: + return true + default: + return false + } } -// BrowserApiCallEventCategory defines model for BrowserApiCallEvent.Category. -type BrowserApiCallEventCategory string - -// BrowserApiCallEventType defines model for BrowserApiCallEvent.Type. -type BrowserApiCallEventType string +// Defines values for BrowserMonitorReconnectedEventType. +const ( + MonitorReconnected BrowserMonitorReconnectedEventType = "monitor_reconnected" +) -// BrowserApiCallEventData Per-call payload for `api_call` events. -type BrowserApiCallEventData struct { - // Code Source submitted to `executePlaywrightCode`, capped at 8192 bytes like every other captured string. A capped value is cut on a character boundary and ends in `...[truncated]`. Absent for every other operation. - Code *string `json:"code,omitempty"` +// Valid indicates whether the value is a known member of the BrowserMonitorReconnectedEventType enum. +func (e BrowserMonitorReconnectedEventType) Valid() bool { + switch e { + case MonitorReconnected: + return true + default: + return false + } +} - // DurationMs Wall-clock duration of the handler in milliseconds. - DurationMs float32 `json:"duration_ms"` +// Defines values for BrowserMonitorScreenshotEventCategory. +const ( + Screenshot BrowserMonitorScreenshotEventCategory = "screenshot" +) - // OperationId Matched route's operation, named as the server names its handler (e.g. `TakeScreenshot`, `ExecutePlaywrightCode`). - OperationId string `json:"operation_id"` +// Valid indicates whether the value is a known member of the BrowserMonitorScreenshotEventCategory enum. +func (e BrowserMonitorScreenshotEventCategory) Valid() bool { + switch e { + case Screenshot: + return true + default: + return false + } +} - // RequestId Per-request identifier from the kernel-images-api request middleware. - RequestId string `json:"request_id"` +// Defines values for BrowserMonitorScreenshotEventType. +const ( + MonitorScreenshot BrowserMonitorScreenshotEventType = "monitor_screenshot" +) - // Status HTTP response status code. - Status int `json:"status"` +// Valid indicates whether the value is a known member of the BrowserMonitorScreenshotEventType enum. +func (e BrowserMonitorScreenshotEventType) Valid() bool { + switch e { + case MonitorScreenshot: + return true + default: + return false + } } -// BrowserCallStack CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. -type BrowserCallStack struct { - // CallFrames Ordered list of call frames, outermost first. - CallFrames []struct { - // ColumnNumber Zero-based column number within the line. - ColumnNumber int `json:"columnNumber"` - - // FunctionName JavaScript function name, or empty string for anonymous functions. - FunctionName string `json:"functionName"` +// Defines values for BrowserNetworkIdleEventCategory. +const ( + BrowserNetworkIdleEventCategoryNetwork BrowserNetworkIdleEventCategory = "network" +) - // LineNumber Zero-based line number within the script. - LineNumber int `json:"lineNumber"` +// Valid indicates whether the value is a known member of the BrowserNetworkIdleEventCategory enum. +func (e BrowserNetworkIdleEventCategory) Valid() bool { + switch e { + case BrowserNetworkIdleEventCategoryNetwork: + return true + default: + return false + } +} - // ScriptId CDP script identifier. - ScriptId string `json:"scriptId"` +// Defines values for BrowserNetworkIdleEventType. +const ( + NetworkIdle BrowserNetworkIdleEventType = "network_idle" +) - // Url URL or name of the script file. - Url string `json:"url"` +// Valid indicates whether the value is a known member of the BrowserNetworkIdleEventType enum. +func (e BrowserNetworkIdleEventType) Valid() bool { + switch e { + case NetworkIdle: + return true + default: + return false + } +} + +// Defines values for BrowserNetworkLoadingFailedEventCategory. +const ( + BrowserNetworkLoadingFailedEventCategoryNetwork BrowserNetworkLoadingFailedEventCategory = "network" +) + +// Valid indicates whether the value is a known member of the BrowserNetworkLoadingFailedEventCategory enum. +func (e BrowserNetworkLoadingFailedEventCategory) Valid() bool { + switch e { + case BrowserNetworkLoadingFailedEventCategoryNetwork: + return true + default: + return false + } +} + +// Defines values for BrowserNetworkLoadingFailedEventType. +const ( + NetworkLoadingFailed BrowserNetworkLoadingFailedEventType = "network_loading_failed" +) + +// Valid indicates whether the value is a known member of the BrowserNetworkLoadingFailedEventType enum. +func (e BrowserNetworkLoadingFailedEventType) Valid() bool { + switch e { + case NetworkLoadingFailed: + return true + default: + return false + } +} + +// Defines values for BrowserNetworkRequestEventCategory. +const ( + BrowserNetworkRequestEventCategoryNetwork BrowserNetworkRequestEventCategory = "network" +) + +// Valid indicates whether the value is a known member of the BrowserNetworkRequestEventCategory enum. +func (e BrowserNetworkRequestEventCategory) Valid() bool { + switch e { + case BrowserNetworkRequestEventCategoryNetwork: + return true + default: + return false + } +} + +// Defines values for BrowserNetworkRequestEventType. +const ( + NetworkRequest BrowserNetworkRequestEventType = "network_request" +) + +// Valid indicates whether the value is a known member of the BrowserNetworkRequestEventType enum. +func (e BrowserNetworkRequestEventType) Valid() bool { + switch e { + case NetworkRequest: + return true + default: + return false + } +} + +// Defines values for BrowserNetworkResponseEventCategory. +const ( + BrowserNetworkResponseEventCategoryNetwork BrowserNetworkResponseEventCategory = "network" +) + +// Valid indicates whether the value is a known member of the BrowserNetworkResponseEventCategory enum. +func (e BrowserNetworkResponseEventCategory) Valid() bool { + switch e { + case BrowserNetworkResponseEventCategoryNetwork: + return true + default: + return false + } +} + +// Defines values for BrowserNetworkResponseEventType. +const ( + NetworkResponse BrowserNetworkResponseEventType = "network_response" +) + +// Valid indicates whether the value is a known member of the BrowserNetworkResponseEventType enum. +func (e BrowserNetworkResponseEventType) Valid() bool { + switch e { + case NetworkResponse: + return true + default: + return false + } +} + +// Defines values for BrowserPageCrashedEventCategory. +const ( + BrowserPageCrashedEventCategoryPage BrowserPageCrashedEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageCrashedEventCategory enum. +func (e BrowserPageCrashedEventCategory) Valid() bool { + switch e { + case BrowserPageCrashedEventCategoryPage: + return true + default: + return false + } +} + +// Defines values for BrowserPageCrashedEventType. +const ( + PageCrashed BrowserPageCrashedEventType = "page_crashed" +) + +// Valid indicates whether the value is a known member of the BrowserPageCrashedEventType enum. +func (e BrowserPageCrashedEventType) Valid() bool { + switch e { + case PageCrashed: + return true + default: + return false + } +} + +// Defines values for BrowserPageDomContentLoadedEventCategory. +const ( + BrowserPageDomContentLoadedEventCategoryPage BrowserPageDomContentLoadedEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageDomContentLoadedEventCategory enum. +func (e BrowserPageDomContentLoadedEventCategory) Valid() bool { + switch e { + case BrowserPageDomContentLoadedEventCategoryPage: + return true + default: + return false + } +} + +// Defines values for BrowserPageDomContentLoadedEventType. +const ( + PageDomContentLoaded BrowserPageDomContentLoadedEventType = "page_dom_content_loaded" +) + +// Valid indicates whether the value is a known member of the BrowserPageDomContentLoadedEventType enum. +func (e BrowserPageDomContentLoadedEventType) Valid() bool { + switch e { + case PageDomContentLoaded: + return true + default: + return false + } +} + +// Defines values for BrowserPageLayoutSettledEventCategory. +const ( + BrowserPageLayoutSettledEventCategoryPage BrowserPageLayoutSettledEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageLayoutSettledEventCategory enum. +func (e BrowserPageLayoutSettledEventCategory) Valid() bool { + switch e { + case BrowserPageLayoutSettledEventCategoryPage: + return true + default: + return false + } +} + +// Defines values for BrowserPageLayoutSettledEventType. +const ( + PageLayoutSettled BrowserPageLayoutSettledEventType = "page_layout_settled" +) + +// Valid indicates whether the value is a known member of the BrowserPageLayoutSettledEventType enum. +func (e BrowserPageLayoutSettledEventType) Valid() bool { + switch e { + case PageLayoutSettled: + return true + default: + return false + } +} + +// Defines values for BrowserPageLayoutShiftEventCategory. +const ( + BrowserPageLayoutShiftEventCategoryPage BrowserPageLayoutShiftEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageLayoutShiftEventCategory enum. +func (e BrowserPageLayoutShiftEventCategory) Valid() bool { + switch e { + case BrowserPageLayoutShiftEventCategoryPage: + return true + default: + return false + } +} + +// Defines values for BrowserPageLayoutShiftEventType. +const ( + PageLayoutShift BrowserPageLayoutShiftEventType = "page_layout_shift" +) + +// Valid indicates whether the value is a known member of the BrowserPageLayoutShiftEventType enum. +func (e BrowserPageLayoutShiftEventType) Valid() bool { + switch e { + case PageLayoutShift: + return true + default: + return false + } +} + +// Defines values for BrowserPageLcpEventCategory. +const ( + BrowserPageLcpEventCategoryPage BrowserPageLcpEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageLcpEventCategory enum. +func (e BrowserPageLcpEventCategory) Valid() bool { + switch e { + case BrowserPageLcpEventCategoryPage: + return true + default: + return false + } +} + +// Defines values for BrowserPageLcpEventType. +const ( + PageLcp BrowserPageLcpEventType = "page_lcp" +) + +// Valid indicates whether the value is a known member of the BrowserPageLcpEventType enum. +func (e BrowserPageLcpEventType) Valid() bool { + switch e { + case PageLcp: + return true + default: + return false + } +} + +// Defines values for BrowserPageLoadEventCategory. +const ( + BrowserPageLoadEventCategoryPage BrowserPageLoadEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageLoadEventCategory enum. +func (e BrowserPageLoadEventCategory) Valid() bool { + switch e { + case BrowserPageLoadEventCategoryPage: + return true + default: + return false + } +} + +// Defines values for BrowserPageLoadEventType. +const ( + PageLoad BrowserPageLoadEventType = "page_load" +) + +// Valid indicates whether the value is a known member of the BrowserPageLoadEventType enum. +func (e BrowserPageLoadEventType) Valid() bool { + switch e { + case PageLoad: + return true + default: + return false + } +} + +// Defines values for BrowserPageNavigationEventCategory. +const ( + BrowserPageNavigationEventCategoryPage BrowserPageNavigationEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageNavigationEventCategory enum. +func (e BrowserPageNavigationEventCategory) Valid() bool { + switch e { + case BrowserPageNavigationEventCategoryPage: + return true + default: + return false + } +} + +// Defines values for BrowserPageNavigationEventType. +const ( + PageNavigation BrowserPageNavigationEventType = "page_navigation" +) + +// Valid indicates whether the value is a known member of the BrowserPageNavigationEventType enum. +func (e BrowserPageNavigationEventType) Valid() bool { + switch e { + case PageNavigation: + return true + default: + return false + } +} + +// Defines values for BrowserPageNavigationSettledEventCategory. +const ( + BrowserPageNavigationSettledEventCategoryPage BrowserPageNavigationSettledEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageNavigationSettledEventCategory enum. +func (e BrowserPageNavigationSettledEventCategory) Valid() bool { + switch e { + case BrowserPageNavigationSettledEventCategoryPage: + return true + default: + return false + } +} + +// Defines values for BrowserPageNavigationSettledEventType. +const ( + PageNavigationSettled BrowserPageNavigationSettledEventType = "page_navigation_settled" +) + +// Valid indicates whether the value is a known member of the BrowserPageNavigationSettledEventType enum. +func (e BrowserPageNavigationSettledEventType) Valid() bool { + switch e { + case PageNavigationSettled: + return true + default: + return false + } +} + +// Defines values for BrowserPageTabOpenedEventCategory. +const ( + Page BrowserPageTabOpenedEventCategory = "page" +) + +// Valid indicates whether the value is a known member of the BrowserPageTabOpenedEventCategory enum. +func (e BrowserPageTabOpenedEventCategory) Valid() bool { + switch e { + case Page: + return true + default: + return false + } +} + +// Defines values for BrowserPageTabOpenedEventType. +const ( + PageTabOpened BrowserPageTabOpenedEventType = "page_tab_opened" +) + +// Valid indicates whether the value is a known member of the BrowserPageTabOpenedEventType enum. +func (e BrowserPageTabOpenedEventType) Valid() bool { + switch e { + case PageTabOpened: + return true + default: + return false + } +} + +// Defines values for BrowserPlatformApiCallEventCategory. +const ( + Platform BrowserPlatformApiCallEventCategory = "platform" +) + +// Valid indicates whether the value is a known member of the BrowserPlatformApiCallEventCategory enum. +func (e BrowserPlatformApiCallEventCategory) Valid() bool { + switch e { + case Platform: + return true + default: + return false + } +} + +// Defines values for BrowserPlatformApiCallEventType. +const ( + PlatformApiCall BrowserPlatformApiCallEventType = "platform_api_call" +) + +// Valid indicates whether the value is a known member of the BrowserPlatformApiCallEventType enum. +func (e BrowserPlatformApiCallEventType) Valid() bool { + switch e { + case PlatformApiCall: + return true + default: + return false + } +} + +// Defines values for BrowserProxyErrorEventCategory. +const ( + Network BrowserProxyErrorEventCategory = "network" +) + +// Valid indicates whether the value is a known member of the BrowserProxyErrorEventCategory enum. +func (e BrowserProxyErrorEventCategory) Valid() bool { + switch e { + case Network: + return true + default: + return false + } +} + +// Defines values for BrowserProxyErrorEventType. +const ( + ProxyError BrowserProxyErrorEventType = "proxy_error" +) + +// Valid indicates whether the value is a known member of the BrowserProxyErrorEventType enum. +func (e BrowserProxyErrorEventType) Valid() bool { + switch e { + case ProxyError: + return true + default: + return false + } +} + +// Defines values for BrowserProxyErrorEventDataCode. +const ( + DestinationBlocked BrowserProxyErrorEventDataCode = "destination_blocked" + ProviderBlacklisted BrowserProxyErrorEventDataCode = "provider_blacklisted" + ProviderUnreachable BrowserProxyErrorEventDataCode = "provider_unreachable" + ProxyUnavailable BrowserProxyErrorEventDataCode = "proxy_unavailable" + UpstreamConnectFailed BrowserProxyErrorEventDataCode = "upstream_connect_failed" + UpstreamDnsFailure BrowserProxyErrorEventDataCode = "upstream_dns_failure" + UpstreamTimeout BrowserProxyErrorEventDataCode = "upstream_timeout" +) + +// Valid indicates whether the value is a known member of the BrowserProxyErrorEventDataCode enum. +func (e BrowserProxyErrorEventDataCode) Valid() bool { + switch e { + case DestinationBlocked: + return true + case ProviderBlacklisted: + return true + case ProviderUnreachable: + return true + case ProxyUnavailable: + return true + case UpstreamConnectFailed: + return true + case UpstreamDnsFailure: + return true + case UpstreamTimeout: + return true + default: + return false + } +} + +// Defines values for BrowserServiceCrashedEventCategory. +const ( + BrowserServiceCrashedEventCategorySystem BrowserServiceCrashedEventCategory = "system" +) + +// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventCategory enum. +func (e BrowserServiceCrashedEventCategory) Valid() bool { + switch e { + case BrowserServiceCrashedEventCategorySystem: + return true + default: + return false + } +} + +// Defines values for BrowserServiceCrashedEventType. +const ( + ServiceCrashed BrowserServiceCrashedEventType = "service_crashed" +) + +// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventType enum. +func (e BrowserServiceCrashedEventType) Valid() bool { + switch e { + case ServiceCrashed: + return true + default: + return false + } +} + +// Defines values for BrowserServiceCrashedEventDataPhase. +const ( + BrowserServiceCrashedEventDataPhaseGaveUp BrowserServiceCrashedEventDataPhase = "gave_up" + BrowserServiceCrashedEventDataPhaseRunning BrowserServiceCrashedEventDataPhase = "running" + BrowserServiceCrashedEventDataPhaseStartup BrowserServiceCrashedEventDataPhase = "startup" +) + +// Valid indicates whether the value is a known member of the BrowserServiceCrashedEventDataPhase enum. +func (e BrowserServiceCrashedEventDataPhase) Valid() bool { + switch e { + case BrowserServiceCrashedEventDataPhaseGaveUp: + return true + case BrowserServiceCrashedEventDataPhaseRunning: + return true + case BrowserServiceCrashedEventDataPhaseStartup: + return true + default: + return false + } +} + +// Defines values for BrowserSystemOomKillEventCategory. +const ( + BrowserSystemOomKillEventCategorySystem BrowserSystemOomKillEventCategory = "system" +) + +// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventCategory enum. +func (e BrowserSystemOomKillEventCategory) Valid() bool { + switch e { + case BrowserSystemOomKillEventCategorySystem: + return true + default: + return false + } +} + +// Defines values for BrowserSystemOomKillEventType. +const ( + SystemOomKill BrowserSystemOomKillEventType = "system_oom_kill" +) + +// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventType enum. +func (e BrowserSystemOomKillEventType) Valid() bool { + switch e { + case SystemOomKill: + return true + default: + return false + } +} + +// Defines values for BrowserSystemOomKillEventDataConstraint. +const ( + Cpuset BrowserSystemOomKillEventDataConstraint = "cpuset" + Memcg BrowserSystemOomKillEventDataConstraint = "memcg" + MemoryPolicy BrowserSystemOomKillEventDataConstraint = "memory_policy" + None BrowserSystemOomKillEventDataConstraint = "none" +) + +// Valid indicates whether the value is a known member of the BrowserSystemOomKillEventDataConstraint enum. +func (e BrowserSystemOomKillEventDataConstraint) Valid() bool { + switch e { + case Cpuset: + return true + case Memcg: + return true + case MemoryPolicy: + return true + case None: + return true + default: + return false + } +} + +// Defines values for BrowserTargetType. +const ( + BrowserTargetTypeBackgroundPage BrowserTargetType = "background_page" + BrowserTargetTypeOther BrowserTargetType = "other" + BrowserTargetTypePage BrowserTargetType = "page" + BrowserTargetTypeServiceWorker BrowserTargetType = "service_worker" + BrowserTargetTypeSharedWorker BrowserTargetType = "shared_worker" +) + +// Valid indicates whether the value is a known member of the BrowserTargetType enum. +func (e BrowserTargetType) Valid() bool { + switch e { + case BrowserTargetTypeBackgroundPage: + return true + case BrowserTargetTypeOther: + return true + case BrowserTargetTypePage: + return true + case BrowserTargetTypeServiceWorker: + return true + case BrowserTargetTypeSharedWorker: + return true + default: + return false + } +} + +// Defines values for ChromiumConfigureErrorPhase. +const ( + ConfigurePhase ChromiumConfigureErrorPhase = "configure_phase" + NavigatePhase ChromiumConfigureErrorPhase = "navigate_phase" +) + +// Valid indicates whether the value is a known member of the ChromiumConfigureErrorPhase enum. +func (e ChromiumConfigureErrorPhase) Valid() bool { + switch e { + case ConfigurePhase: + return true + case NavigatePhase: + return true + default: + return false + } +} + +// Defines values for ChromiumConfigureErrorStep. +const ( + ChromePolicies ChromiumConfigureErrorStep = "chrome_policies" + ChromiumFlags ChromiumConfigureErrorStep = "chromium_flags" + Display ChromiumConfigureErrorStep = "display" + Extensions ChromiumConfigureErrorStep = "extensions" + Profile ChromiumConfigureErrorStep = "profile" + StartChromium ChromiumConfigureErrorStep = "start_chromium" + StopChromium ChromiumConfigureErrorStep = "stop_chromium" +) + +// Valid indicates whether the value is a known member of the ChromiumConfigureErrorStep enum. +func (e ChromiumConfigureErrorStep) Valid() bool { + switch e { + case ChromePolicies: + return true + case ChromiumFlags: + return true + case Display: + return true + case Extensions: + return true + case Profile: + return true + case StartChromium: + return true + case StopChromium: + return true + default: + return false + } +} + +// Defines values for ClickMouseRequestButton. +const ( + ClickMouseRequestButtonBack ClickMouseRequestButton = "back" + ClickMouseRequestButtonForward ClickMouseRequestButton = "forward" + ClickMouseRequestButtonLeft ClickMouseRequestButton = "left" + ClickMouseRequestButtonMiddle ClickMouseRequestButton = "middle" + ClickMouseRequestButtonRight ClickMouseRequestButton = "right" +) + +// Valid indicates whether the value is a known member of the ClickMouseRequestButton enum. +func (e ClickMouseRequestButton) Valid() bool { + switch e { + case ClickMouseRequestButtonBack: + return true + case ClickMouseRequestButtonForward: + return true + case ClickMouseRequestButtonLeft: + return true + case ClickMouseRequestButtonMiddle: + return true + case ClickMouseRequestButtonRight: + return true + default: + return false + } +} + +// Defines values for ClickMouseRequestClickType. +const ( + Click ClickMouseRequestClickType = "click" + Down ClickMouseRequestClickType = "down" + Up ClickMouseRequestClickType = "up" +) + +// Valid indicates whether the value is a known member of the ClickMouseRequestClickType enum. +func (e ClickMouseRequestClickType) Valid() bool { + switch e { + case Click: + return true + case Down: + return true + case Up: + return true + default: + return false + } +} + +// Defines values for ComputerActionType. +const ( + ClickMouse ComputerActionType = "click_mouse" + DragMouse ComputerActionType = "drag_mouse" + MoveMouse ComputerActionType = "move_mouse" + PressKey ComputerActionType = "press_key" + Scroll ComputerActionType = "scroll" + SetCursor ComputerActionType = "set_cursor" + Sleep ComputerActionType = "sleep" + TypeText ComputerActionType = "type_text" +) + +// Valid indicates whether the value is a known member of the ComputerActionType enum. +func (e ComputerActionType) Valid() bool { + switch e { + case ClickMouse: + return true + case DragMouse: + return true + case MoveMouse: + return true + case PressKey: + return true + case Scroll: + return true + case SetCursor: + return true + case Sleep: + return true + case TypeText: + return true + default: + return false + } +} + +// Defines values for DragMouseRequestButton. +const ( + DragMouseRequestButtonLeft DragMouseRequestButton = "left" + DragMouseRequestButtonMiddle DragMouseRequestButton = "middle" + DragMouseRequestButtonRight DragMouseRequestButton = "right" +) + +// Valid indicates whether the value is a known member of the DragMouseRequestButton enum. +func (e DragMouseRequestButton) Valid() bool { + switch e { + case DragMouseRequestButtonLeft: + return true + case DragMouseRequestButtonMiddle: + return true + case DragMouseRequestButtonRight: + return true + default: + return false + } +} + +// Defines values for FileSystemEventType. +const ( + CREATE FileSystemEventType = "CREATE" + DELETE FileSystemEventType = "DELETE" + RENAME FileSystemEventType = "RENAME" + WRITE FileSystemEventType = "WRITE" +) + +// Valid indicates whether the value is a known member of the FileSystemEventType enum. +func (e FileSystemEventType) Valid() bool { + switch e { + case CREATE: + return true + case DELETE: + return true + case RENAME: + return true + case WRITE: + return true + default: + return false + } +} + +// Defines values for PatchDisplayRequestRefreshRate. +const ( + N10 PatchDisplayRequestRefreshRate = 10 + N25 PatchDisplayRequestRefreshRate = 25 + N30 PatchDisplayRequestRefreshRate = 30 + N60 PatchDisplayRequestRefreshRate = 60 +) + +// Valid indicates whether the value is a known member of the PatchDisplayRequestRefreshRate enum. +func (e PatchDisplayRequestRefreshRate) Valid() bool { + switch e { + case N10: + return true + case N25: + return true + case N30: + return true + case N60: + return true + default: + return false + } +} + +// Defines values for ProcessKillRequestSignal. +const ( + HUP ProcessKillRequestSignal = "HUP" + INT ProcessKillRequestSignal = "INT" + KILL ProcessKillRequestSignal = "KILL" + TERM ProcessKillRequestSignal = "TERM" +) + +// Valid indicates whether the value is a known member of the ProcessKillRequestSignal enum. +func (e ProcessKillRequestSignal) Valid() bool { + switch e { + case HUP: + return true + case INT: + return true + case KILL: + return true + case TERM: + return true + default: + return false + } +} + +// Defines values for ProcessStatusState. +const ( + ProcessStatusStateExited ProcessStatusState = "exited" + ProcessStatusStateRunning ProcessStatusState = "running" +) + +// Valid indicates whether the value is a known member of the ProcessStatusState enum. +func (e ProcessStatusState) Valid() bool { + switch e { + case ProcessStatusStateExited: + return true + case ProcessStatusStateRunning: + return true + default: + return false + } +} + +// Defines values for ProcessStreamEventEvent. +const ( + Exit ProcessStreamEventEvent = "exit" +) + +// Valid indicates whether the value is a known member of the ProcessStreamEventEvent enum. +func (e ProcessStreamEventEvent) Valid() bool { + switch e { + case Exit: + return true + default: + return false + } +} + +// Defines values for ProcessStreamEventStream. +const ( + Stderr ProcessStreamEventStream = "stderr" + Stdout ProcessStreamEventStream = "stdout" +) + +// Valid indicates whether the value is a known member of the ProcessStreamEventStream enum. +func (e ProcessStreamEventStream) Valid() bool { + switch e { + case Stderr: + return true + case Stdout: + return true + default: + return false + } +} + +// Defines values for PublishEventRequestCategory. +const ( + PublishEventRequestCategoryCaptcha PublishEventRequestCategory = "captcha" + PublishEventRequestCategoryConnection PublishEventRequestCategory = "connection" + PublishEventRequestCategoryConsole PublishEventRequestCategory = "console" + PublishEventRequestCategoryControl PublishEventRequestCategory = "control" + PublishEventRequestCategoryInteraction PublishEventRequestCategory = "interaction" + PublishEventRequestCategoryMonitor PublishEventRequestCategory = "monitor" + PublishEventRequestCategoryNetwork PublishEventRequestCategory = "network" + PublishEventRequestCategoryPage PublishEventRequestCategory = "page" + PublishEventRequestCategoryPlatform PublishEventRequestCategory = "platform" + PublishEventRequestCategoryScreenshot PublishEventRequestCategory = "screenshot" + PublishEventRequestCategorySystem PublishEventRequestCategory = "system" +) + +// Valid indicates whether the value is a known member of the PublishEventRequestCategory enum. +func (e PublishEventRequestCategory) Valid() bool { + switch e { + case PublishEventRequestCategoryCaptcha: + return true + case PublishEventRequestCategoryConnection: + return true + case PublishEventRequestCategoryConsole: + return true + case PublishEventRequestCategoryControl: + return true + case PublishEventRequestCategoryInteraction: + return true + case PublishEventRequestCategoryMonitor: + return true + case PublishEventRequestCategoryNetwork: + return true + case PublishEventRequestCategoryPage: + return true + case PublishEventRequestCategoryPlatform: + return true + case PublishEventRequestCategoryScreenshot: + return true + case PublishEventRequestCategorySystem: + return true + default: + return false + } +} + +// Defines values for TelemetryEventCategory. +const ( + TelemetryEventCategoryCaptcha TelemetryEventCategory = "captcha" + TelemetryEventCategoryConnection TelemetryEventCategory = "connection" + TelemetryEventCategoryConsole TelemetryEventCategory = "console" + TelemetryEventCategoryControl TelemetryEventCategory = "control" + TelemetryEventCategoryInteraction TelemetryEventCategory = "interaction" + TelemetryEventCategoryMonitor TelemetryEventCategory = "monitor" + TelemetryEventCategoryNetwork TelemetryEventCategory = "network" + TelemetryEventCategoryPage TelemetryEventCategory = "page" + TelemetryEventCategoryPlatform TelemetryEventCategory = "platform" + TelemetryEventCategoryScreenshot TelemetryEventCategory = "screenshot" + TelemetryEventCategorySystem TelemetryEventCategory = "system" +) + +// Valid indicates whether the value is a known member of the TelemetryEventCategory enum. +func (e TelemetryEventCategory) Valid() bool { + switch e { + case TelemetryEventCategoryCaptcha: + return true + case TelemetryEventCategoryConnection: + return true + case TelemetryEventCategoryConsole: + return true + case TelemetryEventCategoryControl: + return true + case TelemetryEventCategoryInteraction: + return true + case TelemetryEventCategoryMonitor: + return true + case TelemetryEventCategoryNetwork: + return true + case TelemetryEventCategoryPage: + return true + case TelemetryEventCategoryPlatform: + return true + case TelemetryEventCategoryScreenshot: + return true + case TelemetryEventCategorySystem: + return true + default: + return false + } +} + +// Defines values for DownloadDirZstdParamsCompressionLevel. +const ( + Best DownloadDirZstdParamsCompressionLevel = "best" + Better DownloadDirZstdParamsCompressionLevel = "better" + Default DownloadDirZstdParamsCompressionLevel = "default" + Fastest DownloadDirZstdParamsCompressionLevel = "fastest" +) + +// Valid indicates whether the value is a known member of the DownloadDirZstdParamsCompressionLevel enum. +func (e DownloadDirZstdParamsCompressionLevel) Valid() bool { + switch e { + case Best: + return true + case Better: + return true + case Default: + return true + case Fastest: + return true + default: + return false + } +} + +// Defines values for LogsStreamParamsSource. +const ( + Path LogsStreamParamsSource = "path" + Supervisor LogsStreamParamsSource = "supervisor" +) + +// Valid indicates whether the value is a known member of the LogsStreamParamsSource enum. +func (e LogsStreamParamsSource) Valid() bool { + switch e { + case Path: + return true + case Supervisor: + return true + default: + return false + } +} + +// Defines values for StreamTelemetryEventsParamsReplay. +const ( + All StreamTelemetryEventsParamsReplay = "all" +) + +// Valid indicates whether the value is a known member of the StreamTelemetryEventsParamsReplay enum. +func (e StreamTelemetryEventsParamsReplay) Valid() bool { + switch e { + case All: + return true + default: + return false + } +} + +// BatchComputerActionRequest A batch of computer actions to execute sequentially. +type BatchComputerActionRequest struct { + // Actions Ordered list of actions to execute. Execution stops on the first error. + Actions []ComputerAction `json:"actions"` +} + +// BrowserApiCallEvent A call that drives the browser, handled by the kernel-images-api server: computer-control actions, Playwright code execution, screenshots and clipboard access. Calls that manage the VM instead emit `platform_api_call`. +type BrowserApiCallEvent struct { + Category BrowserApiCallEventCategory `json:"category"` + + // Data Per-call payload for `api_call` events. + Data *BrowserApiCallEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserApiCallEventType `json:"type"` +} + +// BrowserApiCallEventCategory defines model for BrowserApiCallEvent.Category. +type BrowserApiCallEventCategory string + +// BrowserApiCallEventType defines model for BrowserApiCallEvent.Type. +type BrowserApiCallEventType string + +// BrowserApiCallEventData Per-call payload for `api_call` events. +type BrowserApiCallEventData struct { + // Code Source submitted to `executePlaywrightCode`, capped at 8192 bytes like every other captured string. A capped value is cut on a character boundary and ends in `...[truncated]`. Absent for every other operation. + Code *string `json:"code,omitempty"` + + // DurationMs Wall-clock duration of the handler in milliseconds. + DurationMs float32 `json:"duration_ms"` + + // OperationId Matched route's operation, named as the server names its handler (e.g. `TakeScreenshot`, `ExecutePlaywrightCode`). + OperationId string `json:"operation_id"` + + // RequestId Per-request identifier from the kernel-images-api request middleware. + RequestId string `json:"request_id"` + + // Status HTTP response status code. + Status int `json:"status"` +} + +// BrowserCallStack CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. +type BrowserCallStack struct { + // CallFrames Ordered list of call frames, outermost first. + CallFrames []struct { + // ColumnNumber Zero-based column number within the line. + ColumnNumber int `json:"columnNumber"` + + // FunctionName JavaScript function name, or empty string for anonymous functions. + FunctionName string `json:"functionName"` + + // LineNumber Zero-based line number within the script. + LineNumber int `json:"lineNumber"` + + // ScriptId CDP script identifier. + ScriptId string `json:"scriptId"` + + // Url URL or name of the script file. + Url string `json:"url"` } `json:"callFrames"` - // Description Optional label for the stack trace (e.g. async cause). - Description *string `json:"description,omitempty"` + // Description Optional label for the stack trace (e.g. async cause). + Description *string `json:"description,omitempty"` + + // Parent Parent stack trace for async stacks. + Parent *BrowserCallStack `json:"parent,omitempty"` +} + +// BrowserCaptchaSolveResultEvent A captcha solve attempt reached a terminal outcome. +type BrowserCaptchaSolveResultEvent struct { + Category BrowserCaptchaSolveResultEventCategory `json:"category"` + + // Data Per-attempt payload for `captcha_solve_result` events. + Data *BrowserCaptchaSolveResultEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserCaptchaSolveResultEventType `json:"type"` +} + +// BrowserCaptchaSolveResultEventCategory defines model for BrowserCaptchaSolveResultEvent.Category. +type BrowserCaptchaSolveResultEventCategory string + +// BrowserCaptchaSolveResultEventType defines model for BrowserCaptchaSolveResultEvent.Type. +type BrowserCaptchaSolveResultEventType string + +// BrowserCaptchaSolveResultEventData Per-attempt payload for `captcha_solve_result` events. +type BrowserCaptchaSolveResultEventData struct { + // CaptchaType Captcha vendor family. Producers normalize provider-specific task names into this set: enterprise variants of recaptcha collapse into their version bucket (v2 / v3), and anything not covered (e.g. DataDome, MtCaptcha, plain OCR) is reported as `other`. + CaptchaType BrowserCaptchaSolveResultEventDataCaptchaType `json:"captcha_type"` + + // DurationMs Wall-clock duration from solve start to terminal outcome. + DurationMs float32 `json:"duration_ms"` + + // ErrorCode Solver-specific error code on failure (e.g. `ERROR_CAPTCHA_UNSOLVABLE`). Absent on success. + ErrorCode *string `json:"error_code,omitempty"` + + // Status Terminal outcome. `success`: solver returned a usable solution. `failure`: solver returned an error (see `error_code`). `timeout`: solver did not return within the caller's wait budget. `abandoned`: caller cancelled or the page navigated away mid-solve. + Status BrowserCaptchaSolveResultEventDataStatus `json:"status"` + + // TaskId Solver-assigned identifier. Opaque, useful for support cross-references. + TaskId *string `json:"task_id,omitempty"` + + // WebsiteHost Host of the page where the captcha was solved. + WebsiteHost *string `json:"website_host,omitempty"` + + // WebsitePath Path of the page where the captcha was solved. Query string excluded. + WebsitePath *string `json:"website_path,omitempty"` +} + +// BrowserCaptchaSolveResultEventDataCaptchaType Captcha vendor family. Producers normalize provider-specific task names into this set: enterprise variants of recaptcha collapse into their version bucket (v2 / v3), and anything not covered (e.g. DataDome, MtCaptcha, plain OCR) is reported as `other`. +type BrowserCaptchaSolveResultEventDataCaptchaType string + +// BrowserCaptchaSolveResultEventDataStatus Terminal outcome. `success`: solver returned a usable solution. `failure`: solver returned an error (see `error_code`). `timeout`: solver did not return within the caller's wait budget. `abandoned`: caller cancelled or the page navigated away mid-solve. +type BrowserCaptchaSolveResultEventDataStatus string + +// BrowserCdpAutofillMode Which kind of value autofill filled. Canonical values from devtools-protocol@2d019e73. +type BrowserCdpAutofillMode string + +// BrowserCdpAutofillTriggerCommandData Sanitized `Autofill.trigger` arguments. Canonical input: `Autofill.trigger` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpAutofillTriggerCommandData struct { + // AddressFieldCount Number of address fields the command filled. Their names and values are never captured. + AddressFieldCount *int `json:"address_field_count,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // FieldId Opaque backend node identifier of the field that was autofilled. + FieldId int `json:"field_id"` + + // FrameId Opaque frame identifier. Clipped to 128 characters; a longer value is not a real identifier. + FrameId *string `json:"frame_id,omitempty"` + Method BrowserCdpAutofillTriggerCommandDataMethod `json:"method"` + + // Mode What was filled: `card` or `address`. The values themselves are never captured. + Mode *BrowserCdpAutofillMode `json:"mode,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpAutofillTriggerCommandDataMethod defines model for BrowserCdpAutofillTriggerCommandData.Method. +type BrowserCdpAutofillTriggerCommandDataMethod string + +// BrowserCdpBrowserCancelDownloadCommandData Sanitized `Browser.cancelDownload` arguments. Canonical input: `Browser.cancelDownload` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpBrowserCancelDownloadCommandData struct { + // BrowserContextId Opaque browser context identifier. Clipped to 128 characters; a longer value is not a real identifier. + BrowserContextId *string `json:"browser_context_id,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // DownloadGuid Opaque identifier of the download that was cancelled. Clipped to 128 characters; a longer value is not a real identifier. + DownloadGuid string `json:"download_guid"` + Method BrowserCdpBrowserCancelDownloadCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpBrowserCancelDownloadCommandDataMethod defines model for BrowserCdpBrowserCancelDownloadCommandData.Method. +type BrowserCdpBrowserCancelDownloadCommandDataMethod string + +// BrowserCdpBrowserCloseCommandData Sanitized `Browser.close` arguments. Canonical input: `Browser.close` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpBrowserCloseCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpBrowserCloseCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpBrowserCloseCommandDataMethod defines model for BrowserCdpBrowserCloseCommandData.Method. +type BrowserCdpBrowserCloseCommandDataMethod string + +// BrowserCdpBrowserSetContentsSizeCommandData Sanitized `Browser.setContentsSize` arguments. Canonical input: `Browser.setContentsSize` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpBrowserSetContentsSizeCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // Height Contents height in DIP. + Height *int `json:"height,omitempty"` + Method BrowserCdpBrowserSetContentsSizeCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // Width Contents width in DIP. + Width *int `json:"width,omitempty"` + + // WindowId Browser window identifier. + WindowId int `json:"window_id"` +} + +// BrowserCdpBrowserSetContentsSizeCommandDataMethod defines model for BrowserCdpBrowserSetContentsSizeCommandData.Method. +type BrowserCdpBrowserSetContentsSizeCommandDataMethod string + +// BrowserCdpBrowserSetWindowBoundsCommandData Sanitized `Browser.setWindowBounds` arguments. Canonical input: `Browser.setWindowBounds` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpBrowserSetWindowBoundsCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // Height Window height in DIP. + Height *int `json:"height,omitempty"` + + // Left Window x position in screen coordinates. + Left *int `json:"left,omitempty"` + Method BrowserCdpBrowserSetWindowBoundsCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // Top Window y position in screen coordinates. + Top *int `json:"top,omitempty"` + + // Width Window width in DIP. + Width *int `json:"width,omitempty"` + + // WindowId Browser window identifier. + WindowId int `json:"window_id"` + + // WindowState Window state requested (`normal`, `minimized`, `maximized`, `fullscreen`). A value the protocol does not define is reported as `other`. + WindowState *BrowserCdpWindowState `json:"window_state,omitempty"` +} + +// BrowserCdpBrowserSetWindowBoundsCommandDataMethod defines model for BrowserCdpBrowserSetWindowBoundsCommandData.Method. +type BrowserCdpBrowserSetWindowBoundsCommandDataMethod string + +// BrowserCdpCommandEvent A browser-control command a client sent over the CDP WebSocket proxy: input gestures, navigation, dialog handling, file selection and screenshots. Configuration commands and the DOM/Runtime traffic a client library issues on the caller's behalf are not reported. +// One event per browser-control command that reached the browser. The command stream is not sampled, coalesced or reordered. An event is lost only when the method is excluded by telemetry configuration, when the command's arguments do not decode, or when classification cannot keep up. Exclusions are counted in `cdp_disconnect.telemetry_excluded`; the rest in `cdp_disconnect.telemetry_dropped`. +type BrowserCdpCommandEvent struct { + Category BrowserCdpCommandEventCategory `json:"category"` + + // Data Per-command payload for `cdp_command` events, discriminated by `method`. Each variant carries only the arguments approved for that command: values that could hold a secret — typed and composition text, URLs, referrers, scripts, templates, file paths, drag contents and autofill values — are replaced by a length, a count, a presence flag, an enum or a URL scheme and host. + Data BrowserCdpCommandEventData `json:"data"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserCdpCommandEventType `json:"type"` +} + +// BrowserCdpCommandEventCategory defines model for BrowserCdpCommandEvent.Category. +type BrowserCdpCommandEventCategory string + +// BrowserCdpCommandEventType defines model for BrowserCdpCommandEvent.Type. +type BrowserCdpCommandEventType string + +// BrowserCdpCommandEventData Per-command payload for `cdp_command` events, discriminated by `method`. Each variant carries only the arguments approved for that command: values that could hold a secret — typed and composition text, URLs, referrers, scripts, templates, file paths, drag contents and autofill values — are replaced by a length, a count, a presence flag, an enum or a URL scheme and host. +type BrowserCdpCommandEventData struct { + union json.RawMessage +} + +// BrowserCdpCommandMethod A browser-control CDP method the proxy reports. The set covers the commands an agent drives the browser with; configuration, DOM and Runtime bookkeeping, and Chrome-specific UI commands are outside it. Canonical definitions: devtools-protocol@2d019e73. +type BrowserCdpCommandMethod string + +// BrowserCdpConnectEvent An external client (e.g. customer SDK, Playwright, Puppeteer) connected to the CDP WebSocket proxy on this VM. +type BrowserCdpConnectEvent struct { + Category BrowserCdpConnectEventCategory `json:"category"` + + // Data Per-connection payload for `cdp_connect` events. + Data *BrowserCdpConnectEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserCdpConnectEventType `json:"type"` +} + +// BrowserCdpConnectEventCategory defines model for BrowserCdpConnectEvent.Category. +type BrowserCdpConnectEventCategory string + +// BrowserCdpConnectEventType defines model for BrowserCdpConnectEvent.Type. +type BrowserCdpConnectEventType string + +// BrowserCdpConnectEventData Per-connection payload for `cdp_connect` events. +type BrowserCdpConnectEventData struct { + // ConnectionId Identifies this CDP proxy connection, matching the `connection_id` on the `cdp_command` events that arrived on it. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` +} + +// BrowserCdpDisconnectEvent An external client disconnected from the CDP WebSocket proxy on this VM. Pair with the immediately preceding `cdp_connect` on the same stream. +type BrowserCdpDisconnectEvent struct { + Category BrowserCdpDisconnectEventCategory `json:"category"` + + // Data Per-disconnect payload for `cdp_disconnect` events. + Data *BrowserCdpDisconnectEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserCdpDisconnectEventType `json:"type"` +} + +// BrowserCdpDisconnectEventCategory defines model for BrowserCdpDisconnectEvent.Category. +type BrowserCdpDisconnectEventCategory string + +// BrowserCdpDisconnectEventType defines model for BrowserCdpDisconnectEvent.Type. +type BrowserCdpDisconnectEventType string + +// BrowserCdpDisconnectEventData Per-disconnect payload for `cdp_disconnect` events. +type BrowserCdpDisconnectEventData struct { + // ConnectionId Identifies this CDP proxy connection, matching the `connection_id` on the `cdp_command` events that arrived on it. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // DurationMs Wall-clock duration of the connection in milliseconds. + DurationMs float32 `json:"duration_ms"` + + // MessageCount Number of CDP messages relayed across the connection in either direction. + MessageCount int `json:"message_count"` + + // Reason Why the connection ended. `client_close`: the client initiated the close. `upstream_changed`: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. `upstream_error`: upstream dial or message pump errored. `context_cancelled`: the request context was cancelled (typically server shutdown). + Reason BrowserCdpDisconnectEventDataReason `json:"reason"` + + // TelemetryDropped Number of supported browser-control commands that were forwarded to the browser but never classified, because the queue was full or classification panicked. Every increment is a real lost command — unsupported and excluded methods are filtered before admission and never count toward this total. Telemetry loss only; every command was still relayed to the browser. Always present on images that report it; absent on images predating the field, which is not the same as zero. + TelemetryDropped *int `json:"telemetry_dropped,omitempty"` + + // TelemetryExcluded Number of forwarded client commands that produced no `cdp_command` event because their method is listed in `control.cdp.excluded_methods`. Configuration rather than loss, so it is counted apart from `telemetry_dropped`. + TelemetryExcluded *int `json:"telemetry_excluded,omitempty"` +} + +// BrowserCdpDisconnectEventDataReason Why the connection ended. `client_close`: the client initiated the close. `upstream_changed`: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. `upstream_error`: upstream dial or message pump errored. `context_cancelled`: the request context was cancelled (typically server shutdown). +type BrowserCdpDisconnectEventDataReason string + +// BrowserCdpDomFocusCommandData Sanitized `DOM.focus` arguments. Canonical input: `DOM.focus` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpDomFocusCommandData struct { + // BackendNodeId Opaque backend DOM node identifier the command targeted. + BackendNodeId *int `json:"backend_node_id,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpDomFocusCommandDataMethod `json:"method"` + + // NodeId Opaque DOM node identifier the command targeted. + NodeId *int `json:"node_id,omitempty"` + + // ObjectId Opaque Runtime remote object identifier the command targeted. Clipped to 128 characters; a longer value is not a real identifier. + ObjectId *string `json:"object_id,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpDomFocusCommandDataMethod defines model for BrowserCdpDomFocusCommandData.Method. +type BrowserCdpDomFocusCommandDataMethod string + +// BrowserCdpDomScrollIntoViewIfNeededCommandData Sanitized `DOM.scrollIntoViewIfNeeded` arguments. Canonical input: `DOM.scrollIntoViewIfNeeded` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpDomScrollIntoViewIfNeededCommandData struct { + // BackendNodeId Opaque backend DOM node identifier the command targeted. + BackendNodeId *int `json:"backend_node_id,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod `json:"method"` + + // NodeId Opaque DOM node identifier the command targeted. + NodeId *int `json:"node_id,omitempty"` + + // ObjectId Opaque Runtime remote object identifier the command targeted. Clipped to 128 characters; a longer value is not a real identifier. + ObjectId *string `json:"object_id,omitempty"` + + // RectHeight Height of the rect the command scrolled to. + RectHeight *float64 `json:"rect_height,omitempty"` + + // RectWidth Width of the rect the command scrolled to. + RectWidth *float64 `json:"rect_width,omitempty"` + + // RectX X offset of the rect the command scrolled to, relative to the node. + RectX *float64 `json:"rect_x,omitempty"` + + // RectY Y offset of the rect the command scrolled to, relative to the node. + RectY *float64 `json:"rect_y,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod defines model for BrowserCdpDomScrollIntoViewIfNeededCommandData.Method. +type BrowserCdpDomScrollIntoViewIfNeededCommandDataMethod string + +// BrowserCdpDomSetFileInputFilesCommandData Sanitized `DOM.setFileInputFiles` arguments. Canonical input: `DOM.setFileInputFiles` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpDomSetFileInputFilesCommandData struct { + // BackendNodeId Opaque backend DOM node identifier the command targeted. + BackendNodeId *int `json:"backend_node_id,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // FileCount Number of files handed to the input. File paths are never captured. + FileCount int `json:"file_count"` + Method BrowserCdpDomSetFileInputFilesCommandDataMethod `json:"method"` + + // NodeId Opaque DOM node identifier the command targeted. + NodeId *int `json:"node_id,omitempty"` + + // ObjectId Opaque Runtime remote object identifier the command targeted. Clipped to 128 characters; a longer value is not a real identifier. + ObjectId *string `json:"object_id,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpDomSetFileInputFilesCommandDataMethod defines model for BrowserCdpDomSetFileInputFilesCommandData.Method. +type BrowserCdpDomSetFileInputFilesCommandDataMethod string + +// BrowserCdpDragEventType Drag event phase. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpDragEventType string + +// BrowserCdpDragMimeCategory Top-level MIME category of a drag item, from the IANA registry rather than the protocol; a drag item's subtype names the file, so only the category is reported. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpDragMimeCategory string + +// BrowserCdpGestureSourceType Input source a synthesized gesture emulates. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpGestureSourceType string + +// BrowserCdpInputCancelDraggingCommandData Sanitized `Input.cancelDragging` arguments. Canonical input: `Input.cancelDragging` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputCancelDraggingCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpInputCancelDraggingCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpInputCancelDraggingCommandDataMethod defines model for BrowserCdpInputCancelDraggingCommandData.Method. +type BrowserCdpInputCancelDraggingCommandDataMethod string + +// BrowserCdpInputDispatchDragEventCommandData Sanitized `Input.dispatchDragEvent` arguments. Canonical input: `Input.dispatchDragEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputDispatchDragEventCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // DragFileCount Number of files in the drag payload. File paths are never captured. + DragFileCount *int `json:"drag_file_count,omitempty"` + + // DragItemCount Number of items in the drag payload. Item contents are never captured. + DragItemCount *int `json:"drag_item_count,omitempty"` + + // DragMimeCategories Distinct top-level MIME categories of the drag items (e.g. `text`, `image`, `application`). Subtypes and contents are never captured. A value the protocol does not define is reported as `other`. + DragMimeCategories *[]BrowserCdpDragMimeCategory `json:"drag_mime_categories,omitempty"` + + // DragOperationsMask Bit field of allowed drag operations (1=copy, 2=link, 16=move). + DragOperationsMask *int `json:"drag_operations_mask,omitempty"` + + // EventType Drag event phase: `dragEnter`, `dragOver`, `drop` or `dragCancel`. A value the protocol does not define is reported as `other`. + EventType BrowserCdpDragEventType `json:"event_type"` + Method BrowserCdpInputDispatchDragEventCommandDataMethod `json:"method"` + + // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). + Modifiers *int `json:"modifiers,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // X Viewport x coordinate in CSS pixels. + X *float64 `json:"x,omitempty"` + + // Y Viewport y coordinate in CSS pixels. + Y *float64 `json:"y,omitempty"` +} + +// BrowserCdpInputDispatchDragEventCommandDataMethod defines model for BrowserCdpInputDispatchDragEventCommandData.Method. +type BrowserCdpInputDispatchDragEventCommandDataMethod string + +// BrowserCdpInputDispatchKeyEventCommandData Sanitized `Input.dispatchKeyEvent` arguments. Canonical input: `Input.dispatchKeyEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputDispatchKeyEventCommandData struct { + // AutoRepeat Whether the event was generated by key repeat. + AutoRepeat *bool `json:"auto_repeat,omitempty"` + + // CommandCount Number of editing commands (e.g. `selectAll`) carried by the event. + CommandCount *int `json:"command_count,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // EventType Key event phase: `keyDown`, `keyUp`, `rawKeyDown` or `char`. A value the protocol does not define is reported as `other`. + EventType BrowserCdpKeyEventType `json:"event_type"` + + // IsKeypad Whether the key is on the numeric keypad. + IsKeypad *bool `json:"is_keypad,omitempty"` + + // IsSystemKey Whether the event is a system key event. + IsSystemKey *bool `json:"is_system_key,omitempty"` + + // Location Keyboard location (1=left, 2=right, 3=numpad). + Location *int `json:"location,omitempty"` + Method BrowserCdpInputDispatchKeyEventCommandDataMethod `json:"method"` + + // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). + Modifiers *int `json:"modifiers,omitempty"` + + // NamedKey Key that commands the page rather than typing into it (e.g. `Enter`, `Tab`, `ArrowDown`, `F5`). Keys that produce a character are never captured; those are counted by `text_length`. + NamedKey *string `json:"named_key,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TextLength Number of characters the command submitted. The text itself is never captured. + TextLength *int `json:"text_length,omitempty"` +} + +// BrowserCdpInputDispatchKeyEventCommandDataMethod defines model for BrowserCdpInputDispatchKeyEventCommandData.Method. +type BrowserCdpInputDispatchKeyEventCommandDataMethod string + +// BrowserCdpInputDispatchMouseEventCommandData Sanitized `Input.dispatchMouseEvent` arguments. Canonical input: `Input.dispatchMouseEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputDispatchMouseEventCommandData struct { + // Button Button named by the command (`none`, `left`, `middle`, `right`, `back`, `forward`). A value the protocol does not define is reported as `other`. + Button *BrowserCdpMouseButton `json:"button,omitempty"` + + // Buttons Bit field of buttons held down. Non-zero on a `mouseMoved` means the move is a drag path. + Buttons *int `json:"buttons,omitempty"` + + // ClickCount Number of times the button was clicked (2 is a double click). + ClickCount *int `json:"click_count,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // DeltaX Horizontal scroll delta, for `mouseWheel`. + DeltaX *float64 `json:"delta_x,omitempty"` + + // DeltaY Vertical scroll delta, for `mouseWheel`. + DeltaY *float64 `json:"delta_y,omitempty"` + + // EventType Mouse event phase: `mousePressed`, `mouseReleased`, `mouseMoved` or `mouseWheel`. A value the protocol does not define is reported as `other`. + EventType BrowserCdpMouseEventType `json:"event_type"` + + // Force Normalized pressure, 0 to 1. + Force *float64 `json:"force,omitempty"` + Method BrowserCdpInputDispatchMouseEventCommandDataMethod `json:"method"` + + // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). + Modifiers *int `json:"modifiers,omitempty"` + + // PointerType Pointer that generated the event (`mouse` or `pen`). A value the protocol does not define is reported as `other`. + PointerType *BrowserCdpPointerType `json:"pointer_type,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TangentialPressure Normalized tangential pressure, -1 to 1. + TangentialPressure *float64 `json:"tangential_pressure,omitempty"` + + // TiltX Pen tilt from the Y-Z plane, in degrees. + TiltX *float64 `json:"tilt_x,omitempty"` + + // TiltY Pen tilt from the X-Z plane, in degrees. + TiltY *float64 `json:"tilt_y,omitempty"` + + // Twist Pen clockwise rotation, in degrees. + Twist *int `json:"twist,omitempty"` + + // X Viewport x coordinate in CSS pixels. + X *float64 `json:"x,omitempty"` + + // Y Viewport y coordinate in CSS pixels. + Y *float64 `json:"y,omitempty"` +} + +// BrowserCdpInputDispatchMouseEventCommandDataMethod defines model for BrowserCdpInputDispatchMouseEventCommandData.Method. +type BrowserCdpInputDispatchMouseEventCommandDataMethod string + +// BrowserCdpInputDispatchTouchEventCommandData Sanitized `Input.dispatchTouchEvent` arguments. Canonical input: `Input.dispatchTouchEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputDispatchTouchEventCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // EventType Touch event phase: `touchStart`, `touchEnd`, `touchMove` or `touchCancel`. A value the protocol does not define is reported as `other`. + EventType BrowserCdpTouchEventType `json:"event_type"` + + // Force Normalized pressure of the first touch point, 0 to 1. + Force *float64 `json:"force,omitempty"` + Method BrowserCdpInputDispatchTouchEventCommandDataMethod `json:"method"` + + // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). + Modifiers *int `json:"modifiers,omitempty"` + + // RadiusX Horizontal radius of the first touch point. + RadiusX *float64 `json:"radius_x,omitempty"` + + // RadiusY Vertical radius of the first touch point. + RadiusY *float64 `json:"radius_y,omitempty"` + + // RotationAngle Rotation of the first touch point, in degrees. + RotationAngle *float64 `json:"rotation_angle,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TangentialPressure Normalized tangential pressure of the first touch point, -1 to 1. + TangentialPressure *float64 `json:"tangential_pressure,omitempty"` + + // TiltX Tilt of the first touch point from the Y-Z plane, in degrees. + TiltX *float64 `json:"tilt_x,omitempty"` + + // TiltY Tilt of the first touch point from the X-Z plane, in degrees. + TiltY *float64 `json:"tilt_y,omitempty"` + + // TouchPointCount Number of active touch points the command carried. + TouchPointCount int `json:"touch_point_count"` + + // Twist Clockwise rotation of the first touch point, in degrees. + Twist *int `json:"twist,omitempty"` + + // X Viewport x coordinate of the first touch point. Touch coordinates live inside `touchPoints`, so this is the primary point rather than a command-level argument. + X *float64 `json:"x,omitempty"` + + // Y Viewport y coordinate of the first touch point. + Y *float64 `json:"y,omitempty"` +} + +// BrowserCdpInputDispatchTouchEventCommandDataMethod defines model for BrowserCdpInputDispatchTouchEventCommandData.Method. +type BrowserCdpInputDispatchTouchEventCommandDataMethod string + +// BrowserCdpInputEmulateTouchFromMouseEventCommandData Sanitized `Input.emulateTouchFromMouseEvent` arguments. Canonical input: `Input.emulateTouchFromMouseEvent` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputEmulateTouchFromMouseEventCommandData struct { + // Button Button named by the command. A value the protocol does not define is reported as `other`. + Button *BrowserCdpMouseButton `json:"button,omitempty"` + + // ClickCount Number of times the button was clicked. + ClickCount *int `json:"click_count,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // DeltaX Horizontal scroll delta. + DeltaX *float64 `json:"delta_x,omitempty"` + + // DeltaY Vertical scroll delta. + DeltaY *float64 `json:"delta_y,omitempty"` + + // EventType Mouse event phase being emulated as touch. A value the protocol does not define is reported as `other`. + EventType BrowserCdpMouseEventType `json:"event_type"` + Method BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod `json:"method"` + + // Modifiers Bit field of held modifier keys (1=Alt, 2=Ctrl, 4=Meta, 8=Shift). + Modifiers *int `json:"modifiers,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // X Viewport x coordinate in CSS pixels. + X *float64 `json:"x,omitempty"` + + // Y Viewport y coordinate in CSS pixels. + Y *float64 `json:"y,omitempty"` +} + +// BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod defines model for BrowserCdpInputEmulateTouchFromMouseEventCommandData.Method. +type BrowserCdpInputEmulateTouchFromMouseEventCommandDataMethod string + +// BrowserCdpInputImeSetCompositionCommandData Sanitized `Input.imeSetComposition` arguments. Canonical input: `Input.imeSetComposition` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputImeSetCompositionCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpInputImeSetCompositionCommandDataMethod `json:"method"` + + // ReplacementEnd Replacement range end offset. + ReplacementEnd *int `json:"replacement_end,omitempty"` + + // ReplacementStart Replacement range start offset. + ReplacementStart *int `json:"replacement_start,omitempty"` + + // SelectionEnd Selection end offset within the composition. + SelectionEnd *int `json:"selection_end,omitempty"` + + // SelectionStart Selection start offset within the composition. + SelectionStart *int `json:"selection_start,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TextLength Number of characters in the composition. The text itself is never captured. + TextLength int `json:"text_length"` +} + +// BrowserCdpInputImeSetCompositionCommandDataMethod defines model for BrowserCdpInputImeSetCompositionCommandData.Method. +type BrowserCdpInputImeSetCompositionCommandDataMethod string + +// BrowserCdpInputInsertTextCommandData Sanitized `Input.insertText` arguments. Canonical input: `Input.insertText` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputInsertTextCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpInputInsertTextCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TextLength Number of characters inserted. The text itself is never captured. + TextLength int `json:"text_length"` +} + +// BrowserCdpInputInsertTextCommandDataMethod defines model for BrowserCdpInputInsertTextCommandData.Method. +type BrowserCdpInputInsertTextCommandDataMethod string + +// BrowserCdpInputSynthesizePinchGestureCommandData Sanitized `Input.synthesizePinchGesture` arguments. Canonical input: `Input.synthesizePinchGesture` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputSynthesizePinchGestureCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // GestureSourceType Input source the synthesized gesture emulates. A value the protocol does not define is reported as `other`. + GestureSourceType *BrowserCdpGestureSourceType `json:"gesture_source_type,omitempty"` + Method BrowserCdpInputSynthesizePinchGestureCommandDataMethod `json:"method"` + + // RelativeSpeed Relative pointer speed, in pixels per second. + RelativeSpeed *int `json:"relative_speed,omitempty"` + + // ScaleFactor Relative scale of the pinch (>1 zooms in). + ScaleFactor *float64 `json:"scale_factor,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // X Viewport x coordinate in CSS pixels. + X *float64 `json:"x,omitempty"` + + // Y Viewport y coordinate in CSS pixels. + Y *float64 `json:"y,omitempty"` +} + +// BrowserCdpInputSynthesizePinchGestureCommandDataMethod defines model for BrowserCdpInputSynthesizePinchGestureCommandData.Method. +type BrowserCdpInputSynthesizePinchGestureCommandDataMethod string + +// BrowserCdpInputSynthesizeScrollGestureCommandData Sanitized `Input.synthesizeScrollGesture` arguments. Canonical input: `Input.synthesizeScrollGesture` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputSynthesizeScrollGestureCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // GestureSourceType Input source the synthesized gesture emulates. A value the protocol does not define is reported as `other`. + GestureSourceType *BrowserCdpGestureSourceType `json:"gesture_source_type,omitempty"` + Method BrowserCdpInputSynthesizeScrollGestureCommandDataMethod `json:"method"` + + // PreventFling Whether fling was suppressed. + PreventFling *bool `json:"prevent_fling,omitempty"` + + // RepeatCount Number of additional repeats of the scroll. + RepeatCount *int `json:"repeat_count,omitempty"` + + // RepeatDelayMs Delay between repeats, in milliseconds. + RepeatDelayMs *int `json:"repeat_delay_ms,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // Speed Swipe speed in pixels per second. + Speed *int `json:"speed,omitempty"` + + // X Viewport x coordinate in CSS pixels. + X *float64 `json:"x,omitempty"` + + // XDistance Horizontal scroll distance in CSS pixels; positive scrolls left. + XDistance *float64 `json:"x_distance,omitempty"` + + // XOverscroll Additional horizontal distance scrolled past the end. + XOverscroll *float64 `json:"x_overscroll,omitempty"` + + // Y Viewport y coordinate in CSS pixels. + Y *float64 `json:"y,omitempty"` + + // YDistance Vertical scroll distance in CSS pixels; positive scrolls up. + YDistance *float64 `json:"y_distance,omitempty"` + + // YOverscroll Additional vertical distance scrolled past the end. + YOverscroll *float64 `json:"y_overscroll,omitempty"` +} + +// BrowserCdpInputSynthesizeScrollGestureCommandDataMethod defines model for BrowserCdpInputSynthesizeScrollGestureCommandData.Method. +type BrowserCdpInputSynthesizeScrollGestureCommandDataMethod string + +// BrowserCdpInputSynthesizeTapGestureCommandData Sanitized `Input.synthesizeTapGesture` arguments. Canonical input: `Input.synthesizeTapGesture` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpInputSynthesizeTapGestureCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // Duration Duration between touchdown and touchup, in milliseconds. + Duration *int `json:"duration,omitempty"` + + // GestureSourceType Input source the synthesized gesture emulates. A value the protocol does not define is reported as `other`. + GestureSourceType *BrowserCdpGestureSourceType `json:"gesture_source_type,omitempty"` + Method BrowserCdpInputSynthesizeTapGestureCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TapCount Number of times to tap (2 is a double tap). + TapCount *int `json:"tap_count,omitempty"` + + // X Viewport x coordinate in CSS pixels. + X *float64 `json:"x,omitempty"` + + // Y Viewport y coordinate in CSS pixels. + Y *float64 `json:"y,omitempty"` +} + +// BrowserCdpInputSynthesizeTapGestureCommandDataMethod defines model for BrowserCdpInputSynthesizeTapGestureCommandData.Method. +type BrowserCdpInputSynthesizeTapGestureCommandDataMethod string + +// BrowserCdpKeyEventType Key event phase. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpKeyEventType string + +// BrowserCdpMouseButton Mouse button named by a command. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpMouseButton string + +// BrowserCdpMouseEventType Mouse event phase. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpMouseEventType string + +// BrowserCdpPageBringToFrontCommandData Sanitized `Page.bringToFront` arguments. Canonical input: `Page.bringToFront` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageBringToFrontCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpPageBringToFrontCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageBringToFrontCommandDataMethod defines model for BrowserCdpPageBringToFrontCommandData.Method. +type BrowserCdpPageBringToFrontCommandDataMethod string + +// BrowserCdpPageCaptureScreenshotCommandData Sanitized `Page.captureScreenshot` arguments. Canonical input: `Page.captureScreenshot` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageCaptureScreenshotCommandData struct { + // CaptureBeyondViewport Whether the capture extended past the viewport. + CaptureBeyondViewport *bool `json:"capture_beyond_viewport,omitempty"` + + // ClipHeight Clip region height in CSS pixels. + ClipHeight *float64 `json:"clip_height,omitempty"` + + // ClipScale Clip region page scale factor. + ClipScale *float64 `json:"clip_scale,omitempty"` + + // ClipWidth Clip region width in CSS pixels. + ClipWidth *float64 `json:"clip_width,omitempty"` + + // ClipX Clip region x offset in CSS pixels. + ClipX *float64 `json:"clip_x,omitempty"` + + // ClipY Clip region y offset in CSS pixels. + ClipY *float64 `json:"clip_y,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // Format Image format requested (`jpeg`, `png` or `webp`). A value the protocol does not define is reported as `other`. + Format *BrowserCdpScreenshotFormat `json:"format,omitempty"` + + // FromSurface Whether the capture was taken from the surface rather than the view. + FromSurface *bool `json:"from_surface,omitempty"` + Method BrowserCdpPageCaptureScreenshotCommandDataMethod `json:"method"` + + // OptimizeForSpeed Whether encoding favored speed over size. + OptimizeForSpeed *bool `json:"optimize_for_speed,omitempty"` + + // Quality Compression quality, 0 to 100, for lossy formats. + Quality *int `json:"quality,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageCaptureScreenshotCommandDataMethod defines model for BrowserCdpPageCaptureScreenshotCommandData.Method. +type BrowserCdpPageCaptureScreenshotCommandDataMethod string + +// BrowserCdpPageCaptureSnapshotCommandData Sanitized `Page.captureSnapshot` arguments. Canonical input: `Page.captureSnapshot` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageCaptureSnapshotCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // Format Snapshot format requested (`mhtml`). A value the protocol does not define is reported as `other`. + Format *BrowserCdpSnapshotFormat `json:"format,omitempty"` + Method BrowserCdpPageCaptureSnapshotCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageCaptureSnapshotCommandDataMethod defines model for BrowserCdpPageCaptureSnapshotCommandData.Method. +type BrowserCdpPageCaptureSnapshotCommandDataMethod string + +// BrowserCdpPageCloseCommandData Sanitized `Page.close` arguments. Canonical input: `Page.close` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageCloseCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpPageCloseCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageCloseCommandDataMethod defines model for BrowserCdpPageCloseCommandData.Method. +type BrowserCdpPageCloseCommandDataMethod string + +// BrowserCdpPageHandleJavaScriptDialogCommandData Sanitized `Page.handleJavaScriptDialog` arguments. Canonical input: `Page.handleJavaScriptDialog` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageHandleJavaScriptDialogCommandData struct { + // Accept Whether the dialog was accepted or dismissed. + Accept bool `json:"accept"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpPageHandleJavaScriptDialogCommandDataMethod `json:"method"` + + // PromptTextLength Number of characters entered into a prompt dialog. The text itself is never captured. + PromptTextLength *int `json:"prompt_text_length,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageHandleJavaScriptDialogCommandDataMethod defines model for BrowserCdpPageHandleJavaScriptDialogCommandData.Method. +type BrowserCdpPageHandleJavaScriptDialogCommandDataMethod string + +// BrowserCdpPageNavigateCommandData Sanitized `Page.navigate` arguments. Canonical input: `Page.navigate` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageNavigateCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // FrameId Opaque frame identifier. Clipped to 128 characters; a longer value is not a real identifier. + FrameId *string `json:"frame_id,omitempty"` + Method BrowserCdpPageNavigateCommandDataMethod `json:"method"` + + // ReferrerPolicy Referrer policy named by the command. A value the protocol does not define is reported as `other`. + ReferrerPolicy *BrowserCdpReferrerPolicy `json:"referrer_policy,omitempty"` + + // ReferrerPresent Whether the command carried a referrer. The referrer itself is never captured. + ReferrerPresent *bool `json:"referrer_present,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TransitionType Navigation reason reported by the caller (e.g. `link`, `typed`, `reload`). A value the protocol does not define is reported as `other`. + TransitionType *BrowserCdpTransitionType `json:"transition_type,omitempty"` + + // UrlScheme Scheme of the destination URL (e.g. `https`, `about`, `data`). The rest of the URL is never captured. + UrlScheme *string `json:"url_scheme,omitempty"` +} + +// BrowserCdpPageNavigateCommandDataMethod defines model for BrowserCdpPageNavigateCommandData.Method. +type BrowserCdpPageNavigateCommandDataMethod string + +// BrowserCdpPageNavigateToHistoryEntryCommandData Sanitized `Page.navigateToHistoryEntry` arguments. Canonical input: `Page.navigateToHistoryEntry` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageNavigateToHistoryEntryCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // EntryId History entry the command navigated to. + EntryId int `json:"entry_id"` + Method BrowserCdpPageNavigateToHistoryEntryCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageNavigateToHistoryEntryCommandDataMethod defines model for BrowserCdpPageNavigateToHistoryEntryCommandData.Method. +type BrowserCdpPageNavigateToHistoryEntryCommandDataMethod string + +// BrowserCdpPagePrintToPdfCommandData Sanitized `Page.printToPDF` arguments. Canonical input: `Page.printToPDF` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPagePrintToPdfCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // DisplayHeaderFooter Whether a header and footer were rendered. + DisplayHeaderFooter *bool `json:"display_header_footer,omitempty"` + + // FooterTemplatePresent Whether a footer template was supplied. The template itself is never captured. + FooterTemplatePresent *bool `json:"footer_template_present,omitempty"` + + // GenerateDocumentOutline Whether a document outline was embedded. + GenerateDocumentOutline *bool `json:"generate_document_outline,omitempty"` + + // GenerateTaggedPdf Whether a tagged (accessible) PDF was requested. + GenerateTaggedPdf *bool `json:"generate_tagged_pdf,omitempty"` + + // HeaderTemplatePresent Whether a header template was supplied. The template itself is never captured. + HeaderTemplatePresent *bool `json:"header_template_present,omitempty"` + + // Landscape Whether the page was laid out in landscape. + Landscape *bool `json:"landscape,omitempty"` + + // MarginBottom Bottom margin in inches. + MarginBottom *float64 `json:"margin_bottom,omitempty"` + + // MarginLeft Left margin in inches. + MarginLeft *float64 `json:"margin_left,omitempty"` + + // MarginRight Right margin in inches. + MarginRight *float64 `json:"margin_right,omitempty"` + + // MarginTop Top margin in inches. + MarginTop *float64 `json:"margin_top,omitempty"` + Method BrowserCdpPagePrintToPdfCommandDataMethod `json:"method"` + + // PageRangesPresent Whether a page range was supplied. + PageRangesPresent *bool `json:"page_ranges_present,omitempty"` + + // PaperHeight Paper height in inches. + PaperHeight *float64 `json:"paper_height,omitempty"` + + // PaperWidth Paper width in inches. + PaperWidth *float64 `json:"paper_width,omitempty"` + + // PreferCssPageSize Whether the CSS page size was preferred over the paper size. + PreferCssPageSize *bool `json:"prefer_css_page_size,omitempty"` + + // PrintBackground Whether background graphics were printed. + PrintBackground *bool `json:"print_background,omitempty"` + + // Scale Page render scale. + Scale *float64 `json:"scale,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TransferMode How the PDF was returned (`ReturnAsBase64` or `ReturnAsStream`). A value the protocol does not define is reported as `other`. + TransferMode *BrowserCdpPdfTransferMode `json:"transfer_mode,omitempty"` +} + +// BrowserCdpPagePrintToPdfCommandDataMethod defines model for BrowserCdpPagePrintToPdfCommandData.Method. +type BrowserCdpPagePrintToPdfCommandDataMethod string + +// BrowserCdpPageReloadCommandData Sanitized `Page.reload` arguments. Canonical input: `Page.reload` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageReloadCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // IgnoreCache Whether the reload bypassed the cache. + IgnoreCache *bool `json:"ignore_cache,omitempty"` + + // LoaderId Opaque document loader identifier. Clipped to 128 characters; a longer value is not a real identifier. + LoaderId *string `json:"loader_id,omitempty"` + Method BrowserCdpPageReloadCommandDataMethod `json:"method"` + + // ScriptLength Number of characters in the injected script. + ScriptLength *int `json:"script_length,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageReloadCommandDataMethod defines model for BrowserCdpPageReloadCommandData.Method. +type BrowserCdpPageReloadCommandDataMethod string + +// BrowserCdpPageSetWebLifecycleStateCommandData Sanitized `Page.setWebLifecycleState` arguments. Canonical input: `Page.setWebLifecycleState` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageSetWebLifecycleStateCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpPageSetWebLifecycleStateCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // State Lifecycle state applied (`frozen` or `active`). A value the protocol does not define is reported as `other`. + State BrowserCdpWebLifecycleState `json:"state"` +} + +// BrowserCdpPageSetWebLifecycleStateCommandDataMethod defines model for BrowserCdpPageSetWebLifecycleStateCommandData.Method. +type BrowserCdpPageSetWebLifecycleStateCommandDataMethod string + +// BrowserCdpPageStartScreencastCommandData Sanitized `Page.startScreencast` arguments. Canonical input: `Page.startScreencast` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageStartScreencastCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // EveryNthFrame Frame sampling interval. + EveryNthFrame *int `json:"every_nth_frame,omitempty"` + + // Format Frame format requested (`jpeg` or `png`). A value the protocol does not define is reported as `other`. + Format *BrowserCdpScreencastFormat `json:"format,omitempty"` + + // MaxHeight Maximum frame height in pixels. + MaxHeight *int `json:"max_height,omitempty"` + + // MaxWidth Maximum frame width in pixels. + MaxWidth *int `json:"max_width,omitempty"` + Method BrowserCdpPageStartScreencastCommandDataMethod `json:"method"` + + // Quality Compression quality, 0 to 100. + Quality *int `json:"quality,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageStartScreencastCommandDataMethod defines model for BrowserCdpPageStartScreencastCommandData.Method. +type BrowserCdpPageStartScreencastCommandDataMethod string + +// BrowserCdpPageStopLoadingCommandData Sanitized `Page.stopLoading` arguments. Canonical input: `Page.stopLoading` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageStopLoadingCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpPageStopLoadingCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageStopLoadingCommandDataMethod defines model for BrowserCdpPageStopLoadingCommandData.Method. +type BrowserCdpPageStopLoadingCommandDataMethod string + +// BrowserCdpPageStopScreencastCommandData Sanitized `Page.stopScreencast` arguments. Canonical input: `Page.stopScreencast` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpPageStopScreencastCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpPageStopScreencastCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpPageStopScreencastCommandDataMethod defines model for BrowserCdpPageStopScreencastCommandData.Method. +type BrowserCdpPageStopScreencastCommandDataMethod string + +// BrowserCdpPdfTransferMode How a generated PDF is returned. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpPdfTransferMode string + +// BrowserCdpPointerType Pointer that generated an input event. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpPointerType string + +// BrowserCdpReferrerPolicy Referrer policy named by a navigation. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpReferrerPolicy string + +// BrowserCdpScreencastFormat Frame format requested for a screencast. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpScreencastFormat string + +// BrowserCdpScreenshotFormat Image format requested for a screenshot. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpScreenshotFormat string + +// BrowserCdpSnapshotFormat Format requested for a page snapshot. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpSnapshotFormat string + +// BrowserCdpTargetActivateTargetCommandData Sanitized `Target.activateTarget` arguments. Canonical input: `Target.activateTarget` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpTargetActivateTargetCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpTargetActivateTargetCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TargetId Opaque target identifier. Clipped to 128 characters; a longer value is not a real identifier. + TargetId string `json:"target_id"` +} + +// BrowserCdpTargetActivateTargetCommandDataMethod defines model for BrowserCdpTargetActivateTargetCommandData.Method. +type BrowserCdpTargetActivateTargetCommandDataMethod string + +// BrowserCdpTargetCloseTargetCommandData Sanitized `Target.closeTarget` arguments. Canonical input: `Target.closeTarget` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpTargetCloseTargetCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpTargetCloseTargetCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TargetId Opaque target identifier. Clipped to 128 characters; a longer value is not a real identifier. + TargetId string `json:"target_id"` +} + +// BrowserCdpTargetCloseTargetCommandDataMethod defines model for BrowserCdpTargetCloseTargetCommandData.Method. +type BrowserCdpTargetCloseTargetCommandDataMethod string + +// BrowserCdpTargetCreateBrowserContextCommandData Sanitized `Target.createBrowserContext` arguments. Canonical input: `Target.createBrowserContext` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpTargetCreateBrowserContextCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // DisposeOnDetach Whether the context is disposed when the debugging session detaches. + DisposeOnDetach *bool `json:"dispose_on_detach,omitempty"` + Method BrowserCdpTargetCreateBrowserContextCommandDataMethod `json:"method"` + + // ProxyBypassListPresent Whether a proxy bypass list was configured. + ProxyBypassListPresent *bool `json:"proxy_bypass_list_present,omitempty"` + + // ProxyServerPresent Whether a proxy was configured. The proxy address is never captured. + ProxyServerPresent *bool `json:"proxy_server_present,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // UniversalNetworkAccessOriginCount Number of origins granted universal network access. The origins themselves are never captured. + UniversalNetworkAccessOriginCount *int `json:"universal_network_access_origin_count,omitempty"` +} + +// BrowserCdpTargetCreateBrowserContextCommandDataMethod defines model for BrowserCdpTargetCreateBrowserContextCommandData.Method. +type BrowserCdpTargetCreateBrowserContextCommandDataMethod string + +// BrowserCdpTargetCreateTargetCommandData Sanitized `Target.createTarget` arguments. Canonical input: `Target.createTarget` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpTargetCreateTargetCommandData struct { + // Background Whether the target was created in the background. + Background *bool `json:"background,omitempty"` + + // BrowserContextId Opaque browser context identifier. Clipped to 128 characters; a longer value is not a real identifier. + BrowserContextId *string `json:"browser_context_id,omitempty"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + + // EnableBeginFrameControl Whether BeginFrame control was enabled (headless only). + EnableBeginFrameControl *bool `json:"enable_begin_frame_control,omitempty"` + + // Focus Whether the new target was focused. + Focus *bool `json:"focus,omitempty"` + + // ForTab Whether a tab target rather than a page target was created. + ForTab *bool `json:"for_tab,omitempty"` + + // Height Window height in DIP. + Height *int `json:"height,omitempty"` + + // Hidden Whether the target was created hidden. + Hidden *bool `json:"hidden,omitempty"` + + // Left Window x position in screen coordinates. + Left *int `json:"left,omitempty"` + Method BrowserCdpTargetCreateTargetCommandDataMethod `json:"method"` + + // NewWindow Whether a new window was requested. + NewWindow *bool `json:"new_window,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // Top Window y position in screen coordinates. + Top *int `json:"top,omitempty"` + + // UrlScheme Scheme of the destination URL (e.g. `https`, `about`, `data`). The rest of the URL is never captured. + UrlScheme *string `json:"url_scheme,omitempty"` + + // Width Window width in DIP. + Width *int `json:"width,omitempty"` + + // WindowState Window state requested (`normal`, `minimized`, `maximized`, `fullscreen`). A value the protocol does not define is reported as `other`. + WindowState *BrowserCdpWindowState `json:"window_state,omitempty"` +} + +// BrowserCdpTargetCreateTargetCommandDataMethod defines model for BrowserCdpTargetCreateTargetCommandData.Method. +type BrowserCdpTargetCreateTargetCommandDataMethod string + +// BrowserCdpTargetDisposeBrowserContextCommandData Sanitized `Target.disposeBrowserContext` arguments. Canonical input: `Target.disposeBrowserContext` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpTargetDisposeBrowserContextCommandData struct { + // BrowserContextId Opaque browser context identifier. Clipped to 128 characters; a longer value is not a real identifier. + BrowserContextId string `json:"browser_context_id"` + + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpTargetDisposeBrowserContextCommandDataMethod `json:"method"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` +} + +// BrowserCdpTargetDisposeBrowserContextCommandDataMethod defines model for BrowserCdpTargetDisposeBrowserContextCommandData.Method. +type BrowserCdpTargetDisposeBrowserContextCommandDataMethod string + +// BrowserCdpTargetOpenDevToolsCommandData Sanitized `Target.openDevTools` arguments. Canonical input: `Target.openDevTools` in devtools-protocol@2d019e73, pinned at https://github.com/ChromeDevTools/devtools-protocol/blob/2d019e73eb371d1d6985d26d395d78bd8f8a22ba/json/browser_protocol.json. Every argument of this command has a retained or redacted decision in lib/devtoolsproxy/testdata/cdp_arguments.yaml. +type BrowserCdpTargetOpenDevToolsCommandData struct { + // CommandId The command's JSON-RPC id, so the command can be joined to the result the browser returned for it. Absent when the client sent none. + CommandId *int64 `json:"command_id,omitempty"` + + // ConnectionId Identifies the CDP proxy connection the command arrived on, matching `cdp_connect` and `cdp_disconnect`. Two clients driving the same browser are told apart by this. + ConnectionId *string `json:"connection_id,omitempty"` + Method BrowserCdpTargetOpenDevToolsCommandDataMethod `json:"method"` + + // PanelId DevTools panel opened. Clipped to 128 characters; a longer value is not a real identifier. + PanelId *string `json:"panel_id,omitempty"` + + // SessionId CDP session identifier the command was addressed to. Absent for browser-level commands. Clipped to 128 characters. + SessionId *string `json:"session_id,omitempty"` + + // TargetId Opaque target identifier. Clipped to 128 characters; a longer value is not a real identifier. + TargetId string `json:"target_id"` +} + +// BrowserCdpTargetOpenDevToolsCommandDataMethod defines model for BrowserCdpTargetOpenDevToolsCommandData.Method. +type BrowserCdpTargetOpenDevToolsCommandDataMethod string + +// BrowserCdpTouchEventType Touch event phase. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpTouchEventType string + +// BrowserCdpTransitionType Navigation reason reported by the caller. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpTransitionType string + +// BrowserCdpWebLifecycleState Page lifecycle state applied. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpWebLifecycleState string + +// BrowserCdpWindowState Browser window state requested. Canonical values from devtools-protocol@2d019e73. `other` stands for a value outside that set, so a client cannot put an arbitrary string into the stream. +type BrowserCdpWindowState string + +// BrowserConsoleErrorEvent A browser console error or uncaught JavaScript exception event. Emitted from two distinct CDP sources with different data shapes. Runtime.consoleAPICalled (console.error calls) produces level, text, args, and stack_trace. Runtime.exceptionThrown (uncaught exceptions) produces text, line, column, source_url, and stack_trace. Fields not applicable to the source are absent. +type BrowserConsoleErrorEvent struct { + Category BrowserConsoleErrorEventCategory `json:"category"` + Data *BrowserConsoleErrorEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserConsoleErrorEventType `json:"type"` +} + +// BrowserConsoleErrorEventCategory defines model for BrowserConsoleErrorEvent.Category. +type BrowserConsoleErrorEventCategory string + +// BrowserConsoleErrorEventType defines model for BrowserConsoleErrorEvent.Type. +type BrowserConsoleErrorEventType string + +// BrowserConsoleErrorEventData defines model for BrowserConsoleErrorEventData. +type BrowserConsoleErrorEventData struct { + // Args All console arguments coerced to strings. Present only when sourced from Runtime.consoleAPICalled. + Args *[]string `json:"args,omitempty"` + + // Column Column number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown. + Column *int `json:"column,omitempty"` + + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` + + // Level CDP console type value, always "error". Present only when sourced from Runtime.consoleAPICalled. + Level *string `json:"level,omitempty"` + + // Line Line number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown. + Line *int `json:"line,omitempty"` + + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` + + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` + + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` + + // SourceUrl URL of the script file that threw the exception. Present only when sourced from Runtime.exceptionThrown. + SourceUrl *string `json:"source_url,omitempty"` + + // StackTrace CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. + StackTrace *BrowserCallStack `json:"stack_trace,omitempty"` + + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // Text Human-readable error text, as the browser console would display it. For console.error() calls, the first argument coerced to a string. For uncaught exceptions, the prefix and error message, e.g. "Uncaught Error: boom" or "Uncaught (in promise) TypeError: x is not a function". + Text string `json:"text"` + + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` +} + +// BrowserConsoleLogEvent A browser console log event (console.log, console.info, console.warn, etc.). +type BrowserConsoleLogEvent struct { + Category BrowserConsoleLogEventCategory `json:"category"` + Data *BrowserConsoleLogEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserConsoleLogEventType `json:"type"` +} + +// BrowserConsoleLogEventCategory defines model for BrowserConsoleLogEvent.Category. +type BrowserConsoleLogEventCategory string + +// BrowserConsoleLogEventType defines model for BrowserConsoleLogEvent.Type. +type BrowserConsoleLogEventType string + +// BrowserConsoleLogEventData defines model for BrowserConsoleLogEventData. +type BrowserConsoleLogEventData struct { + // Args All console arguments coerced to strings. + Args *[]string `json:"args,omitempty"` + + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` + + // Level CDP Runtime.consoleAPICalled type, passed through unfiltered from Chrome. `error` is routed to console_error events instead; all other CDP console types appear here. See CDP spec for the full enum. + Level string `json:"level"` + + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` + + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` + + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` + + // StackTrace CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. + StackTrace *BrowserCallStack `json:"stack_trace,omitempty"` + + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // Text First console argument coerced to string. + Text string `json:"text"` + + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` +} + +// BrowserEventContext Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. +type BrowserEventContext struct { + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` + + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` + + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` + + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` + + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` +} + +// BrowserEventSource Provenance metadata identifying which producer emitted the event. +type BrowserEventSource struct { + // Event Producer-specific event name (e.g. `Runtime.consoleAPICalled` for CDP-sourced console events). + Event *string `json:"event,omitempty"` + + // Kind Event producer. `cdp`: Chrome DevTools Protocol events from the browser. `kernel_api`: Kernel API server (reserved for server-generated events). `extension`: injected Chrome extension. `local_process`: system process running alongside the browser. + Kind BrowserEventSourceKind `json:"kind"` + + // Metadata Producer-specific context (e.g. CDP target/session/frame IDs). + Metadata *map[string]string `json:"metadata,omitempty"` +} + +// BrowserEventSourceKind Event producer. `cdp`: Chrome DevTools Protocol events from the browser. `kernel_api`: Kernel API server (reserved for server-generated events). `extension`: injected Chrome extension. `local_process`: system process running alongside the browser. +type BrowserEventSourceKind string + +// BrowserHttpHeaders HTTP headers map forwarded as-is from CDP without normalization. Values are typically strings but may be any JSON type. +type BrowserHttpHeaders map[string]interface{} + +// BrowserInteractionClickEvent A browser user click event captured via injected page script. +type BrowserInteractionClickEvent struct { + Category BrowserInteractionClickEventCategory `json:"category"` + Data *BrowserInteractionClickEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserInteractionClickEventType `json:"type"` +} + +// BrowserInteractionClickEventCategory defines model for BrowserInteractionClickEvent.Category. +type BrowserInteractionClickEventCategory string + +// BrowserInteractionClickEventType defines model for BrowserInteractionClickEvent.Type. +type BrowserInteractionClickEventType string + +// BrowserInteractionClickEventData defines model for BrowserInteractionClickEventData. +type BrowserInteractionClickEventData struct { + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` + + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` + + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` + + // Selector CSS selector path to the clicked element. + Selector string `json:"selector"` + + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` + + // Tag HTML tag name of the clicked element in uppercase (e.g. BUTTON, A, DIV). + Tag string `json:"tag"` + + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // Text Visible text content of the clicked element, trimmed. + Text *string `json:"text,omitempty"` + + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` + + // X Viewport x-coordinate of the click in CSS pixels. + X int `json:"x"` + + // Y Viewport y-coordinate of the click in CSS pixels. + Y int `json:"y"` +} + +// BrowserInteractionKeyEvent A browser keyboard event captured via injected page script. +type BrowserInteractionKeyEvent struct { + Category BrowserInteractionKeyEventCategory `json:"category"` + Data *BrowserInteractionKeyEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserInteractionKeyEventType `json:"type"` +} + +// BrowserInteractionKeyEventCategory defines model for BrowserInteractionKeyEvent.Category. +type BrowserInteractionKeyEventCategory string + +// BrowserInteractionKeyEventType defines model for BrowserInteractionKeyEvent.Type. +type BrowserInteractionKeyEventType string + +// BrowserInteractionKeyEventData defines model for BrowserInteractionKeyEventData. +type BrowserInteractionKeyEventData struct { + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` + + // Key Key value from the KeyboardEvent (e.g. Enter, Backspace, a). + Key string `json:"key"` + + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` + + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` + + // Selector CSS selector path to the element that had focus when the key was pressed. + Selector string `json:"selector"` + + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` + + // Tag HTML tag name of the focused element in uppercase (e.g. INPUT, TEXTAREA, DIV). + Tag string `json:"tag"` + + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` +} + +// BrowserInteractionScrollSettledEvent A browser scroll settled event emitted after scroll position stops changing, captured via injected page script. +type BrowserInteractionScrollSettledEvent struct { + Category BrowserInteractionScrollSettledEventCategory `json:"category"` + Data *BrowserInteractionScrollSettledEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserInteractionScrollSettledEventType `json:"type"` +} - // Parent Parent stack trace for async stacks. - Parent *BrowserCallStack `json:"parent,omitempty"` +// BrowserInteractionScrollSettledEventCategory defines model for BrowserInteractionScrollSettledEvent.Category. +type BrowserInteractionScrollSettledEventCategory string + +// BrowserInteractionScrollSettledEventType defines model for BrowserInteractionScrollSettledEvent.Type. +type BrowserInteractionScrollSettledEventType string + +// BrowserInteractionScrollSettledEventData defines model for BrowserInteractionScrollSettledEventData. +type BrowserInteractionScrollSettledEventData struct { + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` + + // FromX Scroll x-position at the start of the scroll gesture in CSS pixels. + FromX int `json:"from_x"` + + // FromY Scroll y-position at the start of the scroll gesture in CSS pixels. + FromY int `json:"from_y"` + + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` + + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` + + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` + + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` + + // TargetSelector CSS selector path to the scrolled element. + TargetSelector string `json:"target_selector"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // ToX Final scroll x-position after the gesture settled in CSS pixels. + ToX int `json:"to_x"` + + // ToY Final scroll y-position after the gesture settled in CSS pixels. + ToY int `json:"to_y"` + + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// BrowserCaptchaSolveResultEvent A captcha solve attempt reached a terminal outcome. -type BrowserCaptchaSolveResultEvent struct { - Category BrowserCaptchaSolveResultEventCategory `json:"category"` +// BrowserLiveViewConnectEvent A live view client connected to the headful browser's WebRTC server (Neko). Headful only; not emitted for headless images. +type BrowserLiveViewConnectEvent struct { + Category BrowserLiveViewConnectEventCategory `json:"category"` - // Data Per-attempt payload for `captcha_solve_result` events. - Data *BrowserCaptchaSolveResultEventData `json:"data,omitempty"` + // Data Per-session payload for `live_view_connect` events. + Data *BrowserLiveViewConnectEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -1705,49 +4658,90 @@ type BrowserCaptchaSolveResultEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserCaptchaSolveResultEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserLiveViewConnectEventType `json:"type"` } -// BrowserCaptchaSolveResultEventCategory defines model for BrowserCaptchaSolveResultEvent.Category. -type BrowserCaptchaSolveResultEventCategory string +// BrowserLiveViewConnectEventCategory defines model for BrowserLiveViewConnectEvent.Category. +type BrowserLiveViewConnectEventCategory string -// BrowserCaptchaSolveResultEventType defines model for BrowserCaptchaSolveResultEvent.Type. -type BrowserCaptchaSolveResultEventType string +// BrowserLiveViewConnectEventType defines model for BrowserLiveViewConnectEvent.Type. +type BrowserLiveViewConnectEventType string -// BrowserCaptchaSolveResultEventData Per-attempt payload for `captcha_solve_result` events. -type BrowserCaptchaSolveResultEventData struct { - // CaptchaType Captcha vendor family. Producers normalize provider-specific task names into this set: enterprise variants of recaptcha collapse into their version bucket (v2 / v3), and anything not covered (e.g. DataDome, MtCaptcha, plain OCR) is reported as `other`. - CaptchaType BrowserCaptchaSolveResultEventDataCaptchaType `json:"captcha_type"` +// BrowserLiveViewConnectEventData Per-session payload for `live_view_connect` events. +type BrowserLiveViewConnectEventData struct { + // SessionId Live view session identifier. Stable across reconnects, so a transient network blip can emit two events with the same `session_id`. + SessionId string `json:"session_id"` +} - // DurationMs Wall-clock duration from solve start to terminal outcome. +// BrowserLiveViewDisconnectEvent A live view client disconnected from the headful browser's WebRTC server (Neko). Pair with `live_view_connect` by `session_id`. +type BrowserLiveViewDisconnectEvent struct { + Category BrowserLiveViewDisconnectEventCategory `json:"category"` + + // Data Per-session payload for `live_view_disconnect` events. + Data *BrowserLiveViewDisconnectEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserLiveViewDisconnectEventType `json:"type"` +} + +// BrowserLiveViewDisconnectEventCategory defines model for BrowserLiveViewDisconnectEvent.Category. +type BrowserLiveViewDisconnectEventCategory string + +// BrowserLiveViewDisconnectEventType defines model for BrowserLiveViewDisconnectEvent.Type. +type BrowserLiveViewDisconnectEventType string + +// BrowserLiveViewDisconnectEventData Per-session payload for `live_view_disconnect` events. +type BrowserLiveViewDisconnectEventData struct { + // DurationMs Wall-clock duration of the connection in milliseconds. DurationMs float32 `json:"duration_ms"` - // ErrorCode Solver-specific error code on failure (e.g. `ERROR_CAPTCHA_UNSOLVABLE`). Absent on success. - ErrorCode *string `json:"error_code,omitempty"` + // SessionId Live view session identifier; matches the corresponding `live_view_connect` event. + SessionId string `json:"session_id"` +} - // Status Terminal outcome. `success`: solver returned a usable solution. `failure`: solver returned an error (see `error_code`). `timeout`: solver did not return within the caller's wait budget. `abandoned`: caller cancelled or the page navigated away mid-solve. - Status BrowserCaptchaSolveResultEventDataStatus `json:"status"` +// BrowserMonitorDisconnectedEvent The CDP connection to Chrome was lost. Telemetry events may be dropped until monitor_reconnected arrives. Treat any in-progress computed state (network_idle, page_layout_settled) as unreliable until then. +type BrowserMonitorDisconnectedEvent struct { + Category BrowserMonitorDisconnectedEventCategory `json:"category"` + Data *BrowserMonitorDisconnectedEventData `json:"data,omitempty"` - // TaskId Solver-assigned identifier. Opaque, useful for support cross-references. - TaskId *string `json:"task_id,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // WebsiteHost Host of the page where the captcha was solved. - WebsiteHost *string `json:"website_host,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` - // WebsitePath Path of the page where the captcha was solved. Query string excluded. - WebsitePath *string `json:"website_path,omitempty"` + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserMonitorDisconnectedEventType `json:"type"` } -// BrowserCaptchaSolveResultEventDataCaptchaType Captcha vendor family. Producers normalize provider-specific task names into this set: enterprise variants of recaptcha collapse into their version bucket (v2 / v3), and anything not covered (e.g. DataDome, MtCaptcha, plain OCR) is reported as `other`. -type BrowserCaptchaSolveResultEventDataCaptchaType string +// BrowserMonitorDisconnectedEventCategory defines model for BrowserMonitorDisconnectedEvent.Category. +type BrowserMonitorDisconnectedEventCategory string -// BrowserCaptchaSolveResultEventDataStatus Terminal outcome. `success`: solver returned a usable solution. `failure`: solver returned an error (see `error_code`). `timeout`: solver did not return within the caller's wait budget. `abandoned`: caller cancelled or the page navigated away mid-solve. -type BrowserCaptchaSolveResultEventDataStatus string +// BrowserMonitorDisconnectedEventType defines model for BrowserMonitorDisconnectedEvent.Type. +type BrowserMonitorDisconnectedEventType string -// BrowserCdpConnectEvent An external client (e.g. customer SDK, Playwright, Puppeteer) connected to the CDP WebSocket proxy on this VM. -type BrowserCdpConnectEvent struct { - Category BrowserCdpConnectEventCategory `json:"category"` +// BrowserMonitorDisconnectedEventData defines model for BrowserMonitorDisconnectedEventData. +type BrowserMonitorDisconnectedEventData struct { + // Reason Reason for the disconnection. chrome_restarted: Chrome process restarted. + Reason BrowserMonitorDisconnectedEventDataReason `json:"reason"` +} + +// BrowserMonitorDisconnectedEventDataReason Reason for the disconnection. chrome_restarted: Chrome process restarted. +type BrowserMonitorDisconnectedEventDataReason string + +// BrowserMonitorInitFailedEvent The CDP session could not be initialized. +type BrowserMonitorInitFailedEvent struct { + Category BrowserMonitorInitFailedEventCategory `json:"category"` + Data *BrowserMonitorInitFailedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -1756,22 +4750,115 @@ type BrowserCdpConnectEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserCdpConnectEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserMonitorInitFailedEventType `json:"type"` } -// BrowserCdpConnectEventCategory defines model for BrowserCdpConnectEvent.Category. -type BrowserCdpConnectEventCategory string +// BrowserMonitorInitFailedEventCategory defines model for BrowserMonitorInitFailedEvent.Category. +type BrowserMonitorInitFailedEventCategory string + +// BrowserMonitorInitFailedEventType defines model for BrowserMonitorInitFailedEvent.Type. +type BrowserMonitorInitFailedEventType string + +// BrowserMonitorInitFailedEventData defines model for BrowserMonitorInitFailedEventData. +type BrowserMonitorInitFailedEventData struct { + // Step The CDP method or initialization step that failed (e.g. Target.setAutoAttach). + Step string `json:"step"` +} + +// BrowserMonitorReconnectFailedEvent The CDP connection to Chrome could not be re-established after exhausting all reconnection attempts. No further telemetry events will arrive on this session. +type BrowserMonitorReconnectFailedEvent struct { + Category BrowserMonitorReconnectFailedEventCategory `json:"category"` + Data *BrowserMonitorReconnectFailedEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserMonitorReconnectFailedEventType `json:"type"` +} + +// BrowserMonitorReconnectFailedEventCategory defines model for BrowserMonitorReconnectFailedEvent.Category. +type BrowserMonitorReconnectFailedEventCategory string + +// BrowserMonitorReconnectFailedEventType defines model for BrowserMonitorReconnectFailedEvent.Type. +type BrowserMonitorReconnectFailedEventType string + +// BrowserMonitorReconnectFailedEventData defines model for BrowserMonitorReconnectFailedEventData. +type BrowserMonitorReconnectFailedEventData struct { + // Reason Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection. + Reason BrowserMonitorReconnectFailedEventDataReason `json:"reason"` +} + +// BrowserMonitorReconnectFailedEventDataReason Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection. +type BrowserMonitorReconnectFailedEventDataReason string + +// BrowserMonitorReconnectedEvent The CDP connection to Chrome was successfully re-established after a disconnection. Events emitted during the gap are lost. Computed state is reset, so navigation and network tracking restart fresh from this point. +type BrowserMonitorReconnectedEvent struct { + Category BrowserMonitorReconnectedEventCategory `json:"category"` + Data *BrowserMonitorReconnectedEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserMonitorReconnectedEventType `json:"type"` +} + +// BrowserMonitorReconnectedEventCategory defines model for BrowserMonitorReconnectedEvent.Category. +type BrowserMonitorReconnectedEventCategory string + +// BrowserMonitorReconnectedEventType defines model for BrowserMonitorReconnectedEvent.Type. +type BrowserMonitorReconnectedEventType string + +// BrowserMonitorReconnectedEventData defines model for BrowserMonitorReconnectedEventData. +type BrowserMonitorReconnectedEventData struct { + // ReconnectDurationMs Wall-clock time in milliseconds taken to reconnect after the disconnection. + ReconnectDurationMs int64 `json:"reconnect_duration_ms"` +} + +// BrowserMonitorScreenshotEvent A periodic screenshot of the browser viewport. +type BrowserMonitorScreenshotEvent struct { + Category BrowserMonitorScreenshotEventCategory `json:"category"` + Data *BrowserMonitorScreenshotEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserMonitorScreenshotEventType `json:"type"` +} + +// BrowserMonitorScreenshotEventCategory defines model for BrowserMonitorScreenshotEvent.Category. +type BrowserMonitorScreenshotEventCategory string + +// BrowserMonitorScreenshotEventType defines model for BrowserMonitorScreenshotEvent.Type. +type BrowserMonitorScreenshotEventType string -// BrowserCdpConnectEventType defines model for BrowserCdpConnectEvent.Type. -type BrowserCdpConnectEventType string +// BrowserMonitorScreenshotEventData defines model for BrowserMonitorScreenshotEventData. +type BrowserMonitorScreenshotEventData struct { + // Png Base64-encoded PNG screenshot of the browser viewport. + Png []byte `json:"png"` +} -// BrowserCdpDisconnectEvent An external client disconnected from the CDP WebSocket proxy on this VM. Pair with the immediately preceding `cdp_connect` on the same stream. -type BrowserCdpDisconnectEvent struct { - Category BrowserCdpDisconnectEventCategory `json:"category"` +// BrowserNetworkIdleEvent A browser network idle event emitted after a 500ms quiet period with no in-flight HTTP requests. +type BrowserNetworkIdleEvent struct { + Category BrowserNetworkIdleEventCategory `json:"category"` - // Data Per-disconnect payload for `cdp_disconnect` events. - Data *BrowserCdpDisconnectEventData `json:"data,omitempty"` + // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. + Data *BrowserEventContext `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -1780,35 +4867,20 @@ type BrowserCdpDisconnectEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserCdpDisconnectEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserNetworkIdleEventType `json:"type"` } -// BrowserCdpDisconnectEventCategory defines model for BrowserCdpDisconnectEvent.Category. -type BrowserCdpDisconnectEventCategory string - -// BrowserCdpDisconnectEventType defines model for BrowserCdpDisconnectEvent.Type. -type BrowserCdpDisconnectEventType string - -// BrowserCdpDisconnectEventData Per-disconnect payload for `cdp_disconnect` events. -type BrowserCdpDisconnectEventData struct { - // DurationMs Wall-clock duration of the connection in milliseconds. - DurationMs float32 `json:"duration_ms"` - - // MessageCount Number of CDP messages relayed across the connection in either direction. - MessageCount int `json:"message_count"` - - // Reason Why the connection ended. `client_close`: the client initiated the close. `upstream_changed`: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. `upstream_error`: upstream dial or message pump errored. `context_cancelled`: the request context was cancelled (typically server shutdown). - Reason BrowserCdpDisconnectEventDataReason `json:"reason"` -} +// BrowserNetworkIdleEventCategory defines model for BrowserNetworkIdleEvent.Category. +type BrowserNetworkIdleEventCategory string -// BrowserCdpDisconnectEventDataReason Why the connection ended. `client_close`: the client initiated the close. `upstream_changed`: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. `upstream_error`: upstream dial or message pump errored. `context_cancelled`: the request context was cancelled (typically server shutdown). -type BrowserCdpDisconnectEventDataReason string +// BrowserNetworkIdleEventType defines model for BrowserNetworkIdleEvent.Type. +type BrowserNetworkIdleEventType string -// BrowserConsoleErrorEvent A browser console error or uncaught JavaScript exception event. Emitted from two distinct CDP sources with different data shapes. Runtime.consoleAPICalled (console.error calls) produces level, text, args, and stack_trace. Runtime.exceptionThrown (uncaught exceptions) produces text, line, column, source_url, and stack_trace. Fields not applicable to the source are absent. -type BrowserConsoleErrorEvent struct { - Category BrowserConsoleErrorEventCategory `json:"category"` - Data *BrowserConsoleErrorEventData `json:"data,omitempty"` +// BrowserNetworkLoadingFailedEvent A browser network loading failed event. If the request was already in flight when CDP attached (no prior `network_request` was emitted for it), `url`, `frame_id`, `loader_id`, and `resource_type` are absent; `BrowserEventContext` is partially populated in that case. +type BrowserNetworkLoadingFailedEvent struct { + Category BrowserNetworkLoadingFailedEventCategory `json:"category"` + Data *BrowserNetworkLoadingFailedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -1817,47 +4889,41 @@ type BrowserConsoleErrorEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserConsoleErrorEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserNetworkLoadingFailedEventType `json:"type"` } -// BrowserConsoleErrorEventCategory defines model for BrowserConsoleErrorEvent.Category. -type BrowserConsoleErrorEventCategory string +// BrowserNetworkLoadingFailedEventCategory defines model for BrowserNetworkLoadingFailedEvent.Category. +type BrowserNetworkLoadingFailedEventCategory string -// BrowserConsoleErrorEventType defines model for BrowserConsoleErrorEvent.Type. -type BrowserConsoleErrorEventType string +// BrowserNetworkLoadingFailedEventType defines model for BrowserNetworkLoadingFailedEvent.Type. +type BrowserNetworkLoadingFailedEventType string -// BrowserConsoleErrorEventData defines model for BrowserConsoleErrorEventData. -type BrowserConsoleErrorEventData struct { - // Args All console arguments coerced to strings. Present only when sourced from Runtime.consoleAPICalled. - Args *[]string `json:"args,omitempty"` +// BrowserNetworkLoadingFailedEventData defines model for BrowserNetworkLoadingFailedEventData. +type BrowserNetworkLoadingFailedEventData struct { + // Canceled True if the request was canceled by the browser or page script. + Canceled bool `json:"canceled"` - // Column Column number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown. - Column *int `json:"column,omitempty"` + // ErrorText Network error description (e.g. net::ERR_CONNECTION_REFUSED). + ErrorText string `json:"error_text"` // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` - // Level CDP console type value, always "error". Present only when sourced from Runtime.consoleAPICalled. - Level *string `json:"level,omitempty"` - - // Line Line number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown. - Line *int `json:"line,omitempty"` - // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` + // RequestId CDP request identifier matching the originating network_request event. + RequestId string `json:"request_id"` - // SourceUrl URL of the script file that threw the exception. Present only when sourced from Runtime.exceptionThrown. - SourceUrl *string `json:"source_url,omitempty"` + // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. + ResourceType *string `json:"resource_type,omitempty"` - // StackTrace CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. - StackTrace *BrowserCallStack `json:"stack_trace,omitempty"` + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` @@ -1865,17 +4931,14 @@ type BrowserConsoleErrorEventData struct { // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` - // Text Human-readable error text, as the browser console would display it. For console.error() calls, the first argument coerced to a string. For uncaught exceptions, the prefix and error message, e.g. "Uncaught Error: boom" or "Uncaught (in promise) TypeError: x is not a function". - Text string `json:"text"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. Url *string `json:"url,omitempty"` } -// BrowserConsoleLogEvent A browser console log event (console.log, console.info, console.warn, etc.). -type BrowserConsoleLogEvent struct { - Category BrowserConsoleLogEventCategory `json:"category"` - Data *BrowserConsoleLogEventData `json:"data,omitempty"` +// BrowserNetworkRequestEvent A browser network request sent event. +type BrowserNetworkRequestEvent struct { + Category BrowserNetworkRequestEventCategory `json:"category"` + Data *BrowserNetworkRequestEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -1884,66 +4947,127 @@ type BrowserConsoleLogEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserConsoleLogEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserNetworkRequestEventType `json:"type"` } -// BrowserConsoleLogEventCategory defines model for BrowserConsoleLogEvent.Category. -type BrowserConsoleLogEventCategory string +// BrowserNetworkRequestEventCategory defines model for BrowserNetworkRequestEvent.Category. +type BrowserNetworkRequestEventCategory string -// BrowserConsoleLogEventType defines model for BrowserConsoleLogEvent.Type. -type BrowserConsoleLogEventType string +// BrowserNetworkRequestEventType defines model for BrowserNetworkRequestEvent.Type. +type BrowserNetworkRequestEventType string -// BrowserConsoleLogEventData defines model for BrowserConsoleLogEventData. -type BrowserConsoleLogEventData struct { - // Args All console arguments coerced to strings. - Args *[]string `json:"args,omitempty"` +// BrowserNetworkRequestEventData defines model for BrowserNetworkRequestEventData. +type BrowserNetworkRequestEventData struct { + // DocumentUrl URL of the document that initiated the request. + DocumentUrl string `json:"document_url"` // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` - // Level CDP Runtime.consoleAPICalled type, passed through unfiltered from Chrome. `error` is routed to console_error events instead; all other CDP console types appear here. See CDP spec for the full enum. - Level string `json:"level"` + // Headers Request headers. + Headers BrowserHttpHeaders `json:"headers"` + + // InitiatorType CDP Initiator.type indicating what caused the request, passed through as-is from Chrome. Known values include script, parser, preload, and other. + InitiatorType string `json:"initiator_type"` + + // IsRedirect True if this request is the result of a redirect. + IsRedirect *bool `json:"is_redirect,omitempty"` // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` + // Method HTTP method as sent on the wire (e.g. GET, POST). + Method string `json:"method"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` + // PostData Request body for POST/PUT requests, if available. + PostData *string `json:"post_data,omitempty"` + + // RedirectUrl Original URL before the redirect, present when is_redirect is true. + RedirectUrl *string `json:"redirect_url,omitempty"` + + // RequestId CDP request identifier, unique within the session. + RequestId string `json:"request_id"` + + // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. + ResourceType *string `json:"resource_type,omitempty"` + // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` - // StackTrace CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format. - StackTrace *BrowserCallStack `json:"stack_trace,omitempty"` - // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` - // Text First console argument coerced to string. - Text string `json:"text"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. Url *string `json:"url,omitempty"` } -// BrowserEventContext Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. -type BrowserEventContext struct { +// BrowserNetworkResponseEvent A browser network response received event. Fired after the response body is fully received, not when headers arrive. +type BrowserNetworkResponseEvent struct { + Category BrowserNetworkResponseEventCategory `json:"category"` + Data *BrowserNetworkResponseEventData `json:"data,omitempty"` + + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` + + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserNetworkResponseEventType `json:"type"` +} + +// BrowserNetworkResponseEventCategory defines model for BrowserNetworkResponseEvent.Category. +type BrowserNetworkResponseEventCategory string + +// BrowserNetworkResponseEventType defines model for BrowserNetworkResponseEvent.Type. +type BrowserNetworkResponseEventType string + +// BrowserNetworkResponseEventData defines model for BrowserNetworkResponseEventData. +type BrowserNetworkResponseEventData struct { + // Body Truncated response body, present only for text MIME types. + Body *string `json:"body,omitempty"` + // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` + // Headers Response headers. + Headers BrowserHttpHeaders `json:"headers"` + // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` + // Method HTTP method of the original request. + Method string `json:"method"` + + // MimeType MIME type of the response (e.g. text/html, application/json). + MimeType *string `json:"mime_type,omitempty"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` + // RequestId CDP request identifier matching the originating network_request event. + RequestId string `json:"request_id"` + + // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. + ResourceType *string `json:"resource_type,omitempty"` + // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` + // Status HTTP response status code. + Status int `json:"status"` + + // StatusText HTTP response status text (e.g. OK, Not Found). + StatusText *string `json:"status_text,omitempty"` + // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` @@ -1954,28 +5078,44 @@ type BrowserEventContext struct { Url *string `json:"url,omitempty"` } -// BrowserEventSource Provenance metadata identifying which producer emitted the event. -type BrowserEventSource struct { - // Event Producer-specific event name (e.g. `Runtime.consoleAPICalled` for CDP-sourced console events). - Event *string `json:"event,omitempty"` +// BrowserPageCrashedEvent A page's renderer process crashed (an "Aw, Snap!" failure) while the browser process itself stayed alive. Reported on the crashed page's session, with the session and target ids on `source.metadata`. Captured only while the `page` category is enabled. +type BrowserPageCrashedEvent struct { + Category BrowserPageCrashedEventCategory `json:"category"` + Data *BrowserPageCrashedEventData `json:"data,omitempty"` - // Kind Event producer. `cdp`: Chrome DevTools Protocol events from the browser. `kernel_api`: Kernel API server (reserved for server-generated events). `extension`: injected Chrome extension. `local_process`: system process running alongside the browser. - Kind BrowserEventSourceKind `json:"kind"` + // Source Provenance metadata identifying which producer emitted the event. + Source BrowserEventSource `json:"source"` - // Metadata Producer-specific context (e.g. CDP target/session/frame IDs). - Metadata *map[string]string `json:"metadata,omitempty"` + // Truncated True if the data field was truncated due to size limits. + Truncated *bool `json:"truncated,omitempty"` + + // Ts Event timestamp in Unix microseconds. + Ts int64 `json:"ts"` + Type BrowserPageCrashedEventType `json:"type"` } -// BrowserEventSourceKind Event producer. `cdp`: Chrome DevTools Protocol events from the browser. `kernel_api`: Kernel API server (reserved for server-generated events). `extension`: injected Chrome extension. `local_process`: system process running alongside the browser. -type BrowserEventSourceKind string +// BrowserPageCrashedEventCategory defines model for BrowserPageCrashedEvent.Category. +type BrowserPageCrashedEventCategory string -// BrowserHttpHeaders HTTP headers map forwarded as-is from CDP without normalization. Values are typically strings but may be any JSON type. -type BrowserHttpHeaders map[string]interface{} +// BrowserPageCrashedEventType defines model for BrowserPageCrashedEvent.Type. +type BrowserPageCrashedEventType string -// BrowserInteractionClickEvent A browser user click event captured via injected page script. -type BrowserInteractionClickEvent struct { - Category BrowserInteractionClickEventCategory `json:"category"` - Data *BrowserInteractionClickEventData `json:"data,omitempty"` +// BrowserPageCrashedEventData defines model for BrowserPageCrashedEventData. +type BrowserPageCrashedEventData struct { + // TargetId CDP target identifier of the crashed page. + TargetId string `json:"target_id"` + + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` + + // Url URL the page was on when its renderer process crashed. + Url string `json:"url"` +} + +// BrowserPageDomContentLoadedEvent A browser DOMContentLoaded event (CDP Page.domContentEventFired). +type BrowserPageDomContentLoadedEvent struct { + Category BrowserPageDomContentLoadedEventCategory `json:"category"` + Data *BrowserPageDomContentLoadedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -1984,18 +5124,21 @@ type BrowserInteractionClickEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserInteractionClickEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPageDomContentLoadedEventType `json:"type"` } -// BrowserInteractionClickEventCategory defines model for BrowserInteractionClickEvent.Category. -type BrowserInteractionClickEventCategory string +// BrowserPageDomContentLoadedEventCategory defines model for BrowserPageDomContentLoadedEvent.Category. +type BrowserPageDomContentLoadedEventCategory string -// BrowserInteractionClickEventType defines model for BrowserInteractionClickEvent.Type. -type BrowserInteractionClickEventType string +// BrowserPageDomContentLoadedEventType defines model for BrowserPageDomContentLoadedEvent.Type. +type BrowserPageDomContentLoadedEventType string + +// BrowserPageDomContentLoadedEventData defines model for BrowserPageDomContentLoadedEventData. +type BrowserPageDomContentLoadedEventData struct { + // CdpTimestamp Chrome monotonic clock value in seconds at which DOMContentLoaded fired, relative to browser process start (not Unix epoch). Use `ts` for wall-clock time. + CdpTimestamp float32 `json:"cdp_timestamp"` -// BrowserInteractionClickEventData defines model for BrowserInteractionClickEventData. -type BrowserInteractionClickEventData struct { // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` @@ -2005,38 +5148,25 @@ type BrowserInteractionClickEventData struct { // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` - // Selector CSS selector path to the clicked element. - Selector string `json:"selector"` - // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` - // Tag HTML tag name of the clicked element in uppercase (e.g. BUTTON, A, DIV). - Tag string `json:"tag"` - // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` - // Text Visible text content of the clicked element, trimmed. - Text *string `json:"text,omitempty"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. Url *string `json:"url,omitempty"` - - // X Viewport x-coordinate of the click in CSS pixels. - X int `json:"x"` - - // Y Viewport y-coordinate of the click in CSS pixels. - Y int `json:"y"` } -// BrowserInteractionKeyEvent A browser keyboard event captured via injected page script. -type BrowserInteractionKeyEvent struct { - Category BrowserInteractionKeyEventCategory `json:"category"` - Data *BrowserInteractionKeyEventData `json:"data,omitempty"` +// BrowserPageLayoutSettledEvent A browser layout settled event emitted 1 second after page load with no intervening layout shifts, indicating visual stability. Each layout shift resets the 1-second timer. +type BrowserPageLayoutSettledEvent struct { + Category BrowserPageLayoutSettledEventCategory `json:"category"` + + // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. + Data *BrowserEventContext `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2045,53 +5175,20 @@ type BrowserInteractionKeyEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserInteractionKeyEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPageLayoutSettledEventType `json:"type"` } -// BrowserInteractionKeyEventCategory defines model for BrowserInteractionKeyEvent.Category. -type BrowserInteractionKeyEventCategory string - -// BrowserInteractionKeyEventType defines model for BrowserInteractionKeyEvent.Type. -type BrowserInteractionKeyEventType string - -// BrowserInteractionKeyEventData defines model for BrowserInteractionKeyEventData. -type BrowserInteractionKeyEventData struct { - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // Key Key value from the KeyboardEvent (e.g. Enter, Backspace, a). - Key string `json:"key"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // Selector CSS selector path to the element that had focus when the key was pressed. - Selector string `json:"selector"` - - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` - - // Tag HTML tag name of the focused element in uppercase (e.g. INPUT, TEXTAREA, DIV). - Tag string `json:"tag"` - - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` - - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` +// BrowserPageLayoutSettledEventCategory defines model for BrowserPageLayoutSettledEvent.Category. +type BrowserPageLayoutSettledEventCategory string - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} +// BrowserPageLayoutSettledEventType defines model for BrowserPageLayoutSettledEvent.Type. +type BrowserPageLayoutSettledEventType string -// BrowserInteractionScrollSettledEvent A browser scroll settled event emitted after scroll position stops changing, captured via injected page script. -type BrowserInteractionScrollSettledEvent struct { - Category BrowserInteractionScrollSettledEventCategory `json:"category"` - Data *BrowserInteractionScrollSettledEventData `json:"data,omitempty"` +// BrowserPageLayoutShiftEvent A browser cumulative layout shift (CLS) event from the Performance Timeline API. +type BrowserPageLayoutShiftEvent struct { + Category BrowserPageLayoutShiftEventCategory `json:"category"` + Data *BrowserPageLayoutShiftEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2100,26 +5197,32 @@ type BrowserInteractionScrollSettledEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserInteractionScrollSettledEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPageLayoutShiftEventType `json:"type"` } -// BrowserInteractionScrollSettledEventCategory defines model for BrowserInteractionScrollSettledEvent.Category. -type BrowserInteractionScrollSettledEventCategory string +// BrowserPageLayoutShiftEventCategory defines model for BrowserPageLayoutShiftEvent.Category. +type BrowserPageLayoutShiftEventCategory string -// BrowserInteractionScrollSettledEventType defines model for BrowserInteractionScrollSettledEvent.Type. -type BrowserInteractionScrollSettledEventType string +// BrowserPageLayoutShiftEventType defines model for BrowserPageLayoutShiftEvent.Type. +type BrowserPageLayoutShiftEventType string + +// BrowserPageLayoutShiftEventData defines model for BrowserPageLayoutShiftEventData. +type BrowserPageLayoutShiftEventData struct { + // Duration Duration of the layout shift entry in milliseconds (always 0 for layout shifts per spec). + Duration float32 `json:"duration"` -// BrowserInteractionScrollSettledEventData defines model for BrowserInteractionScrollSettledEventData. -type BrowserInteractionScrollSettledEventData struct { // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` - // FromX Scroll x-position at the start of the scroll gesture in CSS pixels. - FromX int `json:"from_x"` + // LayoutShiftDetails PerformanceLayoutShift attributes from the Performance Timeline entry. + LayoutShiftDetails *struct { + // HadRecentInput True if the layout shift was preceded by user input within 500ms, excluding it from CLS. + HadRecentInput *bool `json:"had_recent_input,omitempty"` - // FromY Scroll y-position at the start of the scroll gesture in CSS pixels. - FromY int `json:"from_y"` + // Value Layout shift score for this entry (contribution to CLS). + Value *float32 `json:"value,omitempty"` + } `json:"layout_shift_details,omitempty"` // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` @@ -2130,31 +5233,26 @@ type BrowserInteractionScrollSettledEventData struct { // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` + // SourceFrameId CDP frame identifier of the frame where the layout shift occurred. + SourceFrameId string `json:"source_frame_id"` + // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` - // TargetSelector CSS selector path to the scrolled element. - TargetSelector string `json:"target_selector"` - // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` - // ToX Final scroll x-position after the gesture settled in CSS pixels. - ToX int `json:"to_x"` - - // ToY Final scroll y-position after the gesture settled in CSS pixels. - ToY int `json:"to_y"` + // Time Performance Timeline timestamp of the layout shift in milliseconds. + Time float32 `json:"time"` // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. Url *string `json:"url,omitempty"` } -// BrowserLiveViewConnectEvent A live view client connected to the headful browser's WebRTC server (Neko). Headful only; not emitted for headless images. -type BrowserLiveViewConnectEvent struct { - Category BrowserLiveViewConnectEventCategory `json:"category"` - - // Data Per-session payload for `live_view_connect` events. - Data *BrowserLiveViewConnectEventData `json:"data,omitempty"` +// BrowserPageLcpEvent A browser Largest Contentful Paint (LCP) event from the Performance Timeline API. +type BrowserPageLcpEvent struct { + Category BrowserPageLcpEventCategory `json:"category"` + Data *BrowserPageLcpEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2163,90 +5261,71 @@ type BrowserLiveViewConnectEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserLiveViewConnectEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPageLcpEventType `json:"type"` } -// BrowserLiveViewConnectEventCategory defines model for BrowserLiveViewConnectEvent.Category. -type BrowserLiveViewConnectEventCategory string +// BrowserPageLcpEventCategory defines model for BrowserPageLcpEvent.Category. +type BrowserPageLcpEventCategory string -// BrowserLiveViewConnectEventType defines model for BrowserLiveViewConnectEvent.Type. -type BrowserLiveViewConnectEventType string +// BrowserPageLcpEventType defines model for BrowserPageLcpEvent.Type. +type BrowserPageLcpEventType string -// BrowserLiveViewConnectEventData Per-session payload for `live_view_connect` events. -type BrowserLiveViewConnectEventData struct { - // SessionId Live view session identifier. Stable across reconnects, so a transient network blip can emit two events with the same `session_id`. - SessionId string `json:"session_id"` -} +// BrowserPageLcpEventData defines model for BrowserPageLcpEventData. +type BrowserPageLcpEventData struct { + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` -// BrowserLiveViewDisconnectEvent A live view client disconnected from the headful browser's WebRTC server (Neko). Pair with `live_view_connect` by `session_id`. -type BrowserLiveViewDisconnectEvent struct { - Category BrowserLiveViewDisconnectEventCategory `json:"category"` + // LcpDetails LargestContentfulPaint attributes from the Performance Timeline entry. + LcpDetails *struct { + // ElementId id attribute of the LCP element, if present. + ElementId *string `json:"element_id,omitempty"` - // Data Per-session payload for `live_view_disconnect` events. - Data *BrowserLiveViewDisconnectEventData `json:"data,omitempty"` + // LoadTime Load time of the LCP element in milliseconds. + LoadTime *float32 `json:"load_time,omitempty"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // NodeId CDP DOM node identifier of the LCP element. + NodeId *int `json:"node_id,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // RenderTime Render time of the LCP element in milliseconds; 0 for cross-origin images without Timing-Allow-Origin. + RenderTime *float32 `json:"render_time,omitempty"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserLiveViewDisconnectEventType `json:"type"` -} + // Size Visible area of the LCP element in pixels squared. + Size *float32 `json:"size,omitempty"` -// BrowserLiveViewDisconnectEventCategory defines model for BrowserLiveViewDisconnectEvent.Category. -type BrowserLiveViewDisconnectEventCategory string + // Url URL of the LCP element for image or video elements. + Url *string `json:"url,omitempty"` + } `json:"lcp_details,omitempty"` -// BrowserLiveViewDisconnectEventType defines model for BrowserLiveViewDisconnectEvent.Type. -type BrowserLiveViewDisconnectEventType string + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` -// BrowserLiveViewDisconnectEventData Per-session payload for `live_view_disconnect` events. -type BrowserLiveViewDisconnectEventData struct { - // DurationMs Wall-clock duration of the connection in milliseconds. - DurationMs float32 `json:"duration_ms"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` - // SessionId Live view session identifier; matches the corresponding `live_view_connect` event. + // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` -} - -// BrowserMonitorDisconnectedEvent The CDP connection to Chrome was lost. Telemetry events may be dropped until monitor_reconnected arrives. Treat any in-progress computed state (network_idle, page_layout_settled) as unreliable until then. -type BrowserMonitorDisconnectedEvent struct { - Category BrowserMonitorDisconnectedEventCategory `json:"category"` - Data *BrowserMonitorDisconnectedEventData `json:"data,omitempty"` - - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // SourceFrameId CDP frame identifier of the frame where the LCP element was rendered. + SourceFrameId string `json:"source_frame_id"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorDisconnectedEventType `json:"type"` -} + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` -// BrowserMonitorDisconnectedEventCategory defines model for BrowserMonitorDisconnectedEvent.Category. -type BrowserMonitorDisconnectedEventCategory string + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` -// BrowserMonitorDisconnectedEventType defines model for BrowserMonitorDisconnectedEvent.Type. -type BrowserMonitorDisconnectedEventType string + // Time Performance Timeline timestamp of the LCP entry in milliseconds. + Time float32 `json:"time"` -// BrowserMonitorDisconnectedEventData defines model for BrowserMonitorDisconnectedEventData. -type BrowserMonitorDisconnectedEventData struct { - // Reason Reason for the disconnection. chrome_restarted: Chrome process restarted. - Reason BrowserMonitorDisconnectedEventDataReason `json:"reason"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// BrowserMonitorDisconnectedEventDataReason Reason for the disconnection. chrome_restarted: Chrome process restarted. -type BrowserMonitorDisconnectedEventDataReason string - -// BrowserMonitorInitFailedEvent The CDP session could not be initialized. -type BrowserMonitorInitFailedEvent struct { - Category BrowserMonitorInitFailedEventCategory `json:"category"` - Data *BrowserMonitorInitFailedEventData `json:"data,omitempty"` +// BrowserPageLoadEvent A browser page load event (CDP Page.loadEventFired). +type BrowserPageLoadEvent struct { + Category BrowserPageLoadEventCategory `json:"category"` + Data *BrowserPageLoadEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2255,57 +5334,47 @@ type BrowserMonitorInitFailedEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorInitFailedEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPageLoadEventType `json:"type"` } -// BrowserMonitorInitFailedEventCategory defines model for BrowserMonitorInitFailedEvent.Category. -type BrowserMonitorInitFailedEventCategory string +// BrowserPageLoadEventCategory defines model for BrowserPageLoadEvent.Category. +type BrowserPageLoadEventCategory string -// BrowserMonitorInitFailedEventType defines model for BrowserMonitorInitFailedEvent.Type. -type BrowserMonitorInitFailedEventType string +// BrowserPageLoadEventType defines model for BrowserPageLoadEvent.Type. +type BrowserPageLoadEventType string -// BrowserMonitorInitFailedEventData defines model for BrowserMonitorInitFailedEventData. -type BrowserMonitorInitFailedEventData struct { - // Step The CDP method or initialization step that failed (e.g. Target.setAutoAttach). - Step string `json:"step"` -} +// BrowserPageLoadEventData defines model for BrowserPageLoadEventData. +type BrowserPageLoadEventData struct { + // CdpTimestamp Chrome monotonic clock value in seconds at which the load event fired, relative to browser process start (not Unix epoch). Use `ts` for wall-clock time. + CdpTimestamp float32 `json:"cdp_timestamp"` -// BrowserMonitorReconnectFailedEvent The CDP connection to Chrome could not be re-established after exhausting all reconnection attempts. No further telemetry events will arrive on this session. -type BrowserMonitorReconnectFailedEvent struct { - Category BrowserMonitorReconnectFailedEventCategory `json:"category"` - Data *BrowserMonitorReconnectFailedEventData `json:"data,omitempty"` + // FrameId CDP frame identifier within the target. + FrameId *string `json:"frame_id,omitempty"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // LoaderId CDP document loader identifier, reset on each navigation. + LoaderId *string `json:"loader_id,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. + NavSeq int64 `json:"nav_seq"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorReconnectFailedEventType `json:"type"` -} + // SessionId CDP session identifier for the target connection. + SessionId string `json:"session_id"` -// BrowserMonitorReconnectFailedEventCategory defines model for BrowserMonitorReconnectFailedEvent.Category. -type BrowserMonitorReconnectFailedEventCategory string + // TargetId Browser target identifier (stable across navigations within a tab). + TargetId string `json:"target_id"` -// BrowserMonitorReconnectFailedEventType defines model for BrowserMonitorReconnectFailedEvent.Type. -type BrowserMonitorReconnectFailedEventType string + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` -// BrowserMonitorReconnectFailedEventData defines model for BrowserMonitorReconnectFailedEventData. -type BrowserMonitorReconnectFailedEventData struct { - // Reason Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection. - Reason BrowserMonitorReconnectFailedEventDataReason `json:"reason"` + // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. + Url *string `json:"url,omitempty"` } -// BrowserMonitorReconnectFailedEventDataReason Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection. -type BrowserMonitorReconnectFailedEventDataReason string - -// BrowserMonitorReconnectedEvent The CDP connection to Chrome was successfully re-established after a disconnection. Events emitted during the gap are lost. Computed state is reset, so navigation and network tracking restart fresh from this point. -type BrowserMonitorReconnectedEvent struct { - Category BrowserMonitorReconnectedEventCategory `json:"category"` - Data *BrowserMonitorReconnectedEventData `json:"data,omitempty"` +// BrowserPageNavigationEvent A browser page navigation started event (CDP Page.frameNavigated). Carries nav context fields inline but not nav_seq, as this event resets the navigation epoch. +type BrowserPageNavigationEvent struct { + Category BrowserPageNavigationEventCategory `json:"category"` + Data *BrowserPageNavigationEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2314,53 +5383,43 @@ type BrowserMonitorReconnectedEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorReconnectedEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPageNavigationEventType `json:"type"` } -// BrowserMonitorReconnectedEventCategory defines model for BrowserMonitorReconnectedEvent.Category. -type BrowserMonitorReconnectedEventCategory string - -// BrowserMonitorReconnectedEventType defines model for BrowserMonitorReconnectedEvent.Type. -type BrowserMonitorReconnectedEventType string +// BrowserPageNavigationEventCategory defines model for BrowserPageNavigationEvent.Category. +type BrowserPageNavigationEventCategory string -// BrowserMonitorReconnectedEventData defines model for BrowserMonitorReconnectedEventData. -type BrowserMonitorReconnectedEventData struct { - // ReconnectDurationMs Wall-clock time in milliseconds taken to reconnect after the disconnection. - ReconnectDurationMs int64 `json:"reconnect_duration_ms"` -} +// BrowserPageNavigationEventType defines model for BrowserPageNavigationEvent.Type. +type BrowserPageNavigationEventType string -// BrowserMonitorScreenshotEvent A periodic screenshot of the browser viewport. -type BrowserMonitorScreenshotEvent struct { - Category BrowserMonitorScreenshotEventCategory `json:"category"` - Data *BrowserMonitorScreenshotEventData `json:"data,omitempty"` +// BrowserPageNavigationEventData defines model for BrowserPageNavigationEventData. +type BrowserPageNavigationEventData struct { + // FrameId CDP frame identifier of the navigated frame. + FrameId string `json:"frame_id"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // LoaderId New CDP document loader identifier assigned for this navigation. + LoaderId string `json:"loader_id"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // ParentFrameId Parent frame identifier for subframe navigations; absent for top-level navigations. + ParentFrameId *string `json:"parent_frame_id,omitempty"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserMonitorScreenshotEventType `json:"type"` -} + // SessionId CDP session identifier. + SessionId string `json:"session_id"` -// BrowserMonitorScreenshotEventCategory defines model for BrowserMonitorScreenshotEvent.Category. -type BrowserMonitorScreenshotEventCategory string + // TargetId Browser target identifier. + TargetId string `json:"target_id"` -// BrowserMonitorScreenshotEventType defines model for BrowserMonitorScreenshotEvent.Type. -type BrowserMonitorScreenshotEventType string + // TargetType CDP target type of the page that produced the event. + TargetType BrowserTargetType `json:"target_type"` -// BrowserMonitorScreenshotEventData defines model for BrowserMonitorScreenshotEventData. -type BrowserMonitorScreenshotEventData struct { - // Png Base64-encoded PNG screenshot of the browser viewport. - Png []byte `json:"png"` + // Url URL navigated to. + Url string `json:"url"` } -// BrowserNetworkIdleEvent A browser network idle event emitted after a 500ms quiet period with no in-flight HTTP requests. -type BrowserNetworkIdleEvent struct { - Category BrowserNetworkIdleEventCategory `json:"category"` +// BrowserPageNavigationSettledEvent Emitted when page_dom_content_loaded and page_layout_settled have both fired for the same navigation, indicating the page is loaded and visually stable. Independent of network_idle; a single pending request does not block it. +type BrowserPageNavigationSettledEvent struct { + Category BrowserPageNavigationSettledEventCategory `json:"category"` // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. Data *BrowserEventContext `json:"data,omitempty"` @@ -2372,20 +5431,20 @@ type BrowserNetworkIdleEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserNetworkIdleEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPageNavigationSettledEventType `json:"type"` } -// BrowserNetworkIdleEventCategory defines model for BrowserNetworkIdleEvent.Category. -type BrowserNetworkIdleEventCategory string +// BrowserPageNavigationSettledEventCategory defines model for BrowserPageNavigationSettledEvent.Category. +type BrowserPageNavigationSettledEventCategory string -// BrowserNetworkIdleEventType defines model for BrowserNetworkIdleEvent.Type. -type BrowserNetworkIdleEventType string +// BrowserPageNavigationSettledEventType defines model for BrowserPageNavigationSettledEvent.Type. +type BrowserPageNavigationSettledEventType string -// BrowserNetworkLoadingFailedEvent A browser network loading failed event. If the request was already in flight when CDP attached (no prior `network_request` was emitted for it), `url`, `frame_id`, `loader_id`, and `resource_type` are absent; `BrowserEventContext` is partially populated in that case. -type BrowserNetworkLoadingFailedEvent struct { - Category BrowserNetworkLoadingFailedEventCategory `json:"category"` - Data *BrowserNetworkLoadingFailedEventData `json:"data,omitempty"` +// BrowserPageTabOpenedEvent A new browser tab or target was opened (CDP Target.attachedToTarget for page targets). Fires before a CDP session is attached to the new target, so `session_id`, `frame_id`, `loader_id`, and `nav_seq` are absent; this event does not compose `BrowserEventContext`. Consumers reading context fields generically should treat it as a special case. +type BrowserPageTabOpenedEvent struct { + Category BrowserPageTabOpenedEventCategory `json:"category"` + Data *BrowserPageTabOpenedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2394,56 +5453,40 @@ type BrowserNetworkLoadingFailedEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserNetworkLoadingFailedEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPageTabOpenedEventType `json:"type"` } -// BrowserNetworkLoadingFailedEventCategory defines model for BrowserNetworkLoadingFailedEvent.Category. -type BrowserNetworkLoadingFailedEventCategory string - -// BrowserNetworkLoadingFailedEventType defines model for BrowserNetworkLoadingFailedEvent.Type. -type BrowserNetworkLoadingFailedEventType string - -// BrowserNetworkLoadingFailedEventData defines model for BrowserNetworkLoadingFailedEventData. -type BrowserNetworkLoadingFailedEventData struct { - // Canceled True if the request was canceled by the browser or page script. - Canceled bool `json:"canceled"` - - // ErrorText Network error description (e.g. net::ERR_CONNECTION_REFUSED). - ErrorText string `json:"error_text"` - - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // RequestId CDP request identifier matching the originating network_request event. - RequestId string `json:"request_id"` +// BrowserPageTabOpenedEventCategory defines model for BrowserPageTabOpenedEvent.Category. +type BrowserPageTabOpenedEventCategory string - // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. - ResourceType *string `json:"resource_type,omitempty"` +// BrowserPageTabOpenedEventType defines model for BrowserPageTabOpenedEvent.Type. +type BrowserPageTabOpenedEventType string - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` +// BrowserPageTabOpenedEventData defines model for BrowserPageTabOpenedEventData. +type BrowserPageTabOpenedEventData struct { + // OpenerId Target identifier of the tab that opened this one, if any. + OpenerId *string `json:"opener_id,omitempty"` - // TargetId Browser target identifier (stable across navigations within a tab). + // TargetId CDP target identifier for the newly opened tab. TargetId string `json:"target_id"` // TargetType CDP target type of the page that produced the event. TargetType BrowserTargetType `json:"target_type"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` + // Title Initial page title of the new tab. + Title *string `json:"title,omitempty"` + + // Url Initial URL of the new tab. + Url string `json:"url"` } -// BrowserNetworkRequestEvent A browser network request sent event. -type BrowserNetworkRequestEvent struct { - Category BrowserNetworkRequestEventCategory `json:"category"` - Data *BrowserNetworkRequestEventData `json:"data,omitempty"` +// BrowserPlatformApiCallEvent A call that manages the browser VM rather than driving the browser, handled by the kernel-images-api server: recording lifecycle, filesystem and process management, telemetry and browser configuration. These are mostly platform-induced (e.g. profile save, replay capture) rather than agent actions. +type BrowserPlatformApiCallEvent struct { + Category BrowserPlatformApiCallEventCategory `json:"category"` + + // Data Per-call payload for `platform_api_call` events. Metadata only: a platform call carries no submitted content, so there is no `code` field as there is on `api_call`. + Data *BrowserPlatformApiCallEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2452,71 +5495,35 @@ type BrowserNetworkRequestEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserNetworkRequestEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserPlatformApiCallEventType `json:"type"` } -// BrowserNetworkRequestEventCategory defines model for BrowserNetworkRequestEvent.Category. -type BrowserNetworkRequestEventCategory string - -// BrowserNetworkRequestEventType defines model for BrowserNetworkRequestEvent.Type. -type BrowserNetworkRequestEventType string - -// BrowserNetworkRequestEventData defines model for BrowserNetworkRequestEventData. -type BrowserNetworkRequestEventData struct { - // DocumentUrl URL of the document that initiated the request. - DocumentUrl string `json:"document_url"` - - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` - - // Headers Request headers. - Headers BrowserHttpHeaders `json:"headers"` - - // InitiatorType CDP Initiator.type indicating what caused the request, passed through as-is from Chrome. Known values include script, parser, preload, and other. - InitiatorType string `json:"initiator_type"` - - // IsRedirect True if this request is the result of a redirect. - IsRedirect *bool `json:"is_redirect,omitempty"` - - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` - - // Method HTTP method as sent on the wire (e.g. GET, POST). - Method string `json:"method"` - - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` - - // PostData Request body for POST/PUT requests, if available. - PostData *string `json:"post_data,omitempty"` - - // RedirectUrl Original URL before the redirect, present when is_redirect is true. - RedirectUrl *string `json:"redirect_url,omitempty"` - - // RequestId CDP request identifier, unique within the session. - RequestId string `json:"request_id"` +// BrowserPlatformApiCallEventCategory defines model for BrowserPlatformApiCallEvent.Category. +type BrowserPlatformApiCallEventCategory string - // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. - ResourceType *string `json:"resource_type,omitempty"` +// BrowserPlatformApiCallEventType defines model for BrowserPlatformApiCallEvent.Type. +type BrowserPlatformApiCallEventType string - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` +// BrowserPlatformApiCallEventData Per-call payload for `platform_api_call` events. Metadata only: a platform call carries no submitted content, so there is no `code` field as there is on `api_call`. +type BrowserPlatformApiCallEventData struct { + // DurationMs Wall-clock duration of the handler in milliseconds. + DurationMs float32 `json:"duration_ms"` - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` + // OperationId Matched route's operation, named as the server names its handler (e.g. `ProcessExec`, `StartRecording`). + OperationId string `json:"operation_id"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // RequestId Per-request identifier from the kernel-images-api request middleware. + RequestId string `json:"request_id"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` + // Status HTTP response status code. + Status int `json:"status"` } -// BrowserNetworkResponseEvent A browser network response received event. Fired after the response body is fully received, not when headers arrive. -type BrowserNetworkResponseEvent struct { - Category BrowserNetworkResponseEventCategory `json:"category"` - Data *BrowserNetworkResponseEventData `json:"data,omitempty"` +// BrowserProxyErrorEvent A branded proxy-layer failure observed by the browser. Emitted when the metro egress host-proxy serves a branded 5xx error page whose response carries the `X-Kernel-Proxy-Error` header. Low-volume and carries a typed code. Its value is per-session and per-URL attribution for sessions that already capture the network stream: proxy failures are only observable while the CDP network collector is running, so this is an opt-in refinement of the raw network events rather than a default-on alerting signal. +type BrowserProxyErrorEvent struct { + Category BrowserProxyErrorEventCategory `json:"category"` + Data *BrowserProxyErrorEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2525,54 +5532,45 @@ type BrowserNetworkResponseEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserNetworkResponseEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserProxyErrorEventType `json:"type"` } -// BrowserNetworkResponseEventCategory defines model for BrowserNetworkResponseEvent.Category. -type BrowserNetworkResponseEventCategory string +// BrowserProxyErrorEventCategory defines model for BrowserProxyErrorEvent.Category. +type BrowserProxyErrorEventCategory string -// BrowserNetworkResponseEventType defines model for BrowserNetworkResponseEvent.Type. -type BrowserNetworkResponseEventType string +// BrowserProxyErrorEventType defines model for BrowserProxyErrorEvent.Type. +type BrowserProxyErrorEventType string -// BrowserNetworkResponseEventData defines model for BrowserNetworkResponseEventData. -type BrowserNetworkResponseEventData struct { - // Body Truncated response body, present only for text MIME types. - Body *string `json:"body,omitempty"` +// BrowserProxyErrorEventData defines model for BrowserProxyErrorEventData. +type BrowserProxyErrorEventData struct { + // Code Proxy-layer error code: the `X-Kernel-Proxy-Error` response header value from a branded 5xx error page served by the metro egress host-proxy. Values mirror what the proxy emits: destination_blocked, provider_blacklisted, provider_unreachable, proxy_unavailable, upstream_timeout, upstream_dns_failure, upstream_connect_failed. Unknown header values are dropped. + Code BrowserProxyErrorEventDataCode `json:"code"` // FrameId CDP frame identifier within the target. FrameId *string `json:"frame_id,omitempty"` - // Headers Response headers. - Headers BrowserHttpHeaders `json:"headers"` - // LoaderId CDP document loader identifier, reset on each navigation. LoaderId *string `json:"loader_id,omitempty"` - // Method HTTP method of the original request. - Method string `json:"method"` - - // MimeType MIME type of the response (e.g. text/html, application/json). - MimeType *string `json:"mime_type,omitempty"` + // Method HTTP method of the failed request, when known. + Method *string `json:"method,omitempty"` // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. NavSeq int64 `json:"nav_seq"` - // RequestId CDP request identifier matching the originating network_request event. + // RequestId CDP request identifier matching the originating request. RequestId string `json:"request_id"` - // ResourceType CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more. + // ResourceType CDP Network.ResourceType for the request, when known. ResourceType *string `json:"resource_type,omitempty"` // SessionId CDP session identifier for the target connection. SessionId string `json:"session_id"` - // Status HTTP response status code. + // Status HTTP response status of the branded error page (502). Status int `json:"status"` - // StatusText HTTP response status text (e.g. OK, Not Found). - StatusText *string `json:"status_text,omitempty"` - // TargetId Browser target identifier (stable across navigations within a tab). TargetId string `json:"target_id"` @@ -2583,10 +5581,15 @@ type BrowserNetworkResponseEventData struct { Url *string `json:"url,omitempty"` } -// BrowserPageCrashedEvent A page's renderer process crashed (an "Aw, Snap!" failure) while the browser process itself stayed alive. Reported on the crashed page's session, with the session and target ids on `source.metadata`. Captured only while the `page` category is enabled. -type BrowserPageCrashedEvent struct { - Category BrowserPageCrashedEventCategory `json:"category"` - Data *BrowserPageCrashedEventData `json:"data,omitempty"` +// BrowserProxyErrorEventDataCode Proxy-layer error code: the `X-Kernel-Proxy-Error` response header value from a branded 5xx error page served by the metro egress host-proxy. Values mirror what the proxy emits: destination_blocked, provider_blacklisted, provider_unreachable, proxy_unavailable, upstream_timeout, upstream_dns_failure, upstream_connect_failed. Unknown header values are dropped. +type BrowserProxyErrorEventDataCode string + +// BrowserServiceCrashedEvent A managed service exited unexpectedly. Intentional stops (e.g. operator-initiated shutdown) do not produce this event — only unexpected exits and terminal restart-give-up transitions do. +type BrowserServiceCrashedEvent struct { + Category BrowserServiceCrashedEventCategory `json:"category"` + + // Data Per-crash payload for `service_crashed` events. Exit code and signal are not exposed by the underlying process manager on this channel, so only the service identity, the lifecycle phase the crash occurred in, and (when available) the PID are reported. + Data *BrowserServiceCrashedEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2595,32 +5598,37 @@ type BrowserPageCrashedEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageCrashedEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserServiceCrashedEventType `json:"type"` } -// BrowserPageCrashedEventCategory defines model for BrowserPageCrashedEvent.Category. -type BrowserPageCrashedEventCategory string +// BrowserServiceCrashedEventCategory defines model for BrowserServiceCrashedEvent.Category. +type BrowserServiceCrashedEventCategory string -// BrowserPageCrashedEventType defines model for BrowserPageCrashedEvent.Type. -type BrowserPageCrashedEventType string +// BrowserServiceCrashedEventType defines model for BrowserServiceCrashedEvent.Type. +type BrowserServiceCrashedEventType string -// BrowserPageCrashedEventData defines model for BrowserPageCrashedEventData. -type BrowserPageCrashedEventData struct { - // TargetId CDP target identifier of the crashed page. - TargetId string `json:"target_id"` +// BrowserServiceCrashedEventData Per-crash payload for `service_crashed` events. Exit code and signal are not exposed by the underlying process manager on this channel, so only the service identity, the lifecycle phase the crash occurred in, and (when available) the PID are reported. +type BrowserServiceCrashedEventData struct { + // Phase Lifecycle phase the crash occurred in. `startup` means the process died before it ever reached a healthy running state. `running` means a previously healthy process died unexpectedly. `gave_up` means the process manager exhausted its restart attempts and stopped trying; no further `service_crashed` events will fire for this service until something restarts it. + Phase BrowserServiceCrashedEventDataPhase `json:"phase"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // Pid PID of the crashed process. Absent when the process manager gave up after exhausting restart attempts and is no longer tracking a live PID. + Pid *int `json:"pid,omitempty"` - // Url URL the page was on when its renderer process crashed. - Url string `json:"url"` + // ServiceName Program name of the crashed service (e.g. `chromium`, `mutter`, `kernel-images-api`). + ServiceName string `json:"service_name"` } -// BrowserPageDomContentLoadedEvent A browser DOMContentLoaded event (CDP Page.domContentEventFired). -type BrowserPageDomContentLoadedEvent struct { - Category BrowserPageDomContentLoadedEventCategory `json:"category"` - Data *BrowserPageDomContentLoadedEventData `json:"data,omitempty"` +// BrowserServiceCrashedEventDataPhase Lifecycle phase the crash occurred in. `startup` means the process died before it ever reached a healthy running state. `running` means a previously healthy process died unexpectedly. `gave_up` means the process manager exhausted its restart attempts and stopped trying; no further `service_crashed` events will fire for this service until something restarts it. +type BrowserServiceCrashedEventDataPhase string + +// BrowserSystemOomKillEvent The Linux kernel OOM-killer terminated a process inside the VM. Sourced from `/dev/kmsg`. Fires for any process killed by the kernel due to memory exhaustion, including Chrome renderer subprocesses that are not supervised. +type BrowserSystemOomKillEvent struct { + Category BrowserSystemOomKillEventCategory `json:"category"` + + // Data Per-kill payload for `system_oom_kill` events. + Data *BrowserSystemOomKillEventData `json:"data,omitempty"` // Source Provenance metadata identifying which producer emitted the event. Source BrowserEventSource `json:"source"` @@ -2629,1542 +5637,2268 @@ type BrowserPageDomContentLoadedEvent struct { Truncated *bool `json:"truncated,omitempty"` // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageDomContentLoadedEventType `json:"type"` + Ts int64 `json:"ts"` + Type BrowserSystemOomKillEventType `json:"type"` } -// BrowserPageDomContentLoadedEventCategory defines model for BrowserPageDomContentLoadedEvent.Category. -type BrowserPageDomContentLoadedEventCategory string +// BrowserSystemOomKillEventCategory defines model for BrowserSystemOomKillEvent.Category. +type BrowserSystemOomKillEventCategory string -// BrowserPageDomContentLoadedEventType defines model for BrowserPageDomContentLoadedEvent.Type. -type BrowserPageDomContentLoadedEventType string +// BrowserSystemOomKillEventType defines model for BrowserSystemOomKillEvent.Type. +type BrowserSystemOomKillEventType string -// BrowserPageDomContentLoadedEventData defines model for BrowserPageDomContentLoadedEventData. -type BrowserPageDomContentLoadedEventData struct { - // CdpTimestamp Chrome monotonic clock value in seconds at which DOMContentLoaded fired, relative to browser process start (not Unix epoch). Use `ts` for wall-clock time. - CdpTimestamp float32 `json:"cdp_timestamp"` +// BrowserSystemOomKillEventData Per-kill payload for `system_oom_kill` events. +type BrowserSystemOomKillEventData struct { + // Constraint Why the kernel decided to OOM-kill. `none` means global memory exhaustion; `memcg` means a cgroup memory limit was hit; `cpuset` / `memory_policy` are NUMA/policy-driven kills. Absent on kernels older than 5.0 which did not emit the structured `oom-kill:` line. + Constraint *BrowserSystemOomKillEventDataConstraint `json:"constraint,omitempty"` - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` + // MemFreeKb Free system memory in KiB at the time of the kill, derived from the `free:N` field in the kernel's Mem-Info dump. Assumes a 4 KiB page size. Does not include reclaimable caches, so a small value with a large `mem_total_kb` may still mean the system was not under hard pressure. Absent if the kernel did not emit a parseable Mem-Info section. + MemFreeKb *int `json:"mem_free_kb,omitempty"` - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` + // MemTotalKb Total system memory in KiB at the time of the kill, derived from the `N pages RAM` line in the kernel's Mem-Info dump. Assumes a 4 KiB page size. Absent if the kernel did not emit a parseable Mem-Info section. + MemTotalKb *int `json:"mem_total_kb,omitempty"` - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` + // Pid PID of the killed process. + Pid int `json:"pid"` - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` + // ProcessName Comm of the killed process as reported by the kernel (max 15 chars, truncated by the kernel). + ProcessName string `json:"process_name"` - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` + // RssKb Resident set size of the killed process in KiB (sum of anon-rss, file-rss, and shmem-rss). This is the physical memory the process was using at the time of the kill. + RssKb int `json:"rss_kb"` + + // TopTasks Top processes by resident-set-size at the moment of the kill, sorted descending. Sourced from the kernel's `Tasks state` table. Empty if the kernel did not emit the table. Capped at 5 entries to bound payload size. + TopTasks *[]BrowserSystemOomKillTask `json:"top_tasks,omitempty"` + + // TriggerPid PID of the triggering process. Absent if the kernel did not emit the standard `CPU: N PID: N Comm:` header line. + TriggerPid *int `json:"trigger_pid,omitempty"` + + // TriggerProcessName Comm of the process whose allocation request caused the kernel to invoke the OOM-killer. Often the same as `process_name` (the kernel killed the requester) but can differ when the kernel chose a different victim. Max 15 chars, truncated by the kernel. + TriggerProcessName *string `json:"trigger_process_name,omitempty"` +} + +// BrowserSystemOomKillEventDataConstraint Why the kernel decided to OOM-kill. `none` means global memory exhaustion; `memcg` means a cgroup memory limit was hit; `cpuset` / `memory_policy` are NUMA/policy-driven kills. Absent on kernels older than 5.0 which did not emit the structured `oom-kill:` line. +type BrowserSystemOomKillEventDataConstraint string + +// BrowserSystemOomKillTask A single process entry from the kernel's `Tasks state` dump. +type BrowserSystemOomKillTask struct { + // Name Comm of the process (max 15 chars, truncated by the kernel). + Name string `json:"name"` + + // Pid PID of the process. + Pid int `json:"pid"` + + // RssKb Resident set size in KiB at the moment of the kill. + RssKb int `json:"rss_kb"` +} + +// BrowserTargetType CDP target type of the page that produced the event. +type BrowserTargetType string + +// BrowserTelemetryCategoriesConfig Per-category telemetry capture settings for browser events. +type BrowserTelemetryCategoriesConfig struct { + // Captcha Captcha solve attempt outcomes. + Captcha *BrowserTelemetryCategoryConfig `json:"captcha,omitempty"` + + // Connection Client attach/detach lifecycle for the CDP proxy and live view. + Connection *BrowserTelemetryCategoryConfig `json:"connection,omitempty"` + + // Console Console output (log, warn, error) and uncaught exceptions. + Console *BrowserTelemetryCategoryConfig `json:"console,omitempty"` + + // Control Agent-driven actions against the browser — computer-control calls, Playwright code execution, screenshots, clipboard access, and browser-control commands sent over the CDP proxy. + Control *BrowserTelemetryControlConfig `json:"control,omitempty"` + + // Interaction User interaction events (clicks, keydowns, scroll). + Interaction *BrowserTelemetryCategoryConfig `json:"interaction,omitempty"` + + // Network HTTP request/response metadata. + Network *BrowserTelemetryCategoryConfig `json:"network,omitempty"` + + // Page Page lifecycle events (navigation, load, layout shifts, LCP). + Page *BrowserTelemetryCategoryConfig `json:"page,omitempty"` + + // Platform Calls that manage the VM rather than drive the browser (recording, filesystem, process, telemetry and browser configuration). Mostly platform-induced; off by default and opt-in. + Platform *BrowserTelemetryCategoryConfig `json:"platform,omitempty"` + + // Screenshot Periodic base64-encoded viewport screenshots. High volume; off by default and opt-in. + Screenshot *BrowserTelemetryCategoryConfig `json:"screenshot,omitempty"` + + // System Browser VM health, such as out-of-memory kills and managed-service crashes. + System *BrowserTelemetryCategoryConfig `json:"system,omitempty"` +} + +// BrowserTelemetryCategoryConfig Configuration for a single telemetry category. +type BrowserTelemetryCategoryConfig struct { + // Enabled Whether this category is captured. In PUT requests selection is opt-in: omitting this field (or the whole category) leaves the category off, so a PUT captures exactly the categories set to true. In PATCH requests, omitting this field (or sending an empty object `{}`) is a no-op; the category retains its current state. To enable or disable a category via PATCH, you must send an explicit `true` or `false`. + Enabled *bool `json:"enabled,omitempty"` +} + +// BrowserTelemetryCdpControlConfig Settings for the `cdp_command` events the DevTools proxy reports. +type BrowserTelemetryCdpControlConfig struct { + // ExcludedMethods Methods to leave out of the `cdp_command` stream. Omit the list (or send an empty one) to report every supported method. Exclusion is a telemetry setting only: an excluded command is still relayed to the browser unchanged, it simply produces no event. Use it to drop the highest-volume methods — `Input.dispatchMouseEvent` during a humanized cursor path, or `Page.captureScreenshot` under a screencast — without turning the whole category off. + ExcludedMethods *[]BrowserCdpCommandMethod `json:"excluded_methods,omitempty"` +} + +// BrowserTelemetryConfig Telemetry configuration for a browser. Selection is opt-in. Omit the browser key (or send an empty object) to capture the default set: lightweight operational signals (control, connection, system, captcha). Within `browser`, only the categories you set enabled: true are captured; anything omitted is off. The CDP categories (console, network, page, interaction), `screenshot` and `platform` are off by default and must be opted into. A `browser` config with nothing enabled clears the telemetry configuration. The `monitor` category (CDP collector health) is not configurable here; it flows automatically whenever a CDP category is captured. +type BrowserTelemetryConfig struct { + // Browser Per-category telemetry capture settings for browser events. + Browser *BrowserTelemetryCategoriesConfig `json:"browser,omitempty"` + + // Export Forwarding of captured telemetry to an external destination. Independent of what is captured: export is off unless explicitly enabled here, even when an export destination is configured. In a PUT (full replace) an omitted export block resets export to off, the same as omitted categories turn off; in a PATCH an omitted field leaves the current setting unchanged. + Export *BrowserTelemetryExportConfig `json:"export,omitempty"` +} + +// BrowserTelemetryControlConfig Configuration for the control category. Same `enabled` semantics as any other category, plus settings for the browser-control commands the CDP proxy reports. +type BrowserTelemetryControlConfig struct { + // Cdp Settings for the `cdp_command` events the DevTools proxy reports. + Cdp *BrowserTelemetryCdpControlConfig `json:"cdp,omitempty"` + + // Enabled Whether this category is captured. In PUT requests selection is opt-in: omitting this field (or the whole category) leaves the category off, so a PUT captures exactly the categories set to true. In PATCH requests, omitting this field (or sending an empty object `{}`) is a no-op; the category retains its current state. To enable or disable a category via PATCH, you must send an explicit `true` or `false`. + Enabled *bool `json:"enabled,omitempty"` +} + +// BrowserTelemetryExportConfig Forwarding of captured telemetry to an external destination. Independent of what is captured: export is off unless explicitly enabled here, even when an export destination is configured. In a PUT (full replace) an omitted export block resets export to off, the same as omitted categories turn off; in a PATCH an omitted field leaves the current setting unchanged. +type BrowserTelemetryExportConfig struct { + // Otlp OTLP/HTTP export settings. + Otlp *BrowserTelemetryOTLPExportConfig `json:"otlp,omitempty"` +} + +// BrowserTelemetryOTLPExportConfig OTLP/HTTP export settings. +type BrowserTelemetryOTLPExportConfig struct { + // Enabled Whether captured telemetry is forwarded to the configured OTLP destination. Off by default. Has no effect (export stays inactive) when no export destination is configured. + Enabled *bool `json:"enabled,omitempty"` +} + +// ChromiumConfigureError Failure from batched chromium configure — includes which phase failed. +type ChromiumConfigureError struct { + Message string `json:"message"` + + // Phase configure_phase maps to restart/filesystem/policy/extension/profile/display work; navigate_phase is retained for compatibility. + Phase ChromiumConfigureErrorPhase `json:"phase"` + + // Step Optional configure step that failed. + Step *ChromiumConfigureErrorStep `json:"step,omitempty"` +} + +// ChromiumConfigureErrorPhase configure_phase maps to restart/filesystem/policy/extension/profile/display work; navigate_phase is retained for compatibility. +type ChromiumConfigureErrorPhase string + +// ChromiumConfigureErrorStep Optional configure step that failed. +type ChromiumConfigureErrorStep string + +// ClickMouseRequest defines model for ClickMouseRequest. +type ClickMouseRequest struct { + // Button Mouse button to interact with + Button *ClickMouseRequestButton `json:"button,omitempty"` + + // ClickType Type of click action + ClickType *ClickMouseRequestClickType `json:"click_type,omitempty"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // HoldKeys Modifier keys to hold during the click + HoldKeys *[]string `json:"hold_keys,omitempty"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} + // NumClicks Number of times to repeat the click + NumClicks *int `json:"num_clicks,omitempty"` -// BrowserPageLayoutSettledEvent A browser layout settled event emitted 1 second after page load with no intervening layout shifts, indicating visual stability. Each layout shift resets the 1-second timer. -type BrowserPageLayoutSettledEvent struct { - Category BrowserPageLayoutSettledEventCategory `json:"category"` + // X X coordinate of the click position + X int `json:"x"` - // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. - Data *BrowserEventContext `json:"data,omitempty"` + // Y Y coordinate of the click position + Y int `json:"y"` +} - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` +// ClickMouseRequestButton Mouse button to interact with +type ClickMouseRequestButton string - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` +// ClickMouseRequestClickType Type of click action +type ClickMouseRequestClickType string - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageLayoutSettledEventType `json:"type"` +// ClipboardContent defines model for ClipboardContent. +type ClipboardContent struct { + // Text Current clipboard text content + Text string `json:"text"` } -// BrowserPageLayoutSettledEventCategory defines model for BrowserPageLayoutSettledEvent.Category. -type BrowserPageLayoutSettledEventCategory string +// ComputerAction A single computer action to execute as part of a batch. The `type` field selects which +// action to perform, and the corresponding field contains the action parameters. +// Exactly one action field matching the type must be provided. +type ComputerAction struct { + ClickMouse *ClickMouseRequest `json:"click_mouse,omitempty"` + DragMouse *DragMouseRequest `json:"drag_mouse,omitempty"` + MoveMouse *MoveMouseRequest `json:"move_mouse,omitempty"` + PressKey *PressKeyRequest `json:"press_key,omitempty"` + Scroll *ScrollRequest `json:"scroll,omitempty"` + SetCursor *SetCursorRequest `json:"set_cursor,omitempty"` -// BrowserPageLayoutSettledEventType defines model for BrowserPageLayoutSettledEvent.Type. -type BrowserPageLayoutSettledEventType string + // Sleep Pause execution for a specified duration. + Sleep *SleepAction `json:"sleep,omitempty"` -// BrowserPageLayoutShiftEvent A browser cumulative layout shift (CLS) event from the Performance Timeline API. -type BrowserPageLayoutShiftEvent struct { - Category BrowserPageLayoutShiftEventCategory `json:"category"` - Data *BrowserPageLayoutShiftEventData `json:"data,omitempty"` + // Type The type of action to perform. + Type ComputerActionType `json:"type"` + TypeText *TypeTextRequest `json:"type_text,omitempty"` +} - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` +// ComputerActionType The type of action to perform. +type ComputerActionType string - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` +// CreateDirectoryRequest defines model for CreateDirectoryRequest. +type CreateDirectoryRequest struct { + // Mode Optional directory mode (octal string, e.g. 755). Defaults to 755. + Mode *string `json:"mode,omitempty"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageLayoutShiftEventType `json:"type"` + // Path Absolute directory path to create. + Path string `json:"path"` } -// BrowserPageLayoutShiftEventCategory defines model for BrowserPageLayoutShiftEvent.Category. -type BrowserPageLayoutShiftEventCategory string - -// BrowserPageLayoutShiftEventType defines model for BrowserPageLayoutShiftEvent.Type. -type BrowserPageLayoutShiftEventType string +// DeletePathRequest defines model for DeletePathRequest. +type DeletePathRequest struct { + // Path Absolute path to delete. + Path string `json:"path"` +} -// BrowserPageLayoutShiftEventData defines model for BrowserPageLayoutShiftEventData. -type BrowserPageLayoutShiftEventData struct { - // Duration Duration of the layout shift entry in milliseconds (always 0 for layout shifts per spec). - Duration float32 `json:"duration"` +// DeleteRecordingRequest defines model for DeleteRecordingRequest. +type DeleteRecordingRequest struct { + // Id Identifier of the recording session to delete, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the default recording session is deleted. + Id *string `json:"id,omitempty"` +} - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` +// DisplayConfig defines model for DisplayConfig. +type DisplayConfig struct { + // Height Current display height in pixels + Height *int `json:"height,omitempty"` - // LayoutShiftDetails PerformanceLayoutShift attributes from the Performance Timeline entry. - LayoutShiftDetails *struct { - // HadRecentInput True if the layout shift was preceded by user input within 500ms, excluding it from CLS. - HadRecentInput *bool `json:"had_recent_input,omitempty"` + // RefreshRate Current display refresh rate in Hz (may be null if not detectable) + RefreshRate *int `json:"refresh_rate,omitempty"` - // Value Layout shift score for this entry (contribution to CLS). - Value *float32 `json:"value,omitempty"` - } `json:"layout_shift_details,omitempty"` + // Width Current display width in pixels + Width *int `json:"width,omitempty"` +} - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` +// DragMouseRequest defines model for DragMouseRequest. +type DragMouseRequest struct { + // Button Mouse button to drag with + Button *DragMouseRequestButton `json:"button,omitempty"` - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` + // Delay Delay in milliseconds between button down and starting to move along the path. + Delay *int `json:"delay,omitempty"` - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` + // DurationMs Target total duration in milliseconds for the entire drag movement when smooth=true. Omit for automatic timing based on total path length. + DurationMs *int `json:"duration_ms,omitempty"` - // SourceFrameId CDP frame identifier of the frame where the layout shift occurred. - SourceFrameId string `json:"source_frame_id"` + // HoldKeys Modifier keys to hold during the drag + HoldKeys *[]string `json:"hold_keys,omitempty"` - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` + // Path Ordered list of [x, y] coordinate pairs to move through while dragging. Must contain at least 2 points. + Path [][]int `json:"path"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // Smooth Use human-like Bezier curves between path waypoints instead of linear interpolation. When true, steps_per_segment and step_delay_ms are ignored. + Smooth *bool `json:"smooth,omitempty"` - // Time Performance Timeline timestamp of the layout shift in milliseconds. - Time float32 `json:"time"` + // StepDelayMs Delay in milliseconds between relative steps while dragging. Ignored when smooth=true. + StepDelayMs *int `json:"step_delay_ms,omitempty"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` + // StepsPerSegment Number of relative move steps per segment in the path. Ignored when smooth=true. Minimum 1. + StepsPerSegment *int `json:"steps_per_segment,omitempty"` } -// BrowserPageLcpEvent A browser Largest Contentful Paint (LCP) event from the Performance Timeline API. -type BrowserPageLcpEvent struct { - Category BrowserPageLcpEventCategory `json:"category"` - Data *BrowserPageLcpEventData `json:"data,omitempty"` +// DragMouseRequestButton Mouse button to drag with +type DragMouseRequestButton string - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` +// Error defines model for Error. +type Error struct { + Message string `json:"message"` +} - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` +// ExecutePlaywrightRequest Request to execute Playwright code +type ExecutePlaywrightRequest struct { + // Code TypeScript/JavaScript code to execute. The code has access to 'page', 'context', and 'browser' variables. + // Example: "await page.goto('https://example.com'); return await page.title();" + Code string `json:"code"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageLcpEventType `json:"type"` + // TimeoutSec Maximum execution time in seconds. Default is 60. + TimeoutSec *int `json:"timeout_sec,omitempty"` } -// BrowserPageLcpEventCategory defines model for BrowserPageLcpEvent.Category. -type BrowserPageLcpEventCategory string +// ExecutePlaywrightResult Result of Playwright code execution +type ExecutePlaywrightResult struct { + // Error Error message if execution failed + Error *string `json:"error,omitempty"` -// BrowserPageLcpEventType defines model for BrowserPageLcpEvent.Type. -type BrowserPageLcpEventType string + // Result The value returned by the code (if any) + Result interface{} `json:"result,omitempty"` -// BrowserPageLcpEventData defines model for BrowserPageLcpEventData. -type BrowserPageLcpEventData struct { - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` + // Stderr Standard error from the execution + Stderr *string `json:"stderr,omitempty"` - // LcpDetails LargestContentfulPaint attributes from the Performance Timeline entry. - LcpDetails *struct { - // ElementId id attribute of the LCP element, if present. - ElementId *string `json:"element_id,omitempty"` + // Stdout Standard output from the execution + Stdout *string `json:"stdout,omitempty"` - // LoadTime Load time of the LCP element in milliseconds. - LoadTime *float32 `json:"load_time,omitempty"` + // Success Whether the code executed successfully + Success bool `json:"success"` +} - // NodeId CDP DOM node identifier of the LCP element. - NodeId *int `json:"node_id,omitempty"` +// ExtensionUploadMultipart defines model for ExtensionUploadMultipart. +type ExtensionUploadMultipart struct { + // Extensions List of extensions to upload and activate + Extensions []struct { + // Name Folder name to place the extension under /home/kernel/extensions/ + Name string `json:"name"` - // RenderTime Render time of the LCP element in milliseconds; 0 for cross-origin images without Timing-Allow-Origin. - RenderTime *float32 `json:"render_time,omitempty"` + // ZipFile Zip archive containing an unpacked Chromium extension (maximum 50 MiB; must include manifest.json) + ZipFile openapi_types.File `json:"zip_file"` + } `json:"extensions"` +} - // Size Visible area of the LCP element in pixels squared. - Size *float32 `json:"size,omitempty"` +// FileInfo defines model for FileInfo. +type FileInfo struct { + // IsDir Whether the path is a directory. + IsDir bool `json:"is_dir"` - // Url URL of the LCP element for image or video elements. - Url *string `json:"url,omitempty"` - } `json:"lcp_details,omitempty"` + // ModTime Last modification time. + ModTime time.Time `json:"mod_time"` - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` + // Mode File mode bits (e.g., "drwxr-xr-x" or "-rw-r--r--"). + Mode string `json:"mode"` - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` + // Name Base name of the file or directory. + Name string `json:"name"` - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` + // Path Absolute path. + Path string `json:"path"` - // SourceFrameId CDP frame identifier of the frame where the LCP element was rendered. - SourceFrameId string `json:"source_frame_id"` + // SizeBytes Size in bytes. 0 for directories. + SizeBytes int `json:"size_bytes"` +} - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` +// FileSystemEvent Filesystem change event. +type FileSystemEvent struct { + // IsDir Whether the affected path is a directory. + IsDir *bool `json:"is_dir,omitempty"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // Name Base name of the file or directory affected. + Name *string `json:"name,omitempty"` - // Time Performance Timeline timestamp of the LCP entry in milliseconds. - Time float32 `json:"time"` + // Path Absolute path of the file or directory. + Path string `json:"path"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` + // Type Event type. + Type FileSystemEventType `json:"type"` } -// BrowserPageLoadEvent A browser page load event (CDP Page.loadEventFired). -type BrowserPageLoadEvent struct { - Category BrowserPageLoadEventCategory `json:"category"` - Data *BrowserPageLoadEventData `json:"data,omitempty"` +// FileSystemEventType Event type. +type FileSystemEventType string + +// KnownBrowserTelemetryEvent Discriminated union of browser telemetry events emitted by the Kernel image. This is a structural taxonomy: any event on the telemetry stream whose `data` conforms to one of the variants below (selected by `type`) is a `KnownBrowserTelemetryEvent`, regardless of who published it. Caller-published events via POST /telemetry/events are not constrained to this union; see `TelemetryEvent` for the wire shape. Validation of caller payloads against this taxonomy is the consumer's responsibility. +type KnownBrowserTelemetryEvent struct { + union json.RawMessage +} - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` +// ListFiles Array of file or directory information entries. +type ListFiles = []FileInfo - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` +// LogEvent A log entry from the application. +type LogEvent struct { + // Message Log message text. + Message string `json:"message"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageLoadEventType `json:"type"` + // Timestamp Time the log entry was produced. + Timestamp time.Time `json:"timestamp"` } -// BrowserPageLoadEventCategory defines model for BrowserPageLoadEvent.Category. -type BrowserPageLoadEventCategory string +// MarkRecordingRequest defines model for MarkRecordingRequest. +type MarkRecordingRequest struct { + // Id Identifier of the recording session to mark, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the marker is added to the default recording session. + Id *string `json:"id,omitempty"` -// BrowserPageLoadEventType defines model for BrowserPageLoadEvent.Type. -type BrowserPageLoadEventType string + // Name Name of the marker, used as the MP4 chapter title. + Name string `json:"name"` +} -// BrowserPageLoadEventData defines model for BrowserPageLoadEventData. -type BrowserPageLoadEventData struct { - // CdpTimestamp Chrome monotonic clock value in seconds at which the load event fired, relative to browser process start (not Unix epoch). Use `ts` for wall-clock time. - CdpTimestamp float32 `json:"cdp_timestamp"` +// MarkRecordingResult defines model for MarkRecordingResult. +type MarkRecordingResult struct { + // Name Name of the recorded marker. + Name string `json:"name"` - // FrameId CDP frame identifier within the target. - FrameId *string `json:"frame_id,omitempty"` + // OffsetMs Provisional offset of the marker from the recording start, in milliseconds, measured against the start time at mark time. The authoritative offset is the chapter start written at finalize. + OffsetMs int64 `json:"offset_ms"` +} - // LoaderId CDP document loader identifier, reset on each navigation. - LoaderId *string `json:"loader_id,omitempty"` +// MousePositionResponse defines model for MousePositionResponse. +type MousePositionResponse struct { + // X X coordinate of the cursor + X int `json:"x"` - // NavSeq Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target. - NavSeq int64 `json:"nav_seq"` + // Y Y coordinate of the cursor + Y int `json:"y"` +} - // SessionId CDP session identifier for the target connection. - SessionId string `json:"session_id"` +// MoveMouseRequest defines model for MoveMouseRequest. +type MoveMouseRequest struct { + // DurationMs Target total duration in milliseconds for the mouse movement when smooth=true. Omit for automatic timing based on distance. + DurationMs *int `json:"duration_ms,omitempty"` - // TargetId Browser target identifier (stable across navigations within a tab). - TargetId string `json:"target_id"` + // HoldKeys Modifier keys to hold during the move + HoldKeys *[]string `json:"hold_keys,omitempty"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // Smooth Use human-like Bezier curve path instead of instant mouse movement. + Smooth *bool `json:"smooth,omitempty"` - // Url URL relevant to this event; page URL for navigation and page events, request URL for network events. - Url *string `json:"url,omitempty"` -} + // X X coordinate to move the cursor to + X int `json:"x"` -// BrowserPageNavigationEvent A browser page navigation started event (CDP Page.frameNavigated). Carries nav context fields inline but not nav_seq, as this event resets the navigation epoch. -type BrowserPageNavigationEvent struct { - Category BrowserPageNavigationEventCategory `json:"category"` - Data *BrowserPageNavigationEventData `json:"data,omitempty"` + // Y Y coordinate to move the cursor to + Y int `json:"y"` +} - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` +// MovePathRequest defines model for MovePathRequest. +type MovePathRequest struct { + // DestPath Absolute destination path. + DestPath string `json:"dest_path"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // SrcPath Absolute source path. + SrcPath string `json:"src_path"` +} - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageNavigationEventType `json:"type"` +// OkResponse Generic OK response. +type OkResponse struct { + // Ok Indicates success. + Ok bool `json:"ok"` } -// BrowserPageNavigationEventCategory defines model for BrowserPageNavigationEvent.Category. -type BrowserPageNavigationEventCategory string +// PatchDisplayRequest defines model for PatchDisplayRequest. +type PatchDisplayRequest struct { + // Height Display height in pixels + Height *int `json:"height,omitempty"` -// BrowserPageNavigationEventType defines model for BrowserPageNavigationEvent.Type. -type BrowserPageNavigationEventType string + // RefreshRate Display refresh rate in Hz. If omitted, uses the highest available rate for the resolution. + RefreshRate *PatchDisplayRequestRefreshRate `json:"refresh_rate,omitempty"` -// BrowserPageNavigationEventData defines model for BrowserPageNavigationEventData. -type BrowserPageNavigationEventData struct { - // FrameId CDP frame identifier of the navigated frame. - FrameId string `json:"frame_id"` + // RequireIdle If true, refuse to resize when live view or recording/replay is active. + RequireIdle *bool `json:"require_idle,omitempty"` - // LoaderId New CDP document loader identifier assigned for this navigation. - LoaderId string `json:"loader_id"` + // RestartChromium If true, restart Chromium after resolution change to ensure it adapts to new size. Default is false for headful, true for headless. + RestartChromium *bool `json:"restart_chromium,omitempty"` - // ParentFrameId Parent frame identifier for subframe navigations; absent for top-level navigations. - ParentFrameId *string `json:"parent_frame_id,omitempty"` + // Width Display width in pixels + Width *int `json:"width,omitempty"` +} - // SessionId CDP session identifier. - SessionId string `json:"session_id"` +// PatchDisplayRequestRefreshRate Display refresh rate in Hz. If omitted, uses the highest available rate for the resolution. +type PatchDisplayRequestRefreshRate int - // TargetId Browser target identifier. - TargetId string `json:"target_id"` +// PressKeyRequest defines model for PressKeyRequest. +type PressKeyRequest struct { + // Duration Duration to hold the keys down in milliseconds. If omitted or 0, keys are tapped. + Duration *int `json:"duration,omitempty"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // HoldKeys Optional modifier keys to hold during the key press sequence. + HoldKeys *[]string `json:"hold_keys,omitempty"` - // Url URL navigated to. - Url string `json:"url"` + // Keys List of key symbols to press. Each item should be a key symbol supported by xdotool + // (see X11 keysym definitions). Examples include "Return", "Shift", "Ctrl", "Alt", "F5". + // Items in this list could also be combinations, e.g. "Ctrl+t" or "Ctrl+Shift+Tab". + Keys []string `json:"keys"` } -// BrowserPageNavigationSettledEvent Emitted when page_dom_content_loaded and page_layout_settled have both fired for the same navigation, indicating the page is loaded and visually stable. Independent of network_idle; a single pending request does not block it. -type BrowserPageNavigationSettledEvent struct { - Category BrowserPageNavigationSettledEventCategory `json:"category"` +// ProcessExecRequest Request to execute a command synchronously. +type ProcessExecRequest struct { + // Args Command arguments. + Args *[]string `json:"args,omitempty"` - // Data Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred. - Data *BrowserEventContext `json:"data,omitempty"` + // AsRoot Run the process with root privileges. + AsRoot *bool `json:"as_root,omitempty"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // AsUser Run the process as this user. + AsUser *string `json:"as_user,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // Command Executable or shell command to run. + Command string `json:"command"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageNavigationSettledEventType `json:"type"` -} + // Cwd Working directory (absolute path) to run the command in. + Cwd *string `json:"cwd,omitempty"` -// BrowserPageNavigationSettledEventCategory defines model for BrowserPageNavigationSettledEvent.Category. -type BrowserPageNavigationSettledEventCategory string + // Env Environment variables to set for the process. + Env *map[string]string `json:"env,omitempty"` -// BrowserPageNavigationSettledEventType defines model for BrowserPageNavigationSettledEvent.Type. -type BrowserPageNavigationSettledEventType string + // TimeoutSec Maximum execution time in seconds. + TimeoutSec *int `json:"timeout_sec,omitempty"` +} -// BrowserPageTabOpenedEvent A new browser tab or target was opened (CDP Target.attachedToTarget for page targets). Fires before a CDP session is attached to the new target, so `session_id`, `frame_id`, `loader_id`, and `nav_seq` are absent; this event does not compose `BrowserEventContext`. Consumers reading context fields generically should treat it as a special case. -type BrowserPageTabOpenedEvent struct { - Category BrowserPageTabOpenedEventCategory `json:"category"` - Data *BrowserPageTabOpenedEventData `json:"data,omitempty"` +// ProcessExecResult Result of a synchronous command execution. +type ProcessExecResult struct { + // DurationMs Execution duration in milliseconds. + DurationMs *int `json:"duration_ms,omitempty"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // ExitCode Process exit code. + ExitCode *int `json:"exit_code,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // StderrB64 Base64-encoded stderr buffer. + StderrB64 *string `json:"stderr_b64,omitempty"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPageTabOpenedEventType `json:"type"` + // StdoutB64 Base64-encoded stdout buffer. + StdoutB64 *string `json:"stdout_b64,omitempty"` } -// BrowserPageTabOpenedEventCategory defines model for BrowserPageTabOpenedEvent.Category. -type BrowserPageTabOpenedEventCategory string - -// BrowserPageTabOpenedEventType defines model for BrowserPageTabOpenedEvent.Type. -type BrowserPageTabOpenedEventType string +// ProcessKillRequest Signal to send to the process. +type ProcessKillRequest struct { + // Signal Signal to send. + Signal ProcessKillRequestSignal `json:"signal"` +} -// BrowserPageTabOpenedEventData defines model for BrowserPageTabOpenedEventData. -type BrowserPageTabOpenedEventData struct { - // OpenerId Target identifier of the tab that opened this one, if any. - OpenerId *string `json:"opener_id,omitempty"` +// ProcessKillRequestSignal Signal to send. +type ProcessKillRequestSignal string - // TargetId CDP target identifier for the newly opened tab. - TargetId string `json:"target_id"` +// ProcessResizeRequest Resize a PTY-backed process. +type ProcessResizeRequest struct { + // Cols New terminal columns. + Cols int `json:"cols"` - // TargetType CDP target type of the page that produced the event. - TargetType BrowserTargetType `json:"target_type"` + // Rows New terminal rows. + Rows int `json:"rows"` +} - // Title Initial page title of the new tab. - Title *string `json:"title,omitempty"` +// ProcessSpawnRequest defines model for ProcessSpawnRequest. +type ProcessSpawnRequest struct { + // AllocateTty Allocate a pseudo-terminal (PTY) for the process to enable interactive shells. + AllocateTty *bool `json:"allocate_tty,omitempty"` - // Url Initial URL of the new tab. - Url string `json:"url"` -} + // Args Command arguments. + Args *[]string `json:"args,omitempty"` -// BrowserPlatformApiCallEvent A call that manages the browser VM rather than driving the browser, handled by the kernel-images-api server: recording lifecycle, filesystem and process management, telemetry and browser configuration. These are mostly platform-induced (e.g. profile save, replay capture) rather than agent actions. -type BrowserPlatformApiCallEvent struct { - Category BrowserPlatformApiCallEventCategory `json:"category"` + // AsRoot Run the process with root privileges. + AsRoot *bool `json:"as_root,omitempty"` - // Data Per-call payload for `platform_api_call` events. Metadata only: a platform call carries no submitted content, so there is no `code` field as there is on `api_call`. - Data *BrowserPlatformApiCallEventData `json:"data,omitempty"` + // AsUser Run the process as this user. + AsUser *string `json:"as_user,omitempty"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // Cols Initial terminal columns when allocate_tty is true. + Cols *int `json:"cols,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // Command Executable or shell command to run. + Command string `json:"command"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserPlatformApiCallEventType `json:"type"` -} + // Cwd Working directory (absolute path) to run the command in. + Cwd *string `json:"cwd,omitempty"` -// BrowserPlatformApiCallEventCategory defines model for BrowserPlatformApiCallEvent.Category. -type BrowserPlatformApiCallEventCategory string + // Env Environment variables to set for the process. + Env *map[string]string `json:"env,omitempty"` -// BrowserPlatformApiCallEventType defines model for BrowserPlatformApiCallEvent.Type. -type BrowserPlatformApiCallEventType string + // Rows Initial terminal rows when allocate_tty is true. + Rows *int `json:"rows,omitempty"` -// BrowserPlatformApiCallEventData Per-call payload for `platform_api_call` events. Metadata only: a platform call carries no submitted content, so there is no `code` field as there is on `api_call`. -type BrowserPlatformApiCallEventData struct { - // DurationMs Wall-clock duration of the handler in milliseconds. - DurationMs float32 `json:"duration_ms"` + // TimeoutSec Maximum execution time in seconds. + TimeoutSec *int `json:"timeout_sec,omitempty"` +} - // OperationId Matched route's operation, named as the server names its handler (e.g. `ProcessExec`, `StartRecording`). - OperationId string `json:"operation_id"` +// ProcessSpawnResult Information about a spawned process. +type ProcessSpawnResult struct { + // Pid OS process ID. + Pid *int `json:"pid,omitempty"` - // RequestId Per-request identifier from the kernel-images-api request middleware. - RequestId string `json:"request_id"` + // ProcessId Server-assigned identifier for the process. + ProcessId *openapi_types.UUID `json:"process_id,omitempty"` - // Status HTTP response status code. - Status int `json:"status"` + // StartedAt Timestamp when the process started. + StartedAt *time.Time `json:"started_at,omitempty"` } -// BrowserServiceCrashedEvent A managed service exited unexpectedly. Intentional stops (e.g. operator-initiated shutdown) do not produce this event — only unexpected exits and terminal restart-give-up transitions do. -type BrowserServiceCrashedEvent struct { - Category BrowserServiceCrashedEventCategory `json:"category"` +// ProcessStatus Current status of a process. +type ProcessStatus struct { + // CpuPct Estimated CPU usage percentage. + CpuPct *float32 `json:"cpu_pct,omitempty"` - // Data Per-crash payload for `service_crashed` events. Exit code and signal are not exposed by the underlying process manager on this channel, so only the service identity, the lifecycle phase the crash occurred in, and (when available) the PID are reported. - Data *BrowserServiceCrashedEventData `json:"data,omitempty"` + // ExitCode Exit code if the process has exited. + ExitCode *int `json:"exit_code,omitempty"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // MemBytes Estimated resident memory usage in bytes. + MemBytes *int `json:"mem_bytes,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // State Process state. + State *ProcessStatusState `json:"state,omitempty"` +} - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserServiceCrashedEventType `json:"type"` +// ProcessStatusState Process state. +type ProcessStatusState string + +// ProcessStdinRequest Data to write to the process standard input. +type ProcessStdinRequest struct { + // DataB64 Base64-encoded data to write. + DataB64 string `json:"data_b64"` } -// BrowserServiceCrashedEventCategory defines model for BrowserServiceCrashedEvent.Category. -type BrowserServiceCrashedEventCategory string +// ProcessStdinResult Result of writing to stdin. +type ProcessStdinResult struct { + // WrittenBytes Number of bytes written. + WrittenBytes *int `json:"written_bytes,omitempty"` +} -// BrowserServiceCrashedEventType defines model for BrowserServiceCrashedEvent.Type. -type BrowserServiceCrashedEventType string +// ProcessStreamEvent SSE payload representing process output or lifecycle events. +type ProcessStreamEvent struct { + // DataB64 Base64-encoded data from the process stream. + DataB64 *string `json:"data_b64,omitempty"` -// BrowserServiceCrashedEventData Per-crash payload for `service_crashed` events. Exit code and signal are not exposed by the underlying process manager on this channel, so only the service identity, the lifecycle phase the crash occurred in, and (when available) the PID are reported. -type BrowserServiceCrashedEventData struct { - // Phase Lifecycle phase the crash occurred in. `startup` means the process died before it ever reached a healthy running state. `running` means a previously healthy process died unexpectedly. `gave_up` means the process manager exhausted its restart attempts and stopped trying; no further `service_crashed` events will fire for this service until something restarts it. - Phase BrowserServiceCrashedEventDataPhase `json:"phase"` + // Event Lifecycle event type. + Event *ProcessStreamEventEvent `json:"event,omitempty"` - // Pid PID of the crashed process. Absent when the process manager gave up after exhausting restart attempts and is no longer tracking a live PID. - Pid *int `json:"pid,omitempty"` + // ExitCode Exit code when the event is "exit". + ExitCode *int `json:"exit_code,omitempty"` - // ServiceName Program name of the crashed service (e.g. `chromium`, `mutter`, `kernel-images-api`). - ServiceName string `json:"service_name"` + // Stream Source stream of the data chunk. + Stream *ProcessStreamEventStream `json:"stream,omitempty"` } -// BrowserServiceCrashedEventDataPhase Lifecycle phase the crash occurred in. `startup` means the process died before it ever reached a healthy running state. `running` means a previously healthy process died unexpectedly. `gave_up` means the process manager exhausted its restart attempts and stopped trying; no further `service_crashed` events will fire for this service until something restarts it. -type BrowserServiceCrashedEventDataPhase string +// ProcessStreamEventEvent Lifecycle event type. +type ProcessStreamEventEvent string -// BrowserSystemOomKillEvent The Linux kernel OOM-killer terminated a process inside the VM. Sourced from `/dev/kmsg`. Fires for any process killed by the kernel due to memory exhaustion, including Chrome renderer subprocesses that are not supervised. -type BrowserSystemOomKillEvent struct { - Category BrowserSystemOomKillEventCategory `json:"category"` +// ProcessStreamEventStream Source stream of the data chunk. +type ProcessStreamEventStream string - // Data Per-kill payload for `system_oom_kill` events. - Data *BrowserSystemOomKillEventData `json:"data,omitempty"` +// PublishEventRequest Request body for publishing an event into the telemetry stream. +type PublishEventRequest struct { + // Category Event category. Optional and advisory: for a known event `type` the server assigns the category authoritatively and ignores this field. It is only used for unknown custom types, where it is required. + Category *PublishEventRequestCategory `json:"category,omitempty"` - // Source Provenance metadata identifying which producer emitted the event. - Source BrowserEventSource `json:"source"` + // Data Telemetry event payload. + Data interface{} `json:"data,omitempty"` - // Truncated True if the data field was truncated due to size limits. - Truncated *bool `json:"truncated,omitempty"` + // Source Provenance metadata identifying which producer emitted the event. + Source *BrowserEventSource `json:"source,omitempty"` - // Ts Event timestamp in Unix microseconds. - Ts int64 `json:"ts"` - Type BrowserSystemOomKillEventType `json:"type"` + // Type Event type identifier. + Type string `json:"type"` } -// BrowserSystemOomKillEventCategory defines model for BrowserSystemOomKillEvent.Category. -type BrowserSystemOomKillEventCategory string - -// BrowserSystemOomKillEventType defines model for BrowserSystemOomKillEvent.Type. -type BrowserSystemOomKillEventType string +// PublishEventRequestCategory Event category. Optional and advisory: for a known event `type` the server assigns the category authoritatively and ignores this field. It is only used for unknown custom types, where it is required. +type PublishEventRequestCategory string -// BrowserSystemOomKillEventData Per-kill payload for `system_oom_kill` events. -type BrowserSystemOomKillEventData struct { - // Constraint Why the kernel decided to OOM-kill. `none` means global memory exhaustion; `memcg` means a cgroup memory limit was hit; `cpuset` / `memory_policy` are NUMA/policy-driven kills. Absent on kernels older than 5.0 which did not emit the structured `oom-kill:` line. - Constraint *BrowserSystemOomKillEventDataConstraint `json:"constraint,omitempty"` +// RecorderInfo defines model for RecorderInfo. +type RecorderInfo struct { + // FinishedAt Timestamp when recording finished + FinishedAt *time.Time `json:"finished_at,omitempty"` + Id string `json:"id"` + IsRecording bool `json:"isRecording"` - // MemFreeKb Free system memory in KiB at the time of the kill, derived from the `free:N` field in the kernel's Mem-Info dump. Assumes a 4 KiB page size. Does not include reclaimable caches, so a small value with a large `mem_total_kb` may still mean the system was not under hard pressure. Absent if the kernel did not emit a parseable Mem-Info section. - MemFreeKb *int `json:"mem_free_kb,omitempty"` + // StartedAt Timestamp when recording started + StartedAt *time.Time `json:"started_at,omitempty"` +} - // MemTotalKb Total system memory in KiB at the time of the kill, derived from the `N pages RAM` line in the kernel's Mem-Info dump. Assumes a 4 KiB page size. Absent if the kernel did not emit a parseable Mem-Info section. - MemTotalKb *int `json:"mem_total_kb,omitempty"` +// ScreenshotRegion defines model for ScreenshotRegion. +type ScreenshotRegion struct { + // Height Height of the region in pixels + Height int `json:"height"` - // Pid PID of the killed process. - Pid int `json:"pid"` + // Width Width of the region in pixels + Width int `json:"width"` - // ProcessName Comm of the killed process as reported by the kernel (max 15 chars, truncated by the kernel). - ProcessName string `json:"process_name"` + // X X coordinate of the region's top-left corner + X int `json:"x"` - // RssKb Resident set size of the killed process in KiB (sum of anon-rss, file-rss, and shmem-rss). This is the physical memory the process was using at the time of the kill. - RssKb int `json:"rss_kb"` + // Y Y coordinate of the region's top-left corner + Y int `json:"y"` +} - // TopTasks Top processes by resident-set-size at the moment of the kill, sorted descending. Sourced from the kernel's `Tasks state` table. Empty if the kernel did not emit the table. Capped at 5 entries to bound payload size. - TopTasks *[]BrowserSystemOomKillTask `json:"top_tasks,omitempty"` +// ScreenshotRequest defines model for ScreenshotRequest. +type ScreenshotRequest struct { + Region *ScreenshotRegion `json:"region,omitempty"` +} - // TriggerPid PID of the triggering process. Absent if the kernel did not emit the standard `CPU: N PID: N Comm:` header line. - TriggerPid *int `json:"trigger_pid,omitempty"` +// ScrollRequest defines model for ScrollRequest. +type ScrollRequest struct { + // DeltaX Horizontal scroll amount. Positive scrolls right, negative scrolls left. + DeltaX *int `json:"delta_x,omitempty"` - // TriggerProcessName Comm of the process whose allocation request caused the kernel to invoke the OOM-killer. Often the same as `process_name` (the kernel killed the requester) but can differ when the kernel chose a different victim. Max 15 chars, truncated by the kernel. - TriggerProcessName *string `json:"trigger_process_name,omitempty"` -} + // DeltaY Vertical scroll amount. Positive scrolls down, negative scrolls up. + DeltaY *int `json:"delta_y,omitempty"` -// BrowserSystemOomKillEventDataConstraint Why the kernel decided to OOM-kill. `none` means global memory exhaustion; `memcg` means a cgroup memory limit was hit; `cpuset` / `memory_policy` are NUMA/policy-driven kills. Absent on kernels older than 5.0 which did not emit the structured `oom-kill:` line. -type BrowserSystemOomKillEventDataConstraint string + // HoldKeys Modifier keys to hold during the scroll + HoldKeys *[]string `json:"hold_keys,omitempty"` -// BrowserSystemOomKillTask A single process entry from the kernel's `Tasks state` dump. -type BrowserSystemOomKillTask struct { - // Name Comm of the process (max 15 chars, truncated by the kernel). - Name string `json:"name"` + // X X coordinate at which to perform the scroll + X int `json:"x"` - // Pid PID of the process. - Pid int `json:"pid"` + // Y Y coordinate at which to perform the scroll + Y int `json:"y"` +} - // RssKb Resident set size in KiB at the moment of the kill. - RssKb int `json:"rss_kb"` +// SetCursorRequest defines model for SetCursorRequest. +type SetCursorRequest struct { + // Hidden Whether the cursor should be hidden + Hidden bool `json:"hidden"` } -// BrowserTargetType CDP target type of the page that produced the event. -type BrowserTargetType string +// SetFilePermissionsRequest defines model for SetFilePermissionsRequest. +type SetFilePermissionsRequest struct { + // Group New group name or GID. + Group *string `json:"group,omitempty"` -// BrowserTelemetryCategoriesConfig Per-category telemetry capture settings for browser events. -type BrowserTelemetryCategoriesConfig struct { - // Captcha Captcha solve attempt outcomes. - Captcha *BrowserTelemetryCategoryConfig `json:"captcha,omitempty"` + // Mode File mode bits (octal string, e.g. 644). + Mode string `json:"mode"` - // Connection Client attach/detach lifecycle for the CDP proxy and live view. - Connection *BrowserTelemetryCategoryConfig `json:"connection,omitempty"` + // Owner New owner username or UID. + Owner *string `json:"owner,omitempty"` - // Console Console output (log, warn, error) and uncaught exceptions. - Console *BrowserTelemetryCategoryConfig `json:"console,omitempty"` + // Path Absolute path whose permissions are to be changed. + Path string `json:"path"` +} - // Control Agent-driven actions against the browser — computer-control calls, Playwright code execution, screenshots and clipboard access. - Control *BrowserTelemetryCategoryConfig `json:"control,omitempty"` +// SleepAction Pause execution for a specified duration. +type SleepAction struct { + // DurationMs Duration to sleep in milliseconds. + DurationMs int `json:"duration_ms"` +} - // Interaction User interaction events (clicks, keydowns, scroll). - Interaction *BrowserTelemetryCategoryConfig `json:"interaction,omitempty"` +// StartFsWatchRequest defines model for StartFsWatchRequest. +type StartFsWatchRequest struct { + // Path Directory to watch. + Path string `json:"path"` - // Network HTTP request/response metadata. - Network *BrowserTelemetryCategoryConfig `json:"network,omitempty"` + // Recursive Whether to watch recursively. + Recursive *bool `json:"recursive,omitempty"` +} - // Page Page lifecycle events (navigation, load, layout shifts, LCP). - Page *BrowserTelemetryCategoryConfig `json:"page,omitempty"` +// StartRecordingRequest defines model for StartRecordingRequest. +type StartRecordingRequest struct { + // Framerate Recording framerate in fps (overrides server default) + Framerate *int `json:"framerate,omitempty"` - // Platform Calls that manage the VM rather than drive the browser (recording, filesystem, process, telemetry and browser configuration). Mostly platform-induced; off by default and opt-in. - Platform *BrowserTelemetryCategoryConfig `json:"platform,omitempty"` + // Id Optional identifier for this recording session, used to target it from the other /recording endpoints (stop, mark, download, delete) and allowing multiple concurrent recordings. Alphanumeric or hyphen. When omitted, the default recording session is started. + Id *string `json:"id,omitempty"` - // Screenshot Periodic base64-encoded viewport screenshots. High volume; off by default and opt-in. - Screenshot *BrowserTelemetryCategoryConfig `json:"screenshot,omitempty"` + // MaxDurationInSeconds Maximum recording duration in seconds (overrides server default) + MaxDurationInSeconds *int `json:"maxDurationInSeconds,omitempty"` - // System Browser VM health, such as out-of-memory kills and managed-service crashes. - System *BrowserTelemetryCategoryConfig `json:"system,omitempty"` -} + // MaxFileSizeInMB Maximum file size in MB (overrides server default) + MaxFileSizeInMB *int `json:"maxFileSizeInMB,omitempty"` -// BrowserTelemetryCategoryConfig Configuration for a single telemetry category. -type BrowserTelemetryCategoryConfig struct { - // Enabled Whether this category is captured. In PUT requests selection is opt-in: omitting this field (or the whole category) leaves the category off, so a PUT captures exactly the categories set to true. In PATCH requests, omitting this field (or sending an empty object `{}`) is a no-op; the category retains its current state. To enable or disable a category via PATCH, you must send an explicit `true` or `false`. - Enabled *bool `json:"enabled,omitempty"` + // RecordAudio Capture audio alongside video. Requires the server to have an audio source and PulseAudio socket configured (the image sets both by default). When false the recording is video-only. + RecordAudio *bool `json:"recordAudio,omitempty"` } -// BrowserTelemetryConfig Telemetry configuration for a browser. Selection is opt-in. Omit the browser key (or send an empty object) to capture the default set: lightweight operational signals (control, connection, system, captcha). Within `browser`, only the categories you set enabled: true are captured; anything omitted is off. The CDP categories (console, network, page, interaction), `screenshot` and `platform` are off by default and must be opted into. A `browser` config with nothing enabled clears the telemetry configuration. The `monitor` category (CDP collector health) is not configurable here; it flows automatically whenever a CDP category is captured. -type BrowserTelemetryConfig struct { - // Browser Per-category telemetry capture settings for browser events. - Browser *BrowserTelemetryCategoriesConfig `json:"browser,omitempty"` +// StopRecordingRequest defines model for StopRecordingRequest. +type StopRecordingRequest struct { + // ForceStop Immediately stop without graceful shutdown. This may result in a corrupted video file. + ForceStop *bool `json:"forceStop,omitempty"` - // Export Forwarding of captured telemetry to an external destination. Independent of what is captured: export is off unless explicitly enabled here, even when an export destination is configured. In a PUT (full replace) an omitted export block resets export to off, the same as omitted categories turn off; in a PATCH an omitted field leaves the current setting unchanged. - Export *BrowserTelemetryExportConfig `json:"export,omitempty"` + // Id Identifier of the recording session to stop, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the default recording session is stopped. + Id *string `json:"id,omitempty"` } -// BrowserTelemetryExportConfig Forwarding of captured telemetry to an external destination. Independent of what is captured: export is off unless explicitly enabled here, even when an export destination is configured. In a PUT (full replace) an omitted export block resets export to off, the same as omitted categories turn off; in a PATCH an omitted field leaves the current setting unchanged. -type BrowserTelemetryExportConfig struct { - // Otlp OTLP/HTTP export settings. - Otlp *BrowserTelemetryOTLPExportConfig `json:"otlp,omitempty"` -} +// TelemetryEnvelope The envelope assigned to a successfully published event. +type TelemetryEnvelope struct { + // Event A telemetry event. The wire-level event shape accepted by the publish endpoint and emitted on the SSE stream. Arbitrary `type` strings and `data` payloads are admitted. For browser events emitted by the Kernel image, `data` conforms to the per-type schema documented in the `Browser*Event` / `Browser*EventData` definitions, selected by `type`. + Event TelemetryEvent `json:"event"` -// BrowserTelemetryOTLPExportConfig OTLP/HTTP export settings. -type BrowserTelemetryOTLPExportConfig struct { - // Enabled Whether captured telemetry is forwarded to the configured OTLP destination. Off by default. Has no effect (export stays inactive) when no export destination is configured. - Enabled *bool `json:"enabled,omitempty"` + // Seq Process-monotonic sequence number assigned across the lifetime of the server. Use with Last-Event-ID to resume the SSE stream from this point. + Seq int64 `json:"seq"` } -// ChromiumConfigureError Failure from batched chromium configure — includes which phase failed. -type ChromiumConfigureError struct { - Message string `json:"message"` +// TelemetryEvent A telemetry event. The wire-level event shape accepted by the publish endpoint and emitted on the SSE stream. Arbitrary `type` strings and `data` payloads are admitted. For browser events emitted by the Kernel image, `data` conforms to the per-type schema documented in the `Browser*Event` / `Browser*EventData` definitions, selected by `type`. +type TelemetryEvent struct { + // Category Event category. + Category *TelemetryEventCategory `json:"category,omitempty"` - // Phase configure_phase maps to restart/filesystem/policy/extension/profile/display work; navigate_phase is retained for compatibility. - Phase ChromiumConfigureErrorPhase `json:"phase"` + // Data Arbitrary JSON payload. For browser events listed in `KnownBrowserTelemetryEvent`, the payload conforms to the corresponding `Browser*EventData` schema. + Data interface{} `json:"data,omitempty"` - // Step Optional configure step that failed. - Step *ChromiumConfigureErrorStep `json:"step,omitempty"` -} + // Source Provenance metadata identifying which producer emitted the event. + Source *BrowserEventSource `json:"source,omitempty"` -// ChromiumConfigureErrorPhase configure_phase maps to restart/filesystem/policy/extension/profile/display work; navigate_phase is retained for compatibility. -type ChromiumConfigureErrorPhase string + // Truncated Set by the server when the data field was truncated to fit the size limit. + Truncated *bool `json:"truncated,omitempty"` -// ChromiumConfigureErrorStep Optional configure step that failed. -type ChromiumConfigureErrorStep string + // Ts Unix timestamp in microseconds. Defaults to the current time when omitted. + Ts *int64 `json:"ts,omitempty"` -// ClickMouseRequest defines model for ClickMouseRequest. -type ClickMouseRequest struct { - // Button Mouse button to interact with - Button *ClickMouseRequestButton `json:"button,omitempty"` + // Type Event type identifier. + Type string `json:"type"` +} - // ClickType Type of click action - ClickType *ClickMouseRequestClickType `json:"click_type,omitempty"` +// TelemetryEventCategory Event category. +type TelemetryEventCategory string - // HoldKeys Modifier keys to hold during the click - HoldKeys *[]string `json:"hold_keys,omitempty"` +// TelemetryState Current telemetry configuration. +type TelemetryState struct { + // AppliedAt Wall-clock time at which the current configuration was applied. Omitted when telemetry is not configured. + AppliedAt *time.Time `json:"applied_at,omitempty"` - // NumClicks Number of times to repeat the click - NumClicks *int `json:"num_clicks,omitempty"` + // Config Telemetry configuration for a browser. Selection is opt-in. Omit the browser key (or send an empty object) to capture the default set: lightweight operational signals (control, connection, system, captcha). Within `browser`, only the categories you set enabled: true are captured; anything omitted is off. The CDP categories (console, network, page, interaction), `screenshot` and `platform` are off by default and must be opted into. A `browser` config with nothing enabled clears the telemetry configuration. The `monitor` category (CDP collector health) is not configurable here; it flows automatically whenever a CDP category is captured. + Config BrowserTelemetryConfig `json:"config"` - // X X coordinate of the click position - X int `json:"x"` + // DroppedEvents Cumulative number of buffered events a consumer missed because it fell behind the ring, summed across consumers and configuration changes. A rising count means the stream is being produced faster than it is being read; a steady one means nothing has been lost. Always present on images that report it; absent on an image predating the field, which is not the same as zero. + DroppedEvents *int64 `json:"dropped_events,omitempty"` - // Y Y coordinate of the click position - Y int `json:"y"` + // Seq Process-monotonic sequence number of the last published event. Does not reset across configuration changes. + Seq int64 `json:"seq"` } -// ClickMouseRequestButton Mouse button to interact with -type ClickMouseRequestButton string +// TypeTextRequest defines model for TypeTextRequest. +type TypeTextRequest struct { + // Delay Delay in milliseconds between keystrokes. Ignored when smooth is true. + Delay *int `json:"delay,omitempty"` -// ClickMouseRequestClickType Type of click action -type ClickMouseRequestClickType string + // Smooth Use human-like variable keystroke timing instead of a fixed delay. + // Defaults to true (same as moveMouse/dragMouse). Set to false for + // xdotool typing with an optional fixed delay between keys (delay=0 is instant). + // When true, text is typed in word-sized chunks with variable intra-word delays + // and natural inter-word pauses. The delay field is ignored when smooth is true. + Smooth *bool `json:"smooth,omitempty"` -// ClipboardContent defines model for ClipboardContent. -type ClipboardContent struct { - // Text Current clipboard text content + // Text Text to type on the host computer Text string `json:"text"` -} - -// ComputerAction A single computer action to execute as part of a batch. The `type` field selects which -// action to perform, and the corresponding field contains the action parameters. -// Exactly one action field matching the type must be provided. -type ComputerAction struct { - ClickMouse *ClickMouseRequest `json:"click_mouse,omitempty"` - DragMouse *DragMouseRequest `json:"drag_mouse,omitempty"` - MoveMouse *MoveMouseRequest `json:"move_mouse,omitempty"` - PressKey *PressKeyRequest `json:"press_key,omitempty"` - Scroll *ScrollRequest `json:"scroll,omitempty"` - SetCursor *SetCursorRequest `json:"set_cursor,omitempty"` - // Sleep Pause execution for a specified duration. - Sleep *SleepAction `json:"sleep,omitempty"` + // TypoChance Per-character typo injection rate; mistakes are corrected with backspace. + // Default 0. Only applies when smooth is true (silently ignored when + // smooth is false). + TypoChance *float32 `json:"typo_chance,omitempty"` +} - // Type The type of action to perform. - Type ComputerActionType `json:"type"` - TypeText *TypeTextRequest `json:"type_text,omitempty"` +// WriteClipboardRequest defines model for WriteClipboardRequest. +type WriteClipboardRequest struct { + // Text Text to write to the system clipboard + Text string `json:"text"` } -// ComputerActionType The type of action to perform. -type ComputerActionType string +// BadRequestError defines model for BadRequestError. +type BadRequestError = Error -// CreateDirectoryRequest defines model for CreateDirectoryRequest. -type CreateDirectoryRequest struct { - // Mode Optional directory mode (octal string, e.g. 755). Defaults to 755. - Mode *string `json:"mode,omitempty"` +// ConflictError defines model for ConflictError. +type ConflictError = Error - // Path Absolute directory path to create. - Path string `json:"path"` -} +// InternalError defines model for InternalError. +type InternalError = Error -// DeletePathRequest defines model for DeletePathRequest. -type DeletePathRequest struct { - // Path Absolute path to delete. - Path string `json:"path"` -} +// NotFoundError defines model for NotFoundError. +type NotFoundError = Error -// DeleteRecordingRequest defines model for DeleteRecordingRequest. -type DeleteRecordingRequest struct { - // Id Identifier of the recording session to delete, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the default recording session is deleted. - Id *string `json:"id,omitempty"` +// PatchChromiumFlagsJSONBody defines parameters for PatchChromiumFlags. +type PatchChromiumFlagsJSONBody struct { + // Flags Chromium flags to merge (e.g., ["--kiosk", "--disable-gpu"]) + Flags []string `json:"flags"` } -// DisplayConfig defines model for DisplayConfig. -type DisplayConfig struct { - // Height Current display height in pixels - Height *int `json:"height,omitempty"` +// PatchChromiumPoliciesJSONBody defines parameters for PatchChromiumPolicies. +type PatchChromiumPoliciesJSONBody map[string]interface{} - // RefreshRate Current display refresh rate in Hz (may be null if not detectable) - RefreshRate *int `json:"refresh_rate,omitempty"` +// ChromiumConfigureMultipartBody defines parameters for ChromiumConfigure. +type ChromiumConfigureMultipartBody struct { + // ChromePolicies UTF-8 JSON policy override map — same semantics as PATCH /chromium/policies. + ChromePolicies *string `json:"chrome_policies,omitempty"` - // Width Current display width in pixels - Width *int `json:"width,omitempty"` -} + // ChromiumFlags UTF-8 JSON object `{"flags":["--kiosk"]}` — same semantics as PATCH /chromium/flags. + ChromiumFlags *string `json:"chromium_flags,omitempty"` -// DragMouseRequest defines model for DragMouseRequest. -type DragMouseRequest struct { - // Button Mouse button to drag with - Button *DragMouseRequestButton `json:"button,omitempty"` + // Display UTF-8 JSON object matching `#/components/schemas/PatchDisplayRequest` (width/height/etc.). When combined with restart-triggering fields, the resize is applied while Chromium is stopped and Chromium is started once at the end. + Display *string `json:"display,omitempty"` - // Delay Delay in milliseconds between button down and starting to move along the path. - Delay *int `json:"delay,omitempty"` + // Extensions Extension zips paired with consecutive extensions.name fields (same as upload-extensions-and-restart). + Extensions *[]struct { + Name string `json:"name"` + ZipFile openapi_types.File `json:"zip_file"` + } `json:"extensions,omitempty"` - // DurationMs Target total duration in milliseconds for the entire drag movement when smooth=true. Omit for automatic timing based on total path length. - DurationMs *int `json:"duration_ms,omitempty"` + // ProfileArchive tar.zst archive containing the desired `/home/kernel/user-data` profile contents. Prefer archives whose root entries are the profile files/directories themselves (for example `Default/Preferences`). Use `strip_components` only when uploading an archive that includes leading wrapper directories. + ProfileArchive *openapi_types.File `json:"profile_archive,omitempty"` - // HoldKeys Modifier keys to hold during the drag - HoldKeys *[]string `json:"hold_keys,omitempty"` + // StartUrl URL text to navigate after configure. Bare hosts are normalized to https://, length is capped at 2048 bytes, and Chrome decides which schemes are navigable. + StartUrl *string `json:"start_url,omitempty"` - // Path Ordered list of [x, y] coordinate pairs to move through while dragging. Must contain at least 2 points. - Path [][]int `json:"path"` + // StripComponents Optional number of leading path components to strip from profile_archive entries (non-negative integer as text). + StripComponents *string `json:"strip_components,omitempty"` +} - // Smooth Use human-like Bezier curves between path waypoints instead of linear interpolation. When true, steps_per_segment and step_delay_ms are ignored. - Smooth *bool `json:"smooth,omitempty"` +// DownloadDirZipParams defines parameters for DownloadDirZip. +type DownloadDirZipParams struct { + // Path Absolute directory path to archive and download. + Path string `form:"path" json:"path"` +} - // StepDelayMs Delay in milliseconds between relative steps while dragging. Ignored when smooth=true. - StepDelayMs *int `json:"step_delay_ms,omitempty"` +// DownloadDirZstdParams defines parameters for DownloadDirZstd. +type DownloadDirZstdParams struct { + // Path Absolute directory path to archive and download. + Path string `form:"path" json:"path"` - // StepsPerSegment Number of relative move steps per segment in the path. Ignored when smooth=true. Minimum 1. - StepsPerSegment *int `json:"steps_per_segment,omitempty"` + // CompressionLevel Compression level. Higher levels produce smaller archives but take longer. + // - fastest: ~zstd level 1, maximum speed (~300-500 MB/s) + // - default: ~zstd level 3, balanced speed/ratio (~150 MB/s) + // - better: ~zstd level 7, better ratio (~50-80 MB/s) + // - best: ~zstd level 11, best ratio (~20-40 MB/s) + CompressionLevel *DownloadDirZstdParamsCompressionLevel `form:"compression_level,omitempty" json:"compression_level,omitempty"` } -// DragMouseRequestButton Mouse button to drag with -type DragMouseRequestButton string +// DownloadDirZstdParamsCompressionLevel defines parameters for DownloadDirZstd. +type DownloadDirZstdParamsCompressionLevel string -// Error defines model for Error. -type Error struct { - Message string `json:"message"` +// FileInfoParams defines parameters for FileInfo. +type FileInfoParams struct { + // Path Absolute path of the file or directory. + Path string `form:"path" json:"path"` } -// ExecutePlaywrightRequest Request to execute Playwright code -type ExecutePlaywrightRequest struct { - // Code TypeScript/JavaScript code to execute. The code has access to 'page', 'context', and 'browser' variables. - // Example: "await page.goto('https://example.com'); return await page.title();" - Code string `json:"code"` +// ListFilesParams defines parameters for ListFiles. +type ListFilesParams struct { + // Path Absolute directory path. + Path string `form:"path" json:"path"` +} - // TimeoutSec Maximum execution time in seconds. Default is 60. - TimeoutSec *int `json:"timeout_sec,omitempty"` +// ReadFileParams defines parameters for ReadFile. +type ReadFileParams struct { + // Path Absolute file path to read. + Path string `form:"path" json:"path"` +} + +// UploadFilesMultipartBody defines parameters for UploadFiles. +type UploadFilesMultipartBody struct { + Files []struct { + // DestPath Absolute destination path to write the file. + DestPath string `json:"dest_path"` + File openapi_types.File `json:"file"` + } `json:"files"` } -// ExecutePlaywrightResult Result of Playwright code execution -type ExecutePlaywrightResult struct { - // Error Error message if execution failed - Error *string `json:"error,omitempty"` - - // Result The value returned by the code (if any) - Result interface{} `json:"result,omitempty"` +// UploadZipMultipartBody defines parameters for UploadZip. +type UploadZipMultipartBody struct { + // DestPath Absolute destination directory to extract the archive to. + DestPath string `json:"dest_path"` + ZipFile openapi_types.File `json:"zip_file"` +} - // Stderr Standard error from the execution - Stderr *string `json:"stderr,omitempty"` +// UploadZstdMultipartBody defines parameters for UploadZstd. +type UploadZstdMultipartBody struct { + // Archive The tar.zst archive file. + Archive openapi_types.File `json:"archive"` - // Stdout Standard output from the execution - Stdout *string `json:"stdout,omitempty"` + // DestPath Absolute destination directory to extract the archive to. + DestPath string `json:"dest_path"` - // Success Whether the code executed successfully - Success bool `json:"success"` + // StripComponents Number of leading path components to strip during extraction (like tar --strip-components). + StripComponents *int `json:"strip_components,omitempty"` } -// FileInfo defines model for FileInfo. -type FileInfo struct { - // IsDir Whether the path is a directory. - IsDir bool `json:"is_dir"` - - // ModTime Last modification time. - ModTime time.Time `json:"mod_time"` +// WriteFileParams defines parameters for WriteFile. +type WriteFileParams struct { + // Path Destination absolute file path. + Path string `form:"path" json:"path"` - // Mode File mode bits (e.g., "drwxr-xr-x" or "-rw-r--r--"). - Mode string `json:"mode"` + // Mode Optional file mode (octal string, e.g. 644). Defaults to 644. + Mode *string `form:"mode,omitempty" json:"mode,omitempty"` +} - // Name Base name of the file or directory. - Name string `json:"name"` +// LogsStreamParams defines parameters for LogsStream. +type LogsStreamParams struct { + Source LogsStreamParamsSource `form:"source" json:"source"` + Follow *bool `form:"follow,omitempty" json:"follow,omitempty"` - // Path Absolute path. - Path string `json:"path"` + // Path only required if source is path + Path *string `form:"path,omitempty" json:"path,omitempty"` - // SizeBytes Size in bytes. 0 for directories. - SizeBytes int `json:"size_bytes"` + // SupervisorProcess only required if source is supervisor + SupervisorProcess *string `form:"supervisor_process,omitempty" json:"supervisor_process,omitempty"` } -// FileSystemEvent Filesystem change event. -type FileSystemEvent struct { - // IsDir Whether the affected path is a directory. - IsDir *bool `json:"is_dir,omitempty"` +// LogsStreamParamsSource defines parameters for LogsStream. +type LogsStreamParamsSource string - // Name Base name of the file or directory affected. - Name *string `json:"name,omitempty"` +// DownloadRecordingParams defines parameters for DownloadRecording. +type DownloadRecordingParams struct { + // Id Identifier of the recording session to download, as passed to /recording/start. When omitted, the default recording session is downloaded. + Id *string `form:"id,omitempty" json:"id,omitempty"` +} - // Path Absolute path of the file or directory. - Path string `json:"path"` +// StreamTelemetryEventsParams defines parameters for StreamTelemetryEvents. +type StreamTelemetryEventsParams struct { + // Replay Pass `all` to start from the oldest retained event. Ring buffer caps at 1024; older events are evicted and surface as a first `id` greater than 1. + Replay *StreamTelemetryEventsParamsReplay `form:"replay,omitempty" json:"replay,omitempty"` - // Type Event type. - Type FileSystemEventType `json:"type"` + // LastEventID Resume after this sequence number. Omit or send 0 to start from the current position. Sequence numbers are process-monotonic, so any previous value resumes correctly from that point. Takes precedence over `replay` when both are present, so SSE auto-reconnect resumes cleanly instead of re-replaying history. + LastEventID *string `json:"Last-Event-ID,omitempty"` } -// FileSystemEventType Event type. -type FileSystemEventType string +// StreamTelemetryEventsParamsReplay defines parameters for StreamTelemetryEvents. +type StreamTelemetryEventsParamsReplay string -// KnownBrowserTelemetryEvent Discriminated union of browser telemetry events emitted by the Kernel image. This is a structural taxonomy: any event on the telemetry stream whose `data` conforms to one of the variants below (selected by `type`) is a `KnownBrowserTelemetryEvent`, regardless of who published it. Caller-published events via POST /telemetry/events are not constrained to this union; see `TelemetryEvent` for the wire shape. Validation of caller payloads against this taxonomy is the consumer's responsibility. -type KnownBrowserTelemetryEvent struct { - union json.RawMessage -} +// PatchChromiumFlagsJSONRequestBody defines body for PatchChromiumFlags for application/json ContentType. +type PatchChromiumFlagsJSONRequestBody PatchChromiumFlagsJSONBody -// ListFiles Array of file or directory information entries. -type ListFiles = []FileInfo +// PatchChromiumPoliciesJSONRequestBody defines body for PatchChromiumPolicies for application/json ContentType. +type PatchChromiumPoliciesJSONRequestBody PatchChromiumPoliciesJSONBody -// LogEvent A log entry from the application. -type LogEvent struct { - // Message Log message text. - Message string `json:"message"` +// UploadExtensionsMultipartRequestBody defines body for UploadExtensions for multipart/form-data ContentType. +type UploadExtensionsMultipartRequestBody = ExtensionUploadMultipart - // Timestamp Time the log entry was produced. - Timestamp time.Time `json:"timestamp"` -} +// UploadExtensionsAndRestartMultipartRequestBody defines body for UploadExtensionsAndRestart for multipart/form-data ContentType. +type UploadExtensionsAndRestartMultipartRequestBody = ExtensionUploadMultipart -// MarkRecordingRequest defines model for MarkRecordingRequest. -type MarkRecordingRequest struct { - // Id Identifier of the recording session to mark, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the marker is added to the default recording session. - Id *string `json:"id,omitempty"` +// BatchComputerActionJSONRequestBody defines body for BatchComputerAction for application/json ContentType. +type BatchComputerActionJSONRequestBody = BatchComputerActionRequest - // Name Name of the marker, used as the MP4 chapter title. - Name string `json:"name"` -} +// ClickMouseJSONRequestBody defines body for ClickMouse for application/json ContentType. +type ClickMouseJSONRequestBody = ClickMouseRequest -// MarkRecordingResult defines model for MarkRecordingResult. -type MarkRecordingResult struct { - // Name Name of the recorded marker. - Name string `json:"name"` +// WriteClipboardJSONRequestBody defines body for WriteClipboard for application/json ContentType. +type WriteClipboardJSONRequestBody = WriteClipboardRequest - // OffsetMs Provisional offset of the marker from the recording start, in milliseconds, measured against the start time at mark time. The authoritative offset is the chapter start written at finalize. - OffsetMs int64 `json:"offset_ms"` -} +// SetCursorJSONRequestBody defines body for SetCursor for application/json ContentType. +type SetCursorJSONRequestBody = SetCursorRequest -// MousePositionResponse defines model for MousePositionResponse. -type MousePositionResponse struct { - // X X coordinate of the cursor - X int `json:"x"` +// DragMouseJSONRequestBody defines body for DragMouse for application/json ContentType. +type DragMouseJSONRequestBody = DragMouseRequest - // Y Y coordinate of the cursor - Y int `json:"y"` -} +// MoveMouseJSONRequestBody defines body for MoveMouse for application/json ContentType. +type MoveMouseJSONRequestBody = MoveMouseRequest -// MoveMouseRequest defines model for MoveMouseRequest. -type MoveMouseRequest struct { - // DurationMs Target total duration in milliseconds for the mouse movement when smooth=true. Omit for automatic timing based on distance. - DurationMs *int `json:"duration_ms,omitempty"` +// PressKeyJSONRequestBody defines body for PressKey for application/json ContentType. +type PressKeyJSONRequestBody = PressKeyRequest - // HoldKeys Modifier keys to hold during the move - HoldKeys *[]string `json:"hold_keys,omitempty"` +// TakeScreenshotJSONRequestBody defines body for TakeScreenshot for application/json ContentType. +type TakeScreenshotJSONRequestBody = ScreenshotRequest - // Smooth Use human-like Bezier curve path instead of instant mouse movement. - Smooth *bool `json:"smooth,omitempty"` +// ScrollJSONRequestBody defines body for Scroll for application/json ContentType. +type ScrollJSONRequestBody = ScrollRequest - // X X coordinate to move the cursor to - X int `json:"x"` +// TypeTextJSONRequestBody defines body for TypeText for application/json ContentType. +type TypeTextJSONRequestBody = TypeTextRequest - // Y Y coordinate to move the cursor to - Y int `json:"y"` -} +// ChromiumConfigureMultipartRequestBody defines body for ChromiumConfigure for multipart/form-data ContentType. +type ChromiumConfigureMultipartRequestBody ChromiumConfigureMultipartBody -// MovePathRequest defines model for MovePathRequest. -type MovePathRequest struct { - // DestPath Absolute destination path. - DestPath string `json:"dest_path"` +// PatchDisplayJSONRequestBody defines body for PatchDisplay for application/json ContentType. +type PatchDisplayJSONRequestBody = PatchDisplayRequest - // SrcPath Absolute source path. - SrcPath string `json:"src_path"` -} +// CreateDirectoryJSONRequestBody defines body for CreateDirectory for application/json ContentType. +type CreateDirectoryJSONRequestBody = CreateDirectoryRequest -// OkResponse Generic OK response. -type OkResponse struct { - // Ok Indicates success. - Ok bool `json:"ok"` -} +// DeleteDirectoryJSONRequestBody defines body for DeleteDirectory for application/json ContentType. +type DeleteDirectoryJSONRequestBody = DeletePathRequest -// PatchDisplayRequest defines model for PatchDisplayRequest. -type PatchDisplayRequest struct { - // Height Display height in pixels - Height *int `json:"height,omitempty"` +// DeleteFileJSONRequestBody defines body for DeleteFile for application/json ContentType. +type DeleteFileJSONRequestBody = DeletePathRequest - // RefreshRate Display refresh rate in Hz. If omitted, uses the highest available rate for the resolution. - RefreshRate *PatchDisplayRequestRefreshRate `json:"refresh_rate,omitempty"` +// MovePathJSONRequestBody defines body for MovePath for application/json ContentType. +type MovePathJSONRequestBody = MovePathRequest - // RequireIdle If true, refuse to resize when live view or recording/replay is active. - RequireIdle *bool `json:"require_idle,omitempty"` +// SetFilePermissionsJSONRequestBody defines body for SetFilePermissions for application/json ContentType. +type SetFilePermissionsJSONRequestBody = SetFilePermissionsRequest - // RestartChromium If true, restart Chromium after resolution change to ensure it adapts to new size. Default is false for headful, true for headless. - RestartChromium *bool `json:"restart_chromium,omitempty"` +// UploadFilesMultipartRequestBody defines body for UploadFiles for multipart/form-data ContentType. +type UploadFilesMultipartRequestBody UploadFilesMultipartBody - // Width Display width in pixels - Width *int `json:"width,omitempty"` -} +// UploadZipMultipartRequestBody defines body for UploadZip for multipart/form-data ContentType. +type UploadZipMultipartRequestBody UploadZipMultipartBody -// PatchDisplayRequestRefreshRate Display refresh rate in Hz. If omitted, uses the highest available rate for the resolution. -type PatchDisplayRequestRefreshRate int +// UploadZstdMultipartRequestBody defines body for UploadZstd for multipart/form-data ContentType. +type UploadZstdMultipartRequestBody UploadZstdMultipartBody -// PressKeyRequest defines model for PressKeyRequest. -type PressKeyRequest struct { - // Duration Duration to hold the keys down in milliseconds. If omitted or 0, keys are tapped. - Duration *int `json:"duration,omitempty"` +// StartFsWatchJSONRequestBody defines body for StartFsWatch for application/json ContentType. +type StartFsWatchJSONRequestBody = StartFsWatchRequest - // HoldKeys Optional modifier keys to hold during the key press sequence. - HoldKeys *[]string `json:"hold_keys,omitempty"` +// ExecutePlaywrightCodeJSONRequestBody defines body for ExecutePlaywrightCode for application/json ContentType. +type ExecutePlaywrightCodeJSONRequestBody = ExecutePlaywrightRequest - // Keys List of key symbols to press. Each item should be a key symbol supported by xdotool - // (see X11 keysym definitions). Examples include "Return", "Shift", "Ctrl", "Alt", "F5". - // Items in this list could also be combinations, e.g. "Ctrl+t" or "Ctrl+Shift+Tab". - Keys []string `json:"keys"` -} +// ProcessExecJSONRequestBody defines body for ProcessExec for application/json ContentType. +type ProcessExecJSONRequestBody = ProcessExecRequest -// ProcessExecRequest Request to execute a command synchronously. -type ProcessExecRequest struct { - // Args Command arguments. - Args *[]string `json:"args,omitempty"` +// ProcessSpawnJSONRequestBody defines body for ProcessSpawn for application/json ContentType. +type ProcessSpawnJSONRequestBody = ProcessSpawnRequest - // AsRoot Run the process with root privileges. - AsRoot *bool `json:"as_root,omitempty"` +// ProcessKillJSONRequestBody defines body for ProcessKill for application/json ContentType. +type ProcessKillJSONRequestBody = ProcessKillRequest - // AsUser Run the process as this user. - AsUser *string `json:"as_user,omitempty"` +// ProcessResizeJSONRequestBody defines body for ProcessResize for application/json ContentType. +type ProcessResizeJSONRequestBody = ProcessResizeRequest - // Command Executable or shell command to run. - Command string `json:"command"` +// ProcessStdinJSONRequestBody defines body for ProcessStdin for application/json ContentType. +type ProcessStdinJSONRequestBody = ProcessStdinRequest - // Cwd Working directory (absolute path) to run the command in. - Cwd *string `json:"cwd,omitempty"` +// DeleteRecordingJSONRequestBody defines body for DeleteRecording for application/json ContentType. +type DeleteRecordingJSONRequestBody = DeleteRecordingRequest - // Env Environment variables to set for the process. - Env *map[string]string `json:"env,omitempty"` +// MarkRecordingJSONRequestBody defines body for MarkRecording for application/json ContentType. +type MarkRecordingJSONRequestBody = MarkRecordingRequest - // TimeoutSec Maximum execution time in seconds. - TimeoutSec *int `json:"timeout_sec,omitempty"` -} +// StartRecordingJSONRequestBody defines body for StartRecording for application/json ContentType. +type StartRecordingJSONRequestBody = StartRecordingRequest + +// StopRecordingJSONRequestBody defines body for StopRecording for application/json ContentType. +type StopRecordingJSONRequestBody = StopRecordingRequest -// ProcessExecResult Result of a synchronous command execution. -type ProcessExecResult struct { - // DurationMs Execution duration in milliseconds. - DurationMs *int `json:"duration_ms,omitempty"` +// PatchTelemetryJSONRequestBody defines body for PatchTelemetry for application/json ContentType. +type PatchTelemetryJSONRequestBody = BrowserTelemetryConfig - // ExitCode Process exit code. - ExitCode *int `json:"exit_code,omitempty"` +// PutTelemetryJSONRequestBody defines body for PutTelemetry for application/json ContentType. +type PutTelemetryJSONRequestBody = BrowserTelemetryConfig - // StderrB64 Base64-encoded stderr buffer. - StderrB64 *string `json:"stderr_b64,omitempty"` +// PublishTelemetryEventJSONRequestBody defines body for PublishTelemetryEvent for application/json ContentType. +type PublishTelemetryEventJSONRequestBody = PublishEventRequest - // StdoutB64 Base64-encoded stdout buffer. - StdoutB64 *string `json:"stdout_b64,omitempty"` +// AsBrowserCdpInputDispatchMouseEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputDispatchMouseEventCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputDispatchMouseEventCommandData() (BrowserCdpInputDispatchMouseEventCommandData, error) { + var body BrowserCdpInputDispatchMouseEventCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// ProcessKillRequest Signal to send to the process. -type ProcessKillRequest struct { - // Signal Signal to send. - Signal ProcessKillRequestSignal `json:"signal"` +// FromBrowserCdpInputDispatchMouseEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputDispatchMouseEventCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputDispatchMouseEventCommandData(v BrowserCdpInputDispatchMouseEventCommandData) error { + v.Method = "Input.dispatchMouseEvent" + b, err := json.Marshal(v) + t.union = b + return err } -// ProcessKillRequestSignal Signal to send. -type ProcessKillRequestSignal string - -// ProcessResizeRequest Resize a PTY-backed process. -type ProcessResizeRequest struct { - // Cols New terminal columns. - Cols int `json:"cols"` +// MergeBrowserCdpInputDispatchMouseEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputDispatchMouseEventCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputDispatchMouseEventCommandData(v BrowserCdpInputDispatchMouseEventCommandData) error { + v.Method = "Input.dispatchMouseEvent" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Rows New terminal rows. - Rows int `json:"rows"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// ProcessSpawnRequest defines model for ProcessSpawnRequest. -type ProcessSpawnRequest struct { - // AllocateTty Allocate a pseudo-terminal (PTY) for the process to enable interactive shells. - AllocateTty *bool `json:"allocate_tty,omitempty"` - - // Args Command arguments. - Args *[]string `json:"args,omitempty"` +// AsBrowserCdpInputDispatchKeyEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputDispatchKeyEventCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputDispatchKeyEventCommandData() (BrowserCdpInputDispatchKeyEventCommandData, error) { + var body BrowserCdpInputDispatchKeyEventCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // AsRoot Run the process with root privileges. - AsRoot *bool `json:"as_root,omitempty"` +// FromBrowserCdpInputDispatchKeyEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputDispatchKeyEventCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputDispatchKeyEventCommandData(v BrowserCdpInputDispatchKeyEventCommandData) error { + v.Method = "Input.dispatchKeyEvent" + b, err := json.Marshal(v) + t.union = b + return err +} - // AsUser Run the process as this user. - AsUser *string `json:"as_user,omitempty"` +// MergeBrowserCdpInputDispatchKeyEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputDispatchKeyEventCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputDispatchKeyEventCommandData(v BrowserCdpInputDispatchKeyEventCommandData) error { + v.Method = "Input.dispatchKeyEvent" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Cols Initial terminal columns when allocate_tty is true. - Cols *int `json:"cols,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // Command Executable or shell command to run. - Command string `json:"command"` +// AsBrowserCdpInputInsertTextCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputInsertTextCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputInsertTextCommandData() (BrowserCdpInputInsertTextCommandData, error) { + var body BrowserCdpInputInsertTextCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // Cwd Working directory (absolute path) to run the command in. - Cwd *string `json:"cwd,omitempty"` +// FromBrowserCdpInputInsertTextCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputInsertTextCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputInsertTextCommandData(v BrowserCdpInputInsertTextCommandData) error { + v.Method = "Input.insertText" + b, err := json.Marshal(v) + t.union = b + return err +} - // Env Environment variables to set for the process. - Env *map[string]string `json:"env,omitempty"` +// MergeBrowserCdpInputInsertTextCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputInsertTextCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputInsertTextCommandData(v BrowserCdpInputInsertTextCommandData) error { + v.Method = "Input.insertText" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Rows Initial terminal rows when allocate_tty is true. - Rows *int `json:"rows,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // TimeoutSec Maximum execution time in seconds. - TimeoutSec *int `json:"timeout_sec,omitempty"` +// AsBrowserCdpInputImeSetCompositionCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputImeSetCompositionCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputImeSetCompositionCommandData() (BrowserCdpInputImeSetCompositionCommandData, error) { + var body BrowserCdpInputImeSetCompositionCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// ProcessSpawnResult Information about a spawned process. -type ProcessSpawnResult struct { - // Pid OS process ID. - Pid *int `json:"pid,omitempty"` +// FromBrowserCdpInputImeSetCompositionCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputImeSetCompositionCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputImeSetCompositionCommandData(v BrowserCdpInputImeSetCompositionCommandData) error { + v.Method = "Input.imeSetComposition" + b, err := json.Marshal(v) + t.union = b + return err +} - // ProcessId Server-assigned identifier for the process. - ProcessId *openapi_types.UUID `json:"process_id,omitempty"` +// MergeBrowserCdpInputImeSetCompositionCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputImeSetCompositionCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputImeSetCompositionCommandData(v BrowserCdpInputImeSetCompositionCommandData) error { + v.Method = "Input.imeSetComposition" + b, err := json.Marshal(v) + if err != nil { + return err + } - // StartedAt Timestamp when the process started. - StartedAt *time.Time `json:"started_at,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// ProcessStatus Current status of a process. -type ProcessStatus struct { - // CpuPct Estimated CPU usage percentage. - CpuPct *float32 `json:"cpu_pct,omitempty"` +// AsBrowserCdpInputDispatchTouchEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputDispatchTouchEventCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputDispatchTouchEventCommandData() (BrowserCdpInputDispatchTouchEventCommandData, error) { + var body BrowserCdpInputDispatchTouchEventCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // ExitCode Exit code if the process has exited. - ExitCode *int `json:"exit_code,omitempty"` +// FromBrowserCdpInputDispatchTouchEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputDispatchTouchEventCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputDispatchTouchEventCommandData(v BrowserCdpInputDispatchTouchEventCommandData) error { + v.Method = "Input.dispatchTouchEvent" + b, err := json.Marshal(v) + t.union = b + return err +} - // MemBytes Estimated resident memory usage in bytes. - MemBytes *int `json:"mem_bytes,omitempty"` +// MergeBrowserCdpInputDispatchTouchEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputDispatchTouchEventCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputDispatchTouchEventCommandData(v BrowserCdpInputDispatchTouchEventCommandData) error { + v.Method = "Input.dispatchTouchEvent" + b, err := json.Marshal(v) + if err != nil { + return err + } - // State Process state. - State *ProcessStatusState `json:"state,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// ProcessStatusState Process state. -type ProcessStatusState string +// AsBrowserCdpInputDispatchDragEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputDispatchDragEventCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputDispatchDragEventCommandData() (BrowserCdpInputDispatchDragEventCommandData, error) { + var body BrowserCdpInputDispatchDragEventCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// ProcessStdinRequest Data to write to the process standard input. -type ProcessStdinRequest struct { - // DataB64 Base64-encoded data to write. - DataB64 string `json:"data_b64"` +// FromBrowserCdpInputDispatchDragEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputDispatchDragEventCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputDispatchDragEventCommandData(v BrowserCdpInputDispatchDragEventCommandData) error { + v.Method = "Input.dispatchDragEvent" + b, err := json.Marshal(v) + t.union = b + return err } -// ProcessStdinResult Result of writing to stdin. -type ProcessStdinResult struct { - // WrittenBytes Number of bytes written. - WrittenBytes *int `json:"written_bytes,omitempty"` +// MergeBrowserCdpInputDispatchDragEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputDispatchDragEventCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputDispatchDragEventCommandData(v BrowserCdpInputDispatchDragEventCommandData) error { + v.Method = "Input.dispatchDragEvent" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// ProcessStreamEvent SSE payload representing process output or lifecycle events. -type ProcessStreamEvent struct { - // DataB64 Base64-encoded data from the process stream. - DataB64 *string `json:"data_b64,omitempty"` +// AsBrowserCdpInputCancelDraggingCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputCancelDraggingCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputCancelDraggingCommandData() (BrowserCdpInputCancelDraggingCommandData, error) { + var body BrowserCdpInputCancelDraggingCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // Event Lifecycle event type. - Event *ProcessStreamEventEvent `json:"event,omitempty"` +// FromBrowserCdpInputCancelDraggingCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputCancelDraggingCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputCancelDraggingCommandData(v BrowserCdpInputCancelDraggingCommandData) error { + v.Method = "Input.cancelDragging" + b, err := json.Marshal(v) + t.union = b + return err +} - // ExitCode Exit code when the event is "exit". - ExitCode *int `json:"exit_code,omitempty"` +// MergeBrowserCdpInputCancelDraggingCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputCancelDraggingCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputCancelDraggingCommandData(v BrowserCdpInputCancelDraggingCommandData) error { + v.Method = "Input.cancelDragging" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Stream Source stream of the data chunk. - Stream *ProcessStreamEventStream `json:"stream,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// ProcessStreamEventEvent Lifecycle event type. -type ProcessStreamEventEvent string +// AsBrowserCdpInputEmulateTouchFromMouseEventCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputEmulateTouchFromMouseEventCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputEmulateTouchFromMouseEventCommandData() (BrowserCdpInputEmulateTouchFromMouseEventCommandData, error) { + var body BrowserCdpInputEmulateTouchFromMouseEventCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// ProcessStreamEventStream Source stream of the data chunk. -type ProcessStreamEventStream string +// FromBrowserCdpInputEmulateTouchFromMouseEventCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputEmulateTouchFromMouseEventCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputEmulateTouchFromMouseEventCommandData(v BrowserCdpInputEmulateTouchFromMouseEventCommandData) error { + v.Method = "Input.emulateTouchFromMouseEvent" + b, err := json.Marshal(v) + t.union = b + return err +} -// PublishEventRequest Request body for publishing an event into the telemetry stream. -type PublishEventRequest struct { - // Category Event category. Optional and advisory: for a known event `type` the server assigns the category authoritatively and ignores this field. It is only used for unknown custom types, where it is required. - Category *PublishEventRequestCategory `json:"category,omitempty"` +// MergeBrowserCdpInputEmulateTouchFromMouseEventCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputEmulateTouchFromMouseEventCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputEmulateTouchFromMouseEventCommandData(v BrowserCdpInputEmulateTouchFromMouseEventCommandData) error { + v.Method = "Input.emulateTouchFromMouseEvent" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Data Telemetry event payload. - Data interface{} `json:"data,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // Source Provenance metadata identifying which producer emitted the event. - Source *BrowserEventSource `json:"source,omitempty"` +// AsBrowserCdpInputSynthesizePinchGestureCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputSynthesizePinchGestureCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputSynthesizePinchGestureCommandData() (BrowserCdpInputSynthesizePinchGestureCommandData, error) { + var body BrowserCdpInputSynthesizePinchGestureCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // Type Event type identifier. - Type string `json:"type"` +// FromBrowserCdpInputSynthesizePinchGestureCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputSynthesizePinchGestureCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputSynthesizePinchGestureCommandData(v BrowserCdpInputSynthesizePinchGestureCommandData) error { + v.Method = "Input.synthesizePinchGesture" + b, err := json.Marshal(v) + t.union = b + return err } -// PublishEventRequestCategory Event category. Optional and advisory: for a known event `type` the server assigns the category authoritatively and ignores this field. It is only used for unknown custom types, where it is required. -type PublishEventRequestCategory string +// MergeBrowserCdpInputSynthesizePinchGestureCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputSynthesizePinchGestureCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputSynthesizePinchGestureCommandData(v BrowserCdpInputSynthesizePinchGestureCommandData) error { + v.Method = "Input.synthesizePinchGesture" + b, err := json.Marshal(v) + if err != nil { + return err + } -// RecorderInfo defines model for RecorderInfo. -type RecorderInfo struct { - // FinishedAt Timestamp when recording finished - FinishedAt *time.Time `json:"finished_at,omitempty"` - Id string `json:"id"` - IsRecording bool `json:"isRecording"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // StartedAt Timestamp when recording started - StartedAt *time.Time `json:"started_at,omitempty"` +// AsBrowserCdpInputSynthesizeScrollGestureCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputSynthesizeScrollGestureCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputSynthesizeScrollGestureCommandData() (BrowserCdpInputSynthesizeScrollGestureCommandData, error) { + var body BrowserCdpInputSynthesizeScrollGestureCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// ScreenshotRegion defines model for ScreenshotRegion. -type ScreenshotRegion struct { - // Height Height of the region in pixels - Height int `json:"height"` +// FromBrowserCdpInputSynthesizeScrollGestureCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputSynthesizeScrollGestureCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputSynthesizeScrollGestureCommandData(v BrowserCdpInputSynthesizeScrollGestureCommandData) error { + v.Method = "Input.synthesizeScrollGesture" + b, err := json.Marshal(v) + t.union = b + return err +} - // Width Width of the region in pixels - Width int `json:"width"` +// MergeBrowserCdpInputSynthesizeScrollGestureCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputSynthesizeScrollGestureCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputSynthesizeScrollGestureCommandData(v BrowserCdpInputSynthesizeScrollGestureCommandData) error { + v.Method = "Input.synthesizeScrollGesture" + b, err := json.Marshal(v) + if err != nil { + return err + } - // X X coordinate of the region's top-left corner - X int `json:"x"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // Y Y coordinate of the region's top-left corner - Y int `json:"y"` +// AsBrowserCdpInputSynthesizeTapGestureCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpInputSynthesizeTapGestureCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpInputSynthesizeTapGestureCommandData() (BrowserCdpInputSynthesizeTapGestureCommandData, error) { + var body BrowserCdpInputSynthesizeTapGestureCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// ScreenshotRequest defines model for ScreenshotRequest. -type ScreenshotRequest struct { - Region *ScreenshotRegion `json:"region,omitempty"` +// FromBrowserCdpInputSynthesizeTapGestureCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpInputSynthesizeTapGestureCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpInputSynthesizeTapGestureCommandData(v BrowserCdpInputSynthesizeTapGestureCommandData) error { + v.Method = "Input.synthesizeTapGesture" + b, err := json.Marshal(v) + t.union = b + return err } -// ScrollRequest defines model for ScrollRequest. -type ScrollRequest struct { - // DeltaX Horizontal scroll amount. Positive scrolls right, negative scrolls left. - DeltaX *int `json:"delta_x,omitempty"` +// MergeBrowserCdpInputSynthesizeTapGestureCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpInputSynthesizeTapGestureCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpInputSynthesizeTapGestureCommandData(v BrowserCdpInputSynthesizeTapGestureCommandData) error { + v.Method = "Input.synthesizeTapGesture" + b, err := json.Marshal(v) + if err != nil { + return err + } - // DeltaY Vertical scroll amount. Positive scrolls down, negative scrolls up. - DeltaY *int `json:"delta_y,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // HoldKeys Modifier keys to hold during the scroll - HoldKeys *[]string `json:"hold_keys,omitempty"` +// AsBrowserCdpDomSetFileInputFilesCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpDomSetFileInputFilesCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpDomSetFileInputFilesCommandData() (BrowserCdpDomSetFileInputFilesCommandData, error) { + var body BrowserCdpDomSetFileInputFilesCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // X X coordinate at which to perform the scroll - X int `json:"x"` +// FromBrowserCdpDomSetFileInputFilesCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpDomSetFileInputFilesCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpDomSetFileInputFilesCommandData(v BrowserCdpDomSetFileInputFilesCommandData) error { + v.Method = "DOM.setFileInputFiles" + b, err := json.Marshal(v) + t.union = b + return err +} - // Y Y coordinate at which to perform the scroll - Y int `json:"y"` +// MergeBrowserCdpDomSetFileInputFilesCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpDomSetFileInputFilesCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpDomSetFileInputFilesCommandData(v BrowserCdpDomSetFileInputFilesCommandData) error { + v.Method = "DOM.setFileInputFiles" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// SetCursorRequest defines model for SetCursorRequest. -type SetCursorRequest struct { - // Hidden Whether the cursor should be hidden - Hidden bool `json:"hidden"` +// AsBrowserCdpDomFocusCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpDomFocusCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpDomFocusCommandData() (BrowserCdpDomFocusCommandData, error) { + var body BrowserCdpDomFocusCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// SetFilePermissionsRequest defines model for SetFilePermissionsRequest. -type SetFilePermissionsRequest struct { - // Group New group name or GID. - Group *string `json:"group,omitempty"` +// FromBrowserCdpDomFocusCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpDomFocusCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpDomFocusCommandData(v BrowserCdpDomFocusCommandData) error { + v.Method = "DOM.focus" + b, err := json.Marshal(v) + t.union = b + return err +} - // Mode File mode bits (octal string, e.g. 644). - Mode string `json:"mode"` +// MergeBrowserCdpDomFocusCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpDomFocusCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpDomFocusCommandData(v BrowserCdpDomFocusCommandData) error { + v.Method = "DOM.focus" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Owner New owner username or UID. - Owner *string `json:"owner,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // Path Absolute path whose permissions are to be changed. - Path string `json:"path"` +// AsBrowserCdpDomScrollIntoViewIfNeededCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpDomScrollIntoViewIfNeededCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpDomScrollIntoViewIfNeededCommandData() (BrowserCdpDomScrollIntoViewIfNeededCommandData, error) { + var body BrowserCdpDomScrollIntoViewIfNeededCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// SleepAction Pause execution for a specified duration. -type SleepAction struct { - // DurationMs Duration to sleep in milliseconds. - DurationMs int `json:"duration_ms"` +// FromBrowserCdpDomScrollIntoViewIfNeededCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpDomScrollIntoViewIfNeededCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpDomScrollIntoViewIfNeededCommandData(v BrowserCdpDomScrollIntoViewIfNeededCommandData) error { + v.Method = "DOM.scrollIntoViewIfNeeded" + b, err := json.Marshal(v) + t.union = b + return err } -// StartFsWatchRequest defines model for StartFsWatchRequest. -type StartFsWatchRequest struct { - // Path Directory to watch. - Path string `json:"path"` +// MergeBrowserCdpDomScrollIntoViewIfNeededCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpDomScrollIntoViewIfNeededCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpDomScrollIntoViewIfNeededCommandData(v BrowserCdpDomScrollIntoViewIfNeededCommandData) error { + v.Method = "DOM.scrollIntoViewIfNeeded" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Recursive Whether to watch recursively. - Recursive *bool `json:"recursive,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// StartRecordingRequest defines model for StartRecordingRequest. -type StartRecordingRequest struct { - // Framerate Recording framerate in fps (overrides server default) - Framerate *int `json:"framerate,omitempty"` - - // Id Optional identifier for this recording session, used to target it from the other /recording endpoints (stop, mark, download, delete) and allowing multiple concurrent recordings. Alphanumeric or hyphen. When omitted, the default recording session is started. - Id *string `json:"id,omitempty"` +// AsBrowserCdpPageBringToFrontCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageBringToFrontCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageBringToFrontCommandData() (BrowserCdpPageBringToFrontCommandData, error) { + var body BrowserCdpPageBringToFrontCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // MaxDurationInSeconds Maximum recording duration in seconds (overrides server default) - MaxDurationInSeconds *int `json:"maxDurationInSeconds,omitempty"` +// FromBrowserCdpPageBringToFrontCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageBringToFrontCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageBringToFrontCommandData(v BrowserCdpPageBringToFrontCommandData) error { + v.Method = "Page.bringToFront" + b, err := json.Marshal(v) + t.union = b + return err +} - // MaxFileSizeInMB Maximum file size in MB (overrides server default) - MaxFileSizeInMB *int `json:"maxFileSizeInMB,omitempty"` +// MergeBrowserCdpPageBringToFrontCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageBringToFrontCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageBringToFrontCommandData(v BrowserCdpPageBringToFrontCommandData) error { + v.Method = "Page.bringToFront" + b, err := json.Marshal(v) + if err != nil { + return err + } - // RecordAudio Capture audio alongside video. Requires the server to have an audio source and PulseAudio socket configured (the image sets both by default). When false the recording is video-only. - RecordAudio *bool `json:"recordAudio,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// StopRecordingRequest defines model for StopRecordingRequest. -type StopRecordingRequest struct { - // ForceStop Immediately stop without graceful shutdown. This may result in a corrupted video file. - ForceStop *bool `json:"forceStop,omitempty"` +// AsBrowserCdpPageCaptureScreenshotCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageCaptureScreenshotCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageCaptureScreenshotCommandData() (BrowserCdpPageCaptureScreenshotCommandData, error) { + var body BrowserCdpPageCaptureScreenshotCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // Id Identifier of the recording session to stop, as passed to /recording/start. Alphanumeric or hyphen. When omitted, the default recording session is stopped. - Id *string `json:"id,omitempty"` +// FromBrowserCdpPageCaptureScreenshotCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageCaptureScreenshotCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageCaptureScreenshotCommandData(v BrowserCdpPageCaptureScreenshotCommandData) error { + v.Method = "Page.captureScreenshot" + b, err := json.Marshal(v) + t.union = b + return err } -// TelemetryEnvelope The envelope assigned to a successfully published event. -type TelemetryEnvelope struct { - // Event A telemetry event. The wire-level event shape accepted by the publish endpoint and emitted on the SSE stream. Arbitrary `type` strings and `data` payloads are admitted. For browser events emitted by the Kernel image, `data` conforms to the per-type schema documented in the `Browser*Event` / `Browser*EventData` definitions, selected by `type`. - Event TelemetryEvent `json:"event"` +// MergeBrowserCdpPageCaptureScreenshotCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageCaptureScreenshotCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageCaptureScreenshotCommandData(v BrowserCdpPageCaptureScreenshotCommandData) error { + v.Method = "Page.captureScreenshot" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Seq Process-monotonic sequence number assigned across the lifetime of the server. Use with Last-Event-ID to resume the SSE stream from this point. - Seq int64 `json:"seq"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// TelemetryEvent A telemetry event. The wire-level event shape accepted by the publish endpoint and emitted on the SSE stream. Arbitrary `type` strings and `data` payloads are admitted. For browser events emitted by the Kernel image, `data` conforms to the per-type schema documented in the `Browser*Event` / `Browser*EventData` definitions, selected by `type`. -type TelemetryEvent struct { - // Category Event category. - Category *TelemetryEventCategory `json:"category,omitempty"` +// AsBrowserCdpPageCaptureSnapshotCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageCaptureSnapshotCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageCaptureSnapshotCommandData() (BrowserCdpPageCaptureSnapshotCommandData, error) { + var body BrowserCdpPageCaptureSnapshotCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // Data Arbitrary JSON payload. For browser events listed in `KnownBrowserTelemetryEvent`, the payload conforms to the corresponding `Browser*EventData` schema. - Data interface{} `json:"data,omitempty"` +// FromBrowserCdpPageCaptureSnapshotCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageCaptureSnapshotCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageCaptureSnapshotCommandData(v BrowserCdpPageCaptureSnapshotCommandData) error { + v.Method = "Page.captureSnapshot" + b, err := json.Marshal(v) + t.union = b + return err +} - // Source Provenance metadata identifying which producer emitted the event. - Source *BrowserEventSource `json:"source,omitempty"` +// MergeBrowserCdpPageCaptureSnapshotCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageCaptureSnapshotCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageCaptureSnapshotCommandData(v BrowserCdpPageCaptureSnapshotCommandData) error { + v.Method = "Page.captureSnapshot" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Truncated Set by the server when the data field was truncated to fit the size limit. - Truncated *bool `json:"truncated,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // Ts Unix timestamp in microseconds. Defaults to the current time when omitted. - Ts *int64 `json:"ts,omitempty"` +// AsBrowserCdpPageHandleJavaScriptDialogCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageHandleJavaScriptDialogCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageHandleJavaScriptDialogCommandData() (BrowserCdpPageHandleJavaScriptDialogCommandData, error) { + var body BrowserCdpPageHandleJavaScriptDialogCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // Type Event type identifier. - Type string `json:"type"` +// FromBrowserCdpPageHandleJavaScriptDialogCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageHandleJavaScriptDialogCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageHandleJavaScriptDialogCommandData(v BrowserCdpPageHandleJavaScriptDialogCommandData) error { + v.Method = "Page.handleJavaScriptDialog" + b, err := json.Marshal(v) + t.union = b + return err } -// TelemetryEventCategory Event category. -type TelemetryEventCategory string +// MergeBrowserCdpPageHandleJavaScriptDialogCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageHandleJavaScriptDialogCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageHandleJavaScriptDialogCommandData(v BrowserCdpPageHandleJavaScriptDialogCommandData) error { + v.Method = "Page.handleJavaScriptDialog" + b, err := json.Marshal(v) + if err != nil { + return err + } -// TelemetryState Current telemetry configuration. -type TelemetryState struct { - // AppliedAt Wall-clock time at which the current configuration was applied. Omitted when telemetry is not configured. - AppliedAt *time.Time `json:"applied_at,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // Config Telemetry configuration for a browser. Selection is opt-in. Omit the browser key (or send an empty object) to capture the default set: lightweight operational signals (control, connection, system, captcha). Within `browser`, only the categories you set enabled: true are captured; anything omitted is off. The CDP categories (console, network, page, interaction), `screenshot` and `platform` are off by default and must be opted into. A `browser` config with nothing enabled clears the telemetry configuration. The `monitor` category (CDP collector health) is not configurable here; it flows automatically whenever a CDP category is captured. - Config BrowserTelemetryConfig `json:"config"` +// AsBrowserCdpPageNavigateCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageNavigateCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageNavigateCommandData() (BrowserCdpPageNavigateCommandData, error) { + var body BrowserCdpPageNavigateCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // Seq Process-monotonic sequence number of the last published event. Does not reset across configuration changes. - Seq int64 `json:"seq"` +// FromBrowserCdpPageNavigateCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageNavigateCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageNavigateCommandData(v BrowserCdpPageNavigateCommandData) error { + v.Method = "Page.navigate" + b, err := json.Marshal(v) + t.union = b + return err } -// TypeTextRequest defines model for TypeTextRequest. -type TypeTextRequest struct { - // Delay Delay in milliseconds between keystrokes. Ignored when smooth is true. - Delay *int `json:"delay,omitempty"` +// MergeBrowserCdpPageNavigateCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageNavigateCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageNavigateCommandData(v BrowserCdpPageNavigateCommandData) error { + v.Method = "Page.navigate" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Smooth Use human-like variable keystroke timing instead of a fixed delay. - // Defaults to true (same as moveMouse/dragMouse). Set to false for - // xdotool typing with an optional fixed delay between keys (delay=0 is instant). - // When true, text is typed in word-sized chunks with variable intra-word delays - // and natural inter-word pauses. The delay field is ignored when smooth is true. - Smooth *bool `json:"smooth,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // Text Text to type on the host computer - Text string `json:"text"` +// AsBrowserCdpPageNavigateToHistoryEntryCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageNavigateToHistoryEntryCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageNavigateToHistoryEntryCommandData() (BrowserCdpPageNavigateToHistoryEntryCommandData, error) { + var body BrowserCdpPageNavigateToHistoryEntryCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // TypoChance Per-character typo injection rate; mistakes are corrected with backspace. - // Default 0. Only applies when smooth is true (silently ignored when - // smooth is false). - TypoChance *float32 `json:"typo_chance,omitempty"` +// FromBrowserCdpPageNavigateToHistoryEntryCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageNavigateToHistoryEntryCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageNavigateToHistoryEntryCommandData(v BrowserCdpPageNavigateToHistoryEntryCommandData) error { + v.Method = "Page.navigateToHistoryEntry" + b, err := json.Marshal(v) + t.union = b + return err } -// WriteClipboardRequest defines model for WriteClipboardRequest. -type WriteClipboardRequest struct { - // Text Text to write to the system clipboard - Text string `json:"text"` +// MergeBrowserCdpPageNavigateToHistoryEntryCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageNavigateToHistoryEntryCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageNavigateToHistoryEntryCommandData(v BrowserCdpPageNavigateToHistoryEntryCommandData) error { + v.Method = "Page.navigateToHistoryEntry" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// BadRequestError defines model for BadRequestError. -type BadRequestError = Error +// AsBrowserCdpPageReloadCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageReloadCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageReloadCommandData() (BrowserCdpPageReloadCommandData, error) { + var body BrowserCdpPageReloadCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// ConflictError defines model for ConflictError. -type ConflictError = Error +// FromBrowserCdpPageReloadCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageReloadCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageReloadCommandData(v BrowserCdpPageReloadCommandData) error { + v.Method = "Page.reload" + b, err := json.Marshal(v) + t.union = b + return err +} -// InternalError defines model for InternalError. -type InternalError = Error +// MergeBrowserCdpPageReloadCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageReloadCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageReloadCommandData(v BrowserCdpPageReloadCommandData) error { + v.Method = "Page.reload" + b, err := json.Marshal(v) + if err != nil { + return err + } -// NotFoundError defines model for NotFoundError. -type NotFoundError = Error + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// PatchChromiumFlagsJSONBody defines parameters for PatchChromiumFlags. -type PatchChromiumFlagsJSONBody struct { - // Flags Chromium flags to merge (e.g., ["--kiosk", "--disable-gpu"]) - Flags []string `json:"flags"` +// AsBrowserCdpPagePrintToPdfCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPagePrintToPdfCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPagePrintToPdfCommandData() (BrowserCdpPagePrintToPdfCommandData, error) { + var body BrowserCdpPagePrintToPdfCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// PatchChromiumPoliciesJSONBody defines parameters for PatchChromiumPolicies. -type PatchChromiumPoliciesJSONBody map[string]interface{} +// FromBrowserCdpPagePrintToPdfCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPagePrintToPdfCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPagePrintToPdfCommandData(v BrowserCdpPagePrintToPdfCommandData) error { + v.Method = "Page.printToPDF" + b, err := json.Marshal(v) + t.union = b + return err +} -// UploadExtensionsMultipartBody defines parameters for UploadExtensions. -type UploadExtensionsMultipartBody struct { - // Extensions List of extensions to upload and activate - Extensions []struct { - // Name Folder name to place the extension under /home/kernel/extensions/ - Name string `json:"name"` +// MergeBrowserCdpPagePrintToPdfCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPagePrintToPdfCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPagePrintToPdfCommandData(v BrowserCdpPagePrintToPdfCommandData) error { + v.Method = "Page.printToPDF" + b, err := json.Marshal(v) + if err != nil { + return err + } - // ZipFile Zip archive containing an unpacked Chromium extension (must include manifest.json) - ZipFile openapi_types.File `json:"zip_file"` - } `json:"extensions"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// UploadExtensionsAndRestartMultipartBody defines parameters for UploadExtensionsAndRestart. -type UploadExtensionsAndRestartMultipartBody struct { - // Extensions List of extensions to upload and activate - Extensions []struct { - // Name Folder name to place the extension under /home/kernel/extensions/ - Name string `json:"name"` - - // ZipFile Zip archive containing an unpacked Chromium extension (must include manifest.json) - ZipFile openapi_types.File `json:"zip_file"` - } `json:"extensions"` +// AsBrowserCdpPageStartScreencastCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageStartScreencastCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageStartScreencastCommandData() (BrowserCdpPageStartScreencastCommandData, error) { + var body BrowserCdpPageStartScreencastCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// ChromiumConfigureMultipartBody defines parameters for ChromiumConfigure. -type ChromiumConfigureMultipartBody struct { - // ChromePolicies UTF-8 JSON policy override map — same semantics as PATCH /chromium/policies. - ChromePolicies *string `json:"chrome_policies,omitempty"` +// FromBrowserCdpPageStartScreencastCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageStartScreencastCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageStartScreencastCommandData(v BrowserCdpPageStartScreencastCommandData) error { + v.Method = "Page.startScreencast" + b, err := json.Marshal(v) + t.union = b + return err +} - // ChromiumFlags UTF-8 JSON object `{"flags":["--kiosk"]}` — same semantics as PATCH /chromium/flags. - ChromiumFlags *string `json:"chromium_flags,omitempty"` +// MergeBrowserCdpPageStartScreencastCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageStartScreencastCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageStartScreencastCommandData(v BrowserCdpPageStartScreencastCommandData) error { + v.Method = "Page.startScreencast" + b, err := json.Marshal(v) + if err != nil { + return err + } - // Display UTF-8 JSON object matching `#/components/schemas/PatchDisplayRequest` (width/height/etc.). When combined with restart-triggering fields, the resize is applied while Chromium is stopped and Chromium is started once at the end. - Display *string `json:"display,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} - // Extensions Extension zips paired with consecutive extensions.name fields (same as upload-extensions-and-restart). - Extensions *[]struct { - Name string `json:"name"` - ZipFile openapi_types.File `json:"zip_file"` - } `json:"extensions,omitempty"` +// AsBrowserCdpPageStopScreencastCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageStopScreencastCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageStopScreencastCommandData() (BrowserCdpPageStopScreencastCommandData, error) { + var body BrowserCdpPageStopScreencastCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} - // ProfileArchive tar.zst archive containing the desired `/home/kernel/user-data` profile contents. Prefer archives whose root entries are the profile files/directories themselves (for example `Default/Preferences`). Use `strip_components` only when uploading an archive that includes leading wrapper directories. - ProfileArchive *openapi_types.File `json:"profile_archive,omitempty"` +// FromBrowserCdpPageStopScreencastCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageStopScreencastCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageStopScreencastCommandData(v BrowserCdpPageStopScreencastCommandData) error { + v.Method = "Page.stopScreencast" + b, err := json.Marshal(v) + t.union = b + return err +} - // StartUrl URL text to navigate after configure. Bare hosts are normalized to https://, length is capped at 2048 bytes, and Chrome decides which schemes are navigable. - StartUrl *string `json:"start_url,omitempty"` +// MergeBrowserCdpPageStopScreencastCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageStopScreencastCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageStopScreencastCommandData(v BrowserCdpPageStopScreencastCommandData) error { + v.Method = "Page.stopScreencast" + b, err := json.Marshal(v) + if err != nil { + return err + } - // StripComponents Optional number of leading path components to strip from profile_archive entries (non-negative integer as text). - StripComponents *string `json:"strip_components,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// DownloadDirZipParams defines parameters for DownloadDirZip. -type DownloadDirZipParams struct { - // Path Absolute directory path to archive and download. - Path string `form:"path" json:"path"` +// AsBrowserCdpPageStopLoadingCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageStopLoadingCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageStopLoadingCommandData() (BrowserCdpPageStopLoadingCommandData, error) { + var body BrowserCdpPageStopLoadingCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// DownloadDirZstdParams defines parameters for DownloadDirZstd. -type DownloadDirZstdParams struct { - // Path Absolute directory path to archive and download. - Path string `form:"path" json:"path"` - - // CompressionLevel Compression level. Higher levels produce smaller archives but take longer. - // - fastest: ~zstd level 1, maximum speed (~300-500 MB/s) - // - default: ~zstd level 3, balanced speed/ratio (~150 MB/s) - // - better: ~zstd level 7, better ratio (~50-80 MB/s) - // - best: ~zstd level 11, best ratio (~20-40 MB/s) - CompressionLevel *DownloadDirZstdParamsCompressionLevel `form:"compression_level,omitempty" json:"compression_level,omitempty"` +// FromBrowserCdpPageStopLoadingCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageStopLoadingCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageStopLoadingCommandData(v BrowserCdpPageStopLoadingCommandData) error { + v.Method = "Page.stopLoading" + b, err := json.Marshal(v) + t.union = b + return err } -// DownloadDirZstdParamsCompressionLevel defines parameters for DownloadDirZstd. -type DownloadDirZstdParamsCompressionLevel string +// MergeBrowserCdpPageStopLoadingCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageStopLoadingCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageStopLoadingCommandData(v BrowserCdpPageStopLoadingCommandData) error { + v.Method = "Page.stopLoading" + b, err := json.Marshal(v) + if err != nil { + return err + } -// FileInfoParams defines parameters for FileInfo. -type FileInfoParams struct { - // Path Absolute path of the file or directory. - Path string `form:"path" json:"path"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// ListFilesParams defines parameters for ListFiles. -type ListFilesParams struct { - // Path Absolute directory path. - Path string `form:"path" json:"path"` +// AsBrowserCdpPageCloseCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageCloseCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageCloseCommandData() (BrowserCdpPageCloseCommandData, error) { + var body BrowserCdpPageCloseCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// ReadFileParams defines parameters for ReadFile. -type ReadFileParams struct { - // Path Absolute file path to read. - Path string `form:"path" json:"path"` +// FromBrowserCdpPageCloseCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageCloseCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageCloseCommandData(v BrowserCdpPageCloseCommandData) error { + v.Method = "Page.close" + b, err := json.Marshal(v) + t.union = b + return err } -// UploadFilesMultipartBody defines parameters for UploadFiles. -type UploadFilesMultipartBody struct { - Files []struct { - // DestPath Absolute destination path to write the file. - DestPath string `json:"dest_path"` - File openapi_types.File `json:"file"` - } `json:"files"` +// MergeBrowserCdpPageCloseCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageCloseCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageCloseCommandData(v BrowserCdpPageCloseCommandData) error { + v.Method = "Page.close" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// UploadZipMultipartBody defines parameters for UploadZip. -type UploadZipMultipartBody struct { - // DestPath Absolute destination directory to extract the archive to. - DestPath string `json:"dest_path"` - ZipFile openapi_types.File `json:"zip_file"` +// AsBrowserCdpPageSetWebLifecycleStateCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpPageSetWebLifecycleStateCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpPageSetWebLifecycleStateCommandData() (BrowserCdpPageSetWebLifecycleStateCommandData, error) { + var body BrowserCdpPageSetWebLifecycleStateCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// UploadZstdMultipartBody defines parameters for UploadZstd. -type UploadZstdMultipartBody struct { - // Archive The tar.zst archive file. - Archive openapi_types.File `json:"archive"` +// FromBrowserCdpPageSetWebLifecycleStateCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpPageSetWebLifecycleStateCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpPageSetWebLifecycleStateCommandData(v BrowserCdpPageSetWebLifecycleStateCommandData) error { + v.Method = "Page.setWebLifecycleState" + b, err := json.Marshal(v) + t.union = b + return err +} - // DestPath Absolute destination directory to extract the archive to. - DestPath string `json:"dest_path"` +// MergeBrowserCdpPageSetWebLifecycleStateCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpPageSetWebLifecycleStateCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpPageSetWebLifecycleStateCommandData(v BrowserCdpPageSetWebLifecycleStateCommandData) error { + v.Method = "Page.setWebLifecycleState" + b, err := json.Marshal(v) + if err != nil { + return err + } - // StripComponents Number of leading path components to strip during extraction (like tar --strip-components). - StripComponents *int `json:"strip_components,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// WriteFileParams defines parameters for WriteFile. -type WriteFileParams struct { - // Path Destination absolute file path. - Path string `form:"path" json:"path"` - - // Mode Optional file mode (octal string, e.g. 644). Defaults to 644. - Mode *string `form:"mode,omitempty" json:"mode,omitempty"` +// AsBrowserCdpTargetActivateTargetCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetActivateTargetCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpTargetActivateTargetCommandData() (BrowserCdpTargetActivateTargetCommandData, error) { + var body BrowserCdpTargetActivateTargetCommandData + err := json.Unmarshal(t.union, &body) + return body, err } -// LogsStreamParams defines parameters for LogsStream. -type LogsStreamParams struct { - Source LogsStreamParamsSource `form:"source" json:"source"` - Follow *bool `form:"follow,omitempty" json:"follow,omitempty"` +// FromBrowserCdpTargetActivateTargetCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetActivateTargetCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetActivateTargetCommandData(v BrowserCdpTargetActivateTargetCommandData) error { + v.Method = "Target.activateTarget" + b, err := json.Marshal(v) + t.union = b + return err +} - // Path only required if source is path - Path *string `form:"path,omitempty" json:"path,omitempty"` +// MergeBrowserCdpTargetActivateTargetCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetActivateTargetCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetActivateTargetCommandData(v BrowserCdpTargetActivateTargetCommandData) error { + v.Method = "Target.activateTarget" + b, err := json.Marshal(v) + if err != nil { + return err + } - // SupervisorProcess only required if source is supervisor - SupervisorProcess *string `form:"supervisor_process,omitempty" json:"supervisor_process,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// LogsStreamParamsSource defines parameters for LogsStream. -type LogsStreamParamsSource string +// AsBrowserCdpTargetCloseTargetCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetCloseTargetCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpTargetCloseTargetCommandData() (BrowserCdpTargetCloseTargetCommandData, error) { + var body BrowserCdpTargetCloseTargetCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// DownloadRecordingParams defines parameters for DownloadRecording. -type DownloadRecordingParams struct { - // Id Identifier of the recording session to download, as passed to /recording/start. When omitted, the default recording session is downloaded. - Id *string `form:"id,omitempty" json:"id,omitempty"` +// FromBrowserCdpTargetCloseTargetCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetCloseTargetCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetCloseTargetCommandData(v BrowserCdpTargetCloseTargetCommandData) error { + v.Method = "Target.closeTarget" + b, err := json.Marshal(v) + t.union = b + return err } -// StreamTelemetryEventsParams defines parameters for StreamTelemetryEvents. -type StreamTelemetryEventsParams struct { - // Replay Pass `all` to start from the oldest retained event. Ring buffer caps at 1024; older events are evicted and surface as a first `id` greater than 1. - Replay *StreamTelemetryEventsParamsReplay `form:"replay,omitempty" json:"replay,omitempty"` +// MergeBrowserCdpTargetCloseTargetCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetCloseTargetCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetCloseTargetCommandData(v BrowserCdpTargetCloseTargetCommandData) error { + v.Method = "Target.closeTarget" + b, err := json.Marshal(v) + if err != nil { + return err + } - // LastEventID Resume after this sequence number. Omit or send 0 to start from the current position. Sequence numbers are process-monotonic, so any previous value resumes correctly from that point. Takes precedence over `replay` when both are present, so SSE auto-reconnect resumes cleanly instead of re-replaying history. - LastEventID *string `json:"Last-Event-ID,omitempty"` + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err } -// StreamTelemetryEventsParamsReplay defines parameters for StreamTelemetryEvents. -type StreamTelemetryEventsParamsReplay string +// AsBrowserCdpTargetCreateTargetCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetCreateTargetCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpTargetCreateTargetCommandData() (BrowserCdpTargetCreateTargetCommandData, error) { + var body BrowserCdpTargetCreateTargetCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// PatchChromiumFlagsJSONRequestBody defines body for PatchChromiumFlags for application/json ContentType. -type PatchChromiumFlagsJSONRequestBody PatchChromiumFlagsJSONBody +// FromBrowserCdpTargetCreateTargetCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetCreateTargetCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetCreateTargetCommandData(v BrowserCdpTargetCreateTargetCommandData) error { + v.Method = "Target.createTarget" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeBrowserCdpTargetCreateTargetCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetCreateTargetCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetCreateTargetCommandData(v BrowserCdpTargetCreateTargetCommandData) error { + v.Method = "Target.createTarget" + b, err := json.Marshal(v) + if err != nil { + return err + } -// PatchChromiumPoliciesJSONRequestBody defines body for PatchChromiumPolicies for application/json ContentType. -type PatchChromiumPoliciesJSONRequestBody PatchChromiumPoliciesJSONBody + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// UploadExtensionsMultipartRequestBody defines body for UploadExtensions for multipart/form-data ContentType. -type UploadExtensionsMultipartRequestBody UploadExtensionsMultipartBody +// AsBrowserCdpTargetCreateBrowserContextCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetCreateBrowserContextCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpTargetCreateBrowserContextCommandData() (BrowserCdpTargetCreateBrowserContextCommandData, error) { + var body BrowserCdpTargetCreateBrowserContextCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// UploadExtensionsAndRestartMultipartRequestBody defines body for UploadExtensionsAndRestart for multipart/form-data ContentType. -type UploadExtensionsAndRestartMultipartRequestBody UploadExtensionsAndRestartMultipartBody +// FromBrowserCdpTargetCreateBrowserContextCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetCreateBrowserContextCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetCreateBrowserContextCommandData(v BrowserCdpTargetCreateBrowserContextCommandData) error { + v.Method = "Target.createBrowserContext" + b, err := json.Marshal(v) + t.union = b + return err +} -// BatchComputerActionJSONRequestBody defines body for BatchComputerAction for application/json ContentType. -type BatchComputerActionJSONRequestBody = BatchComputerActionRequest +// MergeBrowserCdpTargetCreateBrowserContextCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetCreateBrowserContextCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetCreateBrowserContextCommandData(v BrowserCdpTargetCreateBrowserContextCommandData) error { + v.Method = "Target.createBrowserContext" + b, err := json.Marshal(v) + if err != nil { + return err + } -// ClickMouseJSONRequestBody defines body for ClickMouse for application/json ContentType. -type ClickMouseJSONRequestBody = ClickMouseRequest + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// WriteClipboardJSONRequestBody defines body for WriteClipboard for application/json ContentType. -type WriteClipboardJSONRequestBody = WriteClipboardRequest +// AsBrowserCdpTargetDisposeBrowserContextCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetDisposeBrowserContextCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpTargetDisposeBrowserContextCommandData() (BrowserCdpTargetDisposeBrowserContextCommandData, error) { + var body BrowserCdpTargetDisposeBrowserContextCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// SetCursorJSONRequestBody defines body for SetCursor for application/json ContentType. -type SetCursorJSONRequestBody = SetCursorRequest +// FromBrowserCdpTargetDisposeBrowserContextCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetDisposeBrowserContextCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetDisposeBrowserContextCommandData(v BrowserCdpTargetDisposeBrowserContextCommandData) error { + v.Method = "Target.disposeBrowserContext" + b, err := json.Marshal(v) + t.union = b + return err +} -// DragMouseJSONRequestBody defines body for DragMouse for application/json ContentType. -type DragMouseJSONRequestBody = DragMouseRequest +// MergeBrowserCdpTargetDisposeBrowserContextCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetDisposeBrowserContextCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetDisposeBrowserContextCommandData(v BrowserCdpTargetDisposeBrowserContextCommandData) error { + v.Method = "Target.disposeBrowserContext" + b, err := json.Marshal(v) + if err != nil { + return err + } -// MoveMouseJSONRequestBody defines body for MoveMouse for application/json ContentType. -type MoveMouseJSONRequestBody = MoveMouseRequest + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// PressKeyJSONRequestBody defines body for PressKey for application/json ContentType. -type PressKeyJSONRequestBody = PressKeyRequest +// AsBrowserCdpTargetOpenDevToolsCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpTargetOpenDevToolsCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpTargetOpenDevToolsCommandData() (BrowserCdpTargetOpenDevToolsCommandData, error) { + var body BrowserCdpTargetOpenDevToolsCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// TakeScreenshotJSONRequestBody defines body for TakeScreenshot for application/json ContentType. -type TakeScreenshotJSONRequestBody = ScreenshotRequest +// FromBrowserCdpTargetOpenDevToolsCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpTargetOpenDevToolsCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpTargetOpenDevToolsCommandData(v BrowserCdpTargetOpenDevToolsCommandData) error { + v.Method = "Target.openDevTools" + b, err := json.Marshal(v) + t.union = b + return err +} -// ScrollJSONRequestBody defines body for Scroll for application/json ContentType. -type ScrollJSONRequestBody = ScrollRequest +// MergeBrowserCdpTargetOpenDevToolsCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpTargetOpenDevToolsCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpTargetOpenDevToolsCommandData(v BrowserCdpTargetOpenDevToolsCommandData) error { + v.Method = "Target.openDevTools" + b, err := json.Marshal(v) + if err != nil { + return err + } -// TypeTextJSONRequestBody defines body for TypeText for application/json ContentType. -type TypeTextJSONRequestBody = TypeTextRequest + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// ChromiumConfigureMultipartRequestBody defines body for ChromiumConfigure for multipart/form-data ContentType. -type ChromiumConfigureMultipartRequestBody ChromiumConfigureMultipartBody +// AsBrowserCdpBrowserCancelDownloadCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpBrowserCancelDownloadCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpBrowserCancelDownloadCommandData() (BrowserCdpBrowserCancelDownloadCommandData, error) { + var body BrowserCdpBrowserCancelDownloadCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// PatchDisplayJSONRequestBody defines body for PatchDisplay for application/json ContentType. -type PatchDisplayJSONRequestBody = PatchDisplayRequest +// FromBrowserCdpBrowserCancelDownloadCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpBrowserCancelDownloadCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpBrowserCancelDownloadCommandData(v BrowserCdpBrowserCancelDownloadCommandData) error { + v.Method = "Browser.cancelDownload" + b, err := json.Marshal(v) + t.union = b + return err +} -// CreateDirectoryJSONRequestBody defines body for CreateDirectory for application/json ContentType. -type CreateDirectoryJSONRequestBody = CreateDirectoryRequest +// MergeBrowserCdpBrowserCancelDownloadCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpBrowserCancelDownloadCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpBrowserCancelDownloadCommandData(v BrowserCdpBrowserCancelDownloadCommandData) error { + v.Method = "Browser.cancelDownload" + b, err := json.Marshal(v) + if err != nil { + return err + } -// DeleteDirectoryJSONRequestBody defines body for DeleteDirectory for application/json ContentType. -type DeleteDirectoryJSONRequestBody = DeletePathRequest + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// DeleteFileJSONRequestBody defines body for DeleteFile for application/json ContentType. -type DeleteFileJSONRequestBody = DeletePathRequest +// AsBrowserCdpBrowserCloseCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpBrowserCloseCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpBrowserCloseCommandData() (BrowserCdpBrowserCloseCommandData, error) { + var body BrowserCdpBrowserCloseCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// MovePathJSONRequestBody defines body for MovePath for application/json ContentType. -type MovePathJSONRequestBody = MovePathRequest +// FromBrowserCdpBrowserCloseCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpBrowserCloseCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpBrowserCloseCommandData(v BrowserCdpBrowserCloseCommandData) error { + v.Method = "Browser.close" + b, err := json.Marshal(v) + t.union = b + return err +} -// SetFilePermissionsJSONRequestBody defines body for SetFilePermissions for application/json ContentType. -type SetFilePermissionsJSONRequestBody = SetFilePermissionsRequest +// MergeBrowserCdpBrowserCloseCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpBrowserCloseCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpBrowserCloseCommandData(v BrowserCdpBrowserCloseCommandData) error { + v.Method = "Browser.close" + b, err := json.Marshal(v) + if err != nil { + return err + } -// UploadFilesMultipartRequestBody defines body for UploadFiles for multipart/form-data ContentType. -type UploadFilesMultipartRequestBody UploadFilesMultipartBody + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// UploadZipMultipartRequestBody defines body for UploadZip for multipart/form-data ContentType. -type UploadZipMultipartRequestBody UploadZipMultipartBody +// AsBrowserCdpBrowserSetWindowBoundsCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpBrowserSetWindowBoundsCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpBrowserSetWindowBoundsCommandData() (BrowserCdpBrowserSetWindowBoundsCommandData, error) { + var body BrowserCdpBrowserSetWindowBoundsCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// UploadZstdMultipartRequestBody defines body for UploadZstd for multipart/form-data ContentType. -type UploadZstdMultipartRequestBody UploadZstdMultipartBody +// FromBrowserCdpBrowserSetWindowBoundsCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpBrowserSetWindowBoundsCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpBrowserSetWindowBoundsCommandData(v BrowserCdpBrowserSetWindowBoundsCommandData) error { + v.Method = "Browser.setWindowBounds" + b, err := json.Marshal(v) + t.union = b + return err +} -// StartFsWatchJSONRequestBody defines body for StartFsWatch for application/json ContentType. -type StartFsWatchJSONRequestBody = StartFsWatchRequest +// MergeBrowserCdpBrowserSetWindowBoundsCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpBrowserSetWindowBoundsCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpBrowserSetWindowBoundsCommandData(v BrowserCdpBrowserSetWindowBoundsCommandData) error { + v.Method = "Browser.setWindowBounds" + b, err := json.Marshal(v) + if err != nil { + return err + } -// ExecutePlaywrightCodeJSONRequestBody defines body for ExecutePlaywrightCode for application/json ContentType. -type ExecutePlaywrightCodeJSONRequestBody = ExecutePlaywrightRequest + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// ProcessExecJSONRequestBody defines body for ProcessExec for application/json ContentType. -type ProcessExecJSONRequestBody = ProcessExecRequest +// AsBrowserCdpBrowserSetContentsSizeCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpBrowserSetContentsSizeCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpBrowserSetContentsSizeCommandData() (BrowserCdpBrowserSetContentsSizeCommandData, error) { + var body BrowserCdpBrowserSetContentsSizeCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// ProcessSpawnJSONRequestBody defines body for ProcessSpawn for application/json ContentType. -type ProcessSpawnJSONRequestBody = ProcessSpawnRequest +// FromBrowserCdpBrowserSetContentsSizeCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpBrowserSetContentsSizeCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpBrowserSetContentsSizeCommandData(v BrowserCdpBrowserSetContentsSizeCommandData) error { + v.Method = "Browser.setContentsSize" + b, err := json.Marshal(v) + t.union = b + return err +} -// ProcessKillJSONRequestBody defines body for ProcessKill for application/json ContentType. -type ProcessKillJSONRequestBody = ProcessKillRequest +// MergeBrowserCdpBrowserSetContentsSizeCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpBrowserSetContentsSizeCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpBrowserSetContentsSizeCommandData(v BrowserCdpBrowserSetContentsSizeCommandData) error { + v.Method = "Browser.setContentsSize" + b, err := json.Marshal(v) + if err != nil { + return err + } -// ProcessResizeJSONRequestBody defines body for ProcessResize for application/json ContentType. -type ProcessResizeJSONRequestBody = ProcessResizeRequest + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// ProcessStdinJSONRequestBody defines body for ProcessStdin for application/json ContentType. -type ProcessStdinJSONRequestBody = ProcessStdinRequest +// AsBrowserCdpAutofillTriggerCommandData returns the union data inside the BrowserCdpCommandEventData as a BrowserCdpAutofillTriggerCommandData +func (t BrowserCdpCommandEventData) AsBrowserCdpAutofillTriggerCommandData() (BrowserCdpAutofillTriggerCommandData, error) { + var body BrowserCdpAutofillTriggerCommandData + err := json.Unmarshal(t.union, &body) + return body, err +} -// DeleteRecordingJSONRequestBody defines body for DeleteRecording for application/json ContentType. -type DeleteRecordingJSONRequestBody = DeleteRecordingRequest +// FromBrowserCdpAutofillTriggerCommandData overwrites any union data inside the BrowserCdpCommandEventData as the provided BrowserCdpAutofillTriggerCommandData +func (t *BrowserCdpCommandEventData) FromBrowserCdpAutofillTriggerCommandData(v BrowserCdpAutofillTriggerCommandData) error { + v.Method = "Autofill.trigger" + b, err := json.Marshal(v) + t.union = b + return err +} -// MarkRecordingJSONRequestBody defines body for MarkRecording for application/json ContentType. -type MarkRecordingJSONRequestBody = MarkRecordingRequest +// MergeBrowserCdpAutofillTriggerCommandData performs a merge with any union data inside the BrowserCdpCommandEventData, using the provided BrowserCdpAutofillTriggerCommandData +func (t *BrowserCdpCommandEventData) MergeBrowserCdpAutofillTriggerCommandData(v BrowserCdpAutofillTriggerCommandData) error { + v.Method = "Autofill.trigger" + b, err := json.Marshal(v) + if err != nil { + return err + } -// StartRecordingJSONRequestBody defines body for StartRecording for application/json ContentType. -type StartRecordingJSONRequestBody = StartRecordingRequest + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} -// StopRecordingJSONRequestBody defines body for StopRecording for application/json ContentType. -type StopRecordingJSONRequestBody = StopRecordingRequest +func (t BrowserCdpCommandEventData) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"method"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} -// PatchTelemetryJSONRequestBody defines body for PatchTelemetry for application/json ContentType. -type PatchTelemetryJSONRequestBody = BrowserTelemetryConfig +func (t BrowserCdpCommandEventData) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "Autofill.trigger": + return t.AsBrowserCdpAutofillTriggerCommandData() + case "Browser.cancelDownload": + return t.AsBrowserCdpBrowserCancelDownloadCommandData() + case "Browser.close": + return t.AsBrowserCdpBrowserCloseCommandData() + case "Browser.setContentsSize": + return t.AsBrowserCdpBrowserSetContentsSizeCommandData() + case "Browser.setWindowBounds": + return t.AsBrowserCdpBrowserSetWindowBoundsCommandData() + case "DOM.focus": + return t.AsBrowserCdpDomFocusCommandData() + case "DOM.scrollIntoViewIfNeeded": + return t.AsBrowserCdpDomScrollIntoViewIfNeededCommandData() + case "DOM.setFileInputFiles": + return t.AsBrowserCdpDomSetFileInputFilesCommandData() + case "Input.cancelDragging": + return t.AsBrowserCdpInputCancelDraggingCommandData() + case "Input.dispatchDragEvent": + return t.AsBrowserCdpInputDispatchDragEventCommandData() + case "Input.dispatchKeyEvent": + return t.AsBrowserCdpInputDispatchKeyEventCommandData() + case "Input.dispatchMouseEvent": + return t.AsBrowserCdpInputDispatchMouseEventCommandData() + case "Input.dispatchTouchEvent": + return t.AsBrowserCdpInputDispatchTouchEventCommandData() + case "Input.emulateTouchFromMouseEvent": + return t.AsBrowserCdpInputEmulateTouchFromMouseEventCommandData() + case "Input.imeSetComposition": + return t.AsBrowserCdpInputImeSetCompositionCommandData() + case "Input.insertText": + return t.AsBrowserCdpInputInsertTextCommandData() + case "Input.synthesizePinchGesture": + return t.AsBrowserCdpInputSynthesizePinchGestureCommandData() + case "Input.synthesizeScrollGesture": + return t.AsBrowserCdpInputSynthesizeScrollGestureCommandData() + case "Input.synthesizeTapGesture": + return t.AsBrowserCdpInputSynthesizeTapGestureCommandData() + case "Page.bringToFront": + return t.AsBrowserCdpPageBringToFrontCommandData() + case "Page.captureScreenshot": + return t.AsBrowserCdpPageCaptureScreenshotCommandData() + case "Page.captureSnapshot": + return t.AsBrowserCdpPageCaptureSnapshotCommandData() + case "Page.close": + return t.AsBrowserCdpPageCloseCommandData() + case "Page.handleJavaScriptDialog": + return t.AsBrowserCdpPageHandleJavaScriptDialogCommandData() + case "Page.navigate": + return t.AsBrowserCdpPageNavigateCommandData() + case "Page.navigateToHistoryEntry": + return t.AsBrowserCdpPageNavigateToHistoryEntryCommandData() + case "Page.printToPDF": + return t.AsBrowserCdpPagePrintToPdfCommandData() + case "Page.reload": + return t.AsBrowserCdpPageReloadCommandData() + case "Page.setWebLifecycleState": + return t.AsBrowserCdpPageSetWebLifecycleStateCommandData() + case "Page.startScreencast": + return t.AsBrowserCdpPageStartScreencastCommandData() + case "Page.stopLoading": + return t.AsBrowserCdpPageStopLoadingCommandData() + case "Page.stopScreencast": + return t.AsBrowserCdpPageStopScreencastCommandData() + case "Target.activateTarget": + return t.AsBrowserCdpTargetActivateTargetCommandData() + case "Target.closeTarget": + return t.AsBrowserCdpTargetCloseTargetCommandData() + case "Target.createBrowserContext": + return t.AsBrowserCdpTargetCreateBrowserContextCommandData() + case "Target.createTarget": + return t.AsBrowserCdpTargetCreateTargetCommandData() + case "Target.disposeBrowserContext": + return t.AsBrowserCdpTargetDisposeBrowserContextCommandData() + case "Target.openDevTools": + return t.AsBrowserCdpTargetOpenDevToolsCommandData() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} -// PutTelemetryJSONRequestBody defines body for PutTelemetry for application/json ContentType. -type PutTelemetryJSONRequestBody = BrowserTelemetryConfig +func (t BrowserCdpCommandEventData) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} -// PublishTelemetryEventJSONRequestBody defines body for PublishTelemetryEvent for application/json ContentType. -type PublishTelemetryEventJSONRequestBody = PublishEventRequest +func (t *BrowserCdpCommandEventData) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} // AsBrowserConsoleLogEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserConsoleLogEvent func (t KnownBrowserTelemetryEvent) AsBrowserConsoleLogEvent() (BrowserConsoleLogEvent, error) { @@ -4334,6 +8068,34 @@ func (t *KnownBrowserTelemetryEvent) MergeBrowserNetworkIdleEvent(v BrowserNetwo return err } +// AsBrowserProxyErrorEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserProxyErrorEvent +func (t KnownBrowserTelemetryEvent) AsBrowserProxyErrorEvent() (BrowserProxyErrorEvent, error) { + var body BrowserProxyErrorEvent + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromBrowserProxyErrorEvent overwrites any union data inside the KnownBrowserTelemetryEvent as the provided BrowserProxyErrorEvent +func (t *KnownBrowserTelemetryEvent) FromBrowserProxyErrorEvent(v BrowserProxyErrorEvent) error { + v.Type = "proxy_error" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeBrowserProxyErrorEvent performs a merge with any union data inside the KnownBrowserTelemetryEvent, using the provided BrowserProxyErrorEvent +func (t *KnownBrowserTelemetryEvent) MergeBrowserProxyErrorEvent(v BrowserProxyErrorEvent) error { + v.Type = "proxy_error" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + // AsBrowserPageNavigationEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserPageNavigationEvent func (t KnownBrowserTelemetryEvent) AsBrowserPageNavigationEvent() (BrowserPageNavigationEvent, error) { var body BrowserPageNavigationEvent @@ -4866,6 +8628,34 @@ func (t *KnownBrowserTelemetryEvent) MergeBrowserPlatformApiCallEvent(v BrowserP return err } +// AsBrowserCdpCommandEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserCdpCommandEvent +func (t KnownBrowserTelemetryEvent) AsBrowserCdpCommandEvent() (BrowserCdpCommandEvent, error) { + var body BrowserCdpCommandEvent + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromBrowserCdpCommandEvent overwrites any union data inside the KnownBrowserTelemetryEvent as the provided BrowserCdpCommandEvent +func (t *KnownBrowserTelemetryEvent) FromBrowserCdpCommandEvent(v BrowserCdpCommandEvent) error { + v.Type = "cdp_command" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeBrowserCdpCommandEvent performs a merge with any union data inside the KnownBrowserTelemetryEvent, using the provided BrowserCdpCommandEvent +func (t *KnownBrowserTelemetryEvent) MergeBrowserCdpCommandEvent(v BrowserCdpCommandEvent) error { + v.Type = "cdp_command" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + // AsBrowserCdpConnectEvent returns the union data inside the KnownBrowserTelemetryEvent as a BrowserCdpConnectEvent func (t KnownBrowserTelemetryEvent) AsBrowserCdpConnectEvent() (BrowserCdpConnectEvent, error) { var body BrowserCdpConnectEvent @@ -5080,6 +8870,8 @@ func (t KnownBrowserTelemetryEvent) ValueByDiscriminator() (interface{}, error) return t.AsBrowserApiCallEvent() case "captcha_solve_result": return t.AsBrowserCaptchaSolveResultEvent() + case "cdp_command": + return t.AsBrowserCdpCommandEvent() case "cdp_connect": return t.AsBrowserCdpConnectEvent() case "cdp_disconnect": @@ -5136,6 +8928,8 @@ func (t KnownBrowserTelemetryEvent) ValueByDiscriminator() (interface{}, error) return t.AsBrowserPageTabOpenedEvent() case "platform_api_call": return t.AsBrowserPlatformApiCallEvent() + case "proxy_error": + return t.AsBrowserProxyErrorEvent() case "service_crashed": return t.AsBrowserServiceCrashedEvent() case "system_oom_kill": @@ -19590,395 +23384,550 @@ func (sh *strictHandler) StreamTelemetryEvents(w http.ResponseWriter, r *http.Re // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "CR3d+5eWHksOsFnAf/r0/wcAAP//oIjT6DrpAQA=", + "H4sIAAAAAAAC/+z9jXIbt5I4ir8K/vz/qiLdHdF2cnL2rF2n6jqSvNHGsnUtOTm761wSnGmSWGGAOQBG", + "FH0qVfsQ+4T7JLfQAOaDxJBDfTixzapULJJAA2g0uhuN/vjHIJV5IQUIowfP/zFQoAspNOCHH2j2Dv5e", + "gjanSkllv0qlMCCM/ZMWBWcpNUyKJ/+lpbDf6XQOObV//R8F08Hzwf//SQ3/iftVP3HQfvvtt2SQgU4V", + "KyyQwXM7IPEjDn5LBsdSTDlLP9XoYTg79JkwoATln2joMBy5BHUDiviGyeCNNK9kKbJPNI830hAcb2B/", + "880dKZh0fizzojSgXqa2edgoO5MsY/Yryi+ULEAZZgloSrmG1RFekokFReSUpB4coQhPEyMJ3EJaGiDa", + "AheGUc6Xw0EyKBpw/zHwHeyfbehvVQYKMsKZNnaIdchDcop/MCmINrLQRApi5kCmTGlDwGLGDsgM5Hob", + "HtsIsfuVM3Hmej5LBmZZwOD5gCpFl4hQBX8vmYJs8Pw/qzX8WrWTk/8CR30/KLnQoF4W7JhyfnrjN3wV", + "kynlnJg5NSRT7AY0rmPi+iZkTkXGISOTJX5/DUoAP2I5nYE+ogUjGmntebUPR5a2lOQBawm54HS5UGw2", + "NySVGXgcMikSolMFIPRcGk2oyEjKWTGRVGWEpiloPSR26tpNL6eCzgCn8fM5YUIboBmBnBkyLjg1U6ny", + "ES3YyK5oPPwg1nY8pQZmUi3t3yDK3GLQT7eBQW0UEzOLwYyaracgguUT281SvixVCj0BYM9L1+O3ZGBU", + "Kex0s/Utu1IlEDZFRNgZkikDnpEF1aTqRbISLL1q9hEIZzkz2tKjX+FESg4USc1E6B+nQgzLQRuaF4QJ", + "8l6wW5KzVEkNqRQZQrMIp2bwfMCE+fOfavBMGJgBch73TY3tsD0RdK9QttEBYFLvW4XTnvR+4jdwB9Zy", + "YUnYHomCLrmkGZlKRcYVWRGwcPU6N7GkvY5Kt6FEl5OcGbsvRpKxZyL1uTiWGYwTktKigIxQQ/7y7F++", + "JZOlAU04uwY7qFoSaeagbCtTWvbkEDckL0PHG8otZWiSlsYyJErSOVU0tdxxYvkxVUs8ZiAybXd1PBwO", + "/7OimV/HQ/Jyou3e2zU3x7QLRRHRIKLGMSndj6M8Qky/UM6PUi7TaxLaWZ5qidfxFmVnkjPOWYO0/Bii", + "zCeOkKoZjFjkSJxbaQAZUbI08I2u55sQQXOLU8fWHLPC7zRhRldTOIDhbEjGV/QaLiueNE7I+DS6V4dR", + "PCgny6IztGTlfycss0JpykCRqZJ5B2MNrXOWZRwWVEF0UG2oKSN4//Hq6oIERYy4Vsh/h5GDunL2GgtZ", + "wXw1XnvXNxxHexYvDU2v16d4fHJB3pXCMpohNrlSNAWioFBgyZCJGeLm3+gNvcR+Tlhp29YeE/uj7Y1C", + "WrijOSSvLDvUpNRA7AiC5hZQKoX9GQW5okjVZk4F0YJewyilGvlljmqFhXs8VzIHcgI3V1JyTS6UNDKV", + "nCyYAuJYX1zGcP5KWQLbrljgaqbYOCGWdFUutXFKREt9WGU1vMzFG3c21gb5D1DyaEI1ZMQ1JO4UkQUz", + "c+bUFM5ElA6SwbQUKLff0DzCzho7ERriYUqIZRh5YZaeKyEHoUKKZS5LXTXWURK2s+mxGtssshbXOr4a", + "99tZFqc997lxHKOzKxVf7/7+3Wu7ZLv2wM08tCnjsYO6csJaaG7M0w3XQknS3u/YUWuriCsSbY0ICycJ", + "CacT4LhROH08VAZPoOOGVC9FSlJaaojzu4KqcIng/O108Pw/e2k6NUf47dc16YsgW5NBSsKp4Ld6uIbM", + "xpHbyIgKk87ppeQ38A50yc0GlRibEm3bEmqMJW2igKKQocQeVGZRKEuTyhyG/TRNB/W+mmbHOvZKZ6fS", + "6RE/wu0cKcTZIyqgmzZod100UF9LHY2taINq6lsHvKxwQk/sNyAyqciU5owvh1beZWUKShNhMc7tnhZK", + "3rAM1JEuIGVTlhJD9XVQp4SRxMyZJhrMcwLCgCoU00BuqGJUGG05pYJwuFLJOS00hI7AFLkBpa1MmZTp", + "NRhycPMteUJuvjtMUG2lYmm5/owIaa+SNyhLHa+yyD2RVhCdG7+ghBScMkHeHr87tEqxgkIq43TBMaq1", + "/o4YyGQeDqilg4Czm2/bH7+zRFEqoQ3jljJmAAa0sXqSBRk/3Lvqx6gVOuajDVXGHqoYz1nTktHwMOq6", + "ivCb5tZhW3cjt0NSxksVWP/49N27t+9Gxy8vro5/fDl6/+by7eufX/7w+nR8WN0RpCC6dLf0XfTSq9V1", + "kLEHM37u1qyIAotiZLWlphMO9gc0GQzJ2M801lr4RR1oADKukWFnPbasRZam7pexDCnJ9W+qFFaggPpG", + "kwVlhkzKbAZmSMZ0QkUmBWTj574JSalIgXPIiBejBZ0BEfSGzZAj0gVdWg3+CMds05tftuVpbkkWjW6S", + "g2RQDRYlKXvuovcMv8tUazazOGkoN+RtQf9eQmI142npJL8uC3sqiOWx+kjBFBSIFOJbuoCJZgZGc6kj", + "YvNH6ZTaCguLOSjw+HRH3koLRES2EX5BzTxyg6Jm3h8++X9Ke3312ijcprzMosOu6RINXnmH205WvCyN", + "nDLOz6On8Jc5S+fkmonMrsXd2KnvYXVHbud+bDVnllLuGmjHEDK4MfYqclT4q8j//W329Nm/wD9/16ar", + "lCqrSNIsU5a8YuSzPtsrxWYzUMcyz6nI7iCrLqlghn2EjIwDzKFxQMeEqlmZo3BqrI2JojTPY82Z2LDY", + "hBRMCGcnmRtT6OdPnsyYmZeTYSrzJ+7eFq5tT9bgPJlwOXkSgMHku39+lj3L/vwvf/k++/bP2Xf/8n32", + "z3+ZZH+Z/oV+++2Eokn8ibeGjgKMof12SE7RQhLW5miT2Us24pDMqSbUchfKhGMQCjKaoqIEKUNBxwTh", + "bFLNslDydvnEChSrYz1Js2JUo25Jcx67cfqNHqFGNkplGVNq3e0BL8quuVPgnFkkzDjQ3xUKYyfW7fee", + "CqkCIuCmYYNy01nXwDzAKIe6qgf8RpN/u3z75ujdxTFhWUK0bE0npYJMgPyXRPw5JYE4ZadppK4FgOVo", + "zFQSajEHz885w1uF/Z+QwvPhHppkKoWAtNPsdBaYq0OjvVPiDpK6X2tBVCl2Y0lBJM7SYHnT2O6y7zBG", + "dOM3GdPhyyG5Wki/CI1W+mAZ0fb+GdBgt8dInhFaWJ0BLfZMu7Xm9PY1iJnlq8++/UuEIzjiiS3SSQ0y", + "oek1CCsxM2hasDxHdtcBtNNbLhxYWjeJoNlj04DYoCW/jjlDO6eR5Nm3f6mNm/oFoYRLMQNV20CtZLen", + "zzKaGkY/ZORg5jJrXiFWeVSUq+ae4+92G16RGOt34l8CUh1Cn1v1X2VjgnZpd5jHeGbDOTVzyDXwm84j", + "a9Uz0LqLrNE24n5v7nSTknGP3di4IS3LsSfIIw43wEMXvWH/em3LiqD2e9Sg3M1iubqcWYXtRC6EvU09", + "iLjzkIdpC/QWodfVaS/6dhF9YXb4nn1rNvIvzyV909+Hsezl4ucmFzN/MkezcgNxrcvD0K8WidVV8XcV", + "ZHG+ExVnX46IaG9iPznBpYaHFQ8WYl+p4NruhcEuwmDPXD835rqBPdkD8EVzpV5c6BLMsXPV05fs48Py", + "I92G3ZMzrfXa86g9j/qSedQc2GweMaiFU0BcA0sdJ2cXXdaObk63cqC+EJ6XDBYsi1nxK7Th71uwtmAi", + "k4vosj36iGuyphlvcXCqNMN6hL78+Bfs8YMsRaYfmh83Yffnx+1ee36858dfIz92p6AfN+Yw7YZwSwqp", + "8RxbKM5DnaRSqowJakDficU3z+gXw+KNLDqxuLwjFjvEhof6aYVGBUsbau5k2XfTvsTuEcO+mwZCD+6+", + "kJGDsfO4GSdknDPBcisn8AO9rT9MS84dWtEnw9uL8HE8eKpmEpz5KIMpE7DBCebe8tFLwk6PukCCITik", + "YjQtlidvPFlbiv8FJpcS3YCQVT13oo/MQJtSgU6ClwV6eWeMcjlz7txMzBJ0wyQauGdudqxGsMmQHEsx", + "ZbPgcBPOBLazEzh5e/7EuyYTo+h0ytJ6rpxNFFVLwrQuoQr9qZxGJjCnfOqeXtC9xKF8+EG8FeCctEgB", + "qhMnaDEMzoYN8eHeeEIrbRTQPBgINc0LDllCUkk56DTITOk8jofkpXePth04emoIvqwFj9tw+2NwlUC2", + "DBxyMArlRI2upCGwKvlYyVqSSU90qcycZzA2TznVmk19rJmVmbbVNUBBymJITu24Gt2zLebwGRsyjFJo", + "S5lhNatRmOv4RZC4ZnOHTEnL8T51cNDKAdm7ana7aqKKgai6r4em36H+fCuo8ZF4IH/m2j6Y9VSD66Xl", + "Q7ZvjjIOj9DYnazxkJzSdB5cIUlqNSzkHdwF1tXHhxaFkjdeSURe4Ed5Xr/v4pclz8gc1SiiIVVgyP/+", + "9/8Qu9jMBdNZWvIy2MCtScj7d691QtDLS4HSifdZ1wkxkBfcymXPOQtq5nY5is5IGq5syLCDr5Kfix3S", + "nlcFBaepWzMlHPWGxLJMe47tHy6mIwUy5XSWoK+eKHPLHaidF0FyBxxjLrUPrWig0wWu5rQoLCk8/8f6", + "k3zvd/aIr1PS9TCyFejWd+VkxajZG+LqC0TSaTPoC3KDOTHp1FZ3AN51N04GJ2/Ph1OZlj3Ancj8lW25", + "DkCnSnJ+Joz8mcHibPoGIIOsF8TLaNfIEGBeMQ5nVtWwf/Sb7+VqrzZg/D4QlqKzGVLwNrjY67jVKQY2", + "Y7qwNzTbxqtfvSCfrPbbBPwnWN4Fdui2CfS5LDXcBXjdcRP4K1mm87uArzvGwENeWnaJjV4pme+8itNO", + "ALHhWA54diuG3nOUs9V+UeBCgzJXcNt37mdVhxg4vRRmDlaxuGAinf+r09d7gr6Mdt48jDvbdx2n1Xvz", + "QFe0uOsoddf2EBd0BsOJ1W6u5Csl+5CP7fJDo0cEoPf1qiNZ+0E9Xu22AbSgxe6AfacY2H6iEYGty0UE", + "4UJ56wjFE7wS9oP5Y7RvZJDg2d8P7BvfegOgK/kj00aq5akw9u6xC9h238gghWLCXMmLk1f9AF/49tk0", + "AkxBP4XINn4H61oQArHKBUxesymky5SDs4z0AnkZ6RkbwFBlHAWnVPekz8t2pyhYWbyWNOsluR3IqkMH", + "uN0n2ezTBnpF1QzMkKaG3VjCwI/bwbp2L1u9ooDxeO4G9bjuEgepgBoIvZxTXm/Ykb4bBtlx4o0+UaBW", + "tZD6jlM/iXWODiMLEOEppi/0t40+TaC/VcaOpQvsDha+35KBFLCTTbOHEvZbcidgMXVxR1Bx1WRXIJu0", + "pjuuLa5O3hFYVGffEVb3zWJHQP002R2BbtcD7wywU+G7M8S4ctcf3LYb5E6Q1u7Ou81j6z25P7hNiupu", + "UDYqpncDFVFFdwO0XWXcDV5MV7wbhG61cDd460rcbv3j2uRuMDZoZrsC6tKedocT0et2JMLVK8yOc9ii", + "CveHtk0B3BVSh9K3M5gOFexucLp1rV3hbVXedgXYra/1hbPV/Lw7qLsT53ZL8F1gdZms+8PaYPj/7dfY", + "e9B55cux7SH7+OQiPJ76t/fbpX/y1e7BVoNPVtGKtdWECkJnIGJpFzEXwYvVR9eTt+f4PBLepSdSXl8D", + "FPjebX9w7lt1hof3Z43RFBBZGs0yQM+j2qMMnQNQzdXPe8eYd9pwOy3HEWtjt3VzgxW32+7dYWjvYbLd", + "YrrcZnLcaCnseldovolsfN6IGQk77XwdVrrNJrJV29ZmE1XbHLRuaeowxMQtHxHzSssiuMls1GX2iFot", + "4iaBzdaILTf++E298yVx9R2w+8Wt+6Ev6ReI3ORn6ALR5ZcjCNz6nMHet8Xlf0lLbWQOilye/NRM4JqQ", + "i7IowACow+A7WHs8Rrx2nHMM0+Tn82FfjwvvkPggThf16vdOF1ucLhBVj5kWK7Ifd0jNWjusRrwxvG9q", + "d47W/l6yTEfdZBv+sHarxy2Q4+ALFnMOcW4btWctiuHH9pf9beN+nFQ+Uv0ZRO1XBVmdvnTL0ScXlDmt", + "BluzPIeMUQN8SQoFKWTr/sUek4gI5+v2OzCQFQTtechGHlKTxuOykdiu7M5J6tmuc5KGT/uemTxApucG", + "1+6T7DkHrekMtucycrcvbKyJAk6XkBGKycwi4wLDtL8ZU+67eM5YBVTH8qb+Ml+uwgSRQTYkY4f0kYva", + "ft6M5MCbFZ5b96XUMCTjsnAcbZTOqZhhPjm8u7EyRydWii7amDbOu/0Hv2RHQUYql2GgCkRxozmfQAWB", + "rumMMqFdDIqABQnjNqeAWfLGz6vf0JWaSBXwSooyL1xePbdWn2qjSmfgFxzSVYf8Gq2UB+TALAt72+TL", + "kINbz0tjl3C4krysgcpBMljFVPMrnBOmx12ZUTxj3qoT8Ca68mnxIOty0vYHcAEuF/SCqqzWg8NRm5Qm", + "JN/xvs+QJWQCmFIXW/69hBJcbp+SI9ZXvKQLKlh6bRHvAqaYSBXk3o/bZ4VAd+7govq///0/pBT1/DHd", + "e3DpdoYKZwyYMm4wgeYEppacaJazmtb8tO35I0ba5TkuZqShfEiuKsdwbo+aFHz5wieMb0akaMM4r85l", + "GztD8pIv6FJ7x1DMJ+mynwcHeExMyMwLQicrDQoFGa3Sg6OUTMgCM+t5f/iK7VFNPoKSXQEe677km8ii", + "3unqwDWpoXApUzMiZIxpN3eeqYbLPWe6cnV3ZDZMs2IYZjTy2zZejVpopjG3+4BxaQxJI7jPOyaPatq4", + "yw1+S6xkk+evsuaKW24R2JFnqTvHS1Zmky0Rko12+5jInZIquUxvIyEz6JMR7uTt+VpWuGZsmkEryT5Z", + "4Ject6O2ZcZk7zZKui8FOZ6zaYRgM1eQSwPEddg63KdL1PR1ZDXp5WBwL8EQt6H3kBRdHfeiYy869qLj", + "sUVHx9PXXpbcRZYoO/+uNAk/uvwI3i5jm7am6zbCyZA28WaynGDFgzVrDY7XGbef1VnbH2602/WR/kbk", + "dKqh19ISvJMadgPhtFuK2W0Ky/Up/Punm8LXoy9scoy8n6qwCrmPlrDeZ68g7BWEvYLwkInoeQ/Dv23l", + "qjfWG4IHdUheVfHrOxQs6FBL1rx29hrJ13y7bVHnFtEV3NKuokW37M8hFcycarhDzZeQv4dogyZorJPn", + "9yt4+qFZWoNBjlblr/GpV4rSoBOimjCD+Wx8sZxQjys8u7feZzK7LmGwLqH9++2N/1MW/hvnirqxIFYb", + "Tecsh+PGS/4Kl5aF39vzs/NTEt6KsZKJy0/BDORJ7Ypw9vLNS6JgxrRRy5aNvJkc6UWz9zea6HJip+mL", + "nrhnBQ6ItypHRzV2I5HS77QN3gEN30MGyYCWGZODZHDDMrD/Noq6o3xBU30uM9yXvOSGWc5cm/N77pb3", + "aXTODHHCRl5J3DM+oaR2icxC5ibiHTH150PzMKUlt+gyskzniMpS90XalmirO+uwMWfXLSpsvMteg91n", + "jPy6TE5RP/GvN9n49tjSezKpNV/9Xnwq0mvPqvas6ouuNqPobLTLDdgXLEVN1nsx3vEGjENbZXj70FiW", + "Pj70mYG8kTBut9FzlsPIK9ksVj//hGnDRGqIiV4KMKHetJ6Vm6evaGs15nFCxqgy2z8aOvL4cEgu3QVA", + "+9R53Su4b67VRln/nk7Iq3ekWMV3iz979nE9epRTfR3Jf8uM9ym2tyfO5cKyHIuquis5ePbXVBbLhHz7", + "V87EdUKe/fmvubyBw669w2tsVVx61xS57YvyepLc1ZvyczKu7qB2G8Ml1P0tC1cXr76Iju+fHLdbhVgP", + "QuuoC4i6gd6yI3P7b2hMrmGJm/GSG7sXx0bxhPzpr+dgaEL+8tfLOZuazj35HNNJRx51fmawQDfA20bu", + "aMt5ji8vScFugeveTybLDeCX9wXfZS9qnI0ddLBYIpQHUsEC6J00sLrTXgHbqTJvaeRIQQE0lm5+Dt40", + "FZJC21M3A2E5sUukeg0YSwzUtM55I8ojqHhbZTZY0hGz2mPVi0WXIvsl5+NDn5TWZX4Ok9o/rHwpuuX9", + "xHRgAR1S+idYrgjpa1ieyIWwYvkalu8L+4eii5/81yilrYh4EPnM9OgalgXNNh8ze55YlbBdlDkolhLX", + "s+uEMT3SS2314mtY9jnF6JjvuuCA68eoAZ1Lb6VdA/wTLCeSqoyEJlYX4DBFZcAH4373V1HmBc0O+z9r", + "dUTn/0HUFkFzyOKIthTWzIbtDmRBZ9C28S+Lyp7LQjjzuNIWr+jE/vNSKbkI5Pnqe6v//2Tn3XTjJ7RW", + "YSL3gBfEzKWGVrL6ydLdM0Yu/3Xbv/4zr/VRL2uTmKnhth1fyknOjPG15YkrwGs08Ck+Lfa4Ij6sghXP", + "UfZAKlYNfCclq9ltr2bt5FRSGuNY6K5SDXH+g+u+LtTcD/gkWClFYW0HY6tmWPZhebIr1ZJlHL9B7mz/", + "mND0Gmu1uLihhyjUkvjVbmPKvpVjzplciCF5I8XRR1DSyj9KxviGdS5vIBuTHKhwJ9be9J0I84YdM+9U", + "ATlLr7drnhhu7LQ5h0+MDOQY1kYOvvWD4b3KfX241zm/GHsmcENj3po/SsU+SmEo906RBJsmLgQbSfOX", + "OQAf977eu6Fil3zLKNKHG+h+enTN5Ts0aWywokvjNC+cwEdWYz+/Aw60+YU/y6vregCWM5U+3cHKGccy", + "VSgCCzu5UkFCnqKK0Rub2zTURpamP4iOWkj7Qd2ZAi5c/47t9786TbQ2BtTXiwO3uW6fi4ep/vWZqqRU", + "zOxsKB8F8ttIo3X7BrkePduNXg3jUffzCysUGDe1H9K/H/0HKTgVkDh1bqYA9G7jLPuM87f7jbNg2sSH", + "wVQOC6aBKGl8DrrVEdaPx96Kuznl8wNdMmrgO10ymt32l4z9Y/re4NmZoLU6KR2SGhusKGroH4g5i61W", + "hp9ORVb9bTU0J7jx4wM+UPbX0MIL+ZQpbQjOg6BK8+CqWyNp5x9EdVM0Y6Xech9xjTrR1D9KzA226Uby", + "YEN5+TyiYsYjZPDO/75h7++gOnylOuMGJD6UMnllFbyuYR5bw+w5+D3VTgtyhCC3W5Awvys0p6FXhCq+", + "W3bm+ImruMdr6u0Ox+Meem/naSdOojSKZBNu180E+rU7mYH3Qz32igXTViw4scFyqpZ+l5ovIjTgyR+m", + "oOo8vMp9Tz7WQ/uOEU4PjbxfiZJ7aubd+aV7aeibuu819T/4c8BDqHAPYE7fG86/VsP5I5nJ/7BGcTIB", + "i3TPNPE0oWR4TGfPDQUE9l6fe6/PO9sLN5abu6dSslZao5cuEum1V0H2xsKvMUhwvTbNr9GUSwWnKSbm", + "HYGIYOpd3YAoKmZAQGQ+XVCntaoBFHNC9wGLDbcAdj6/dlOjc70MPzfmiLn7WbWbARnbR+iYeD1Gc8I7", + "j/I1+NFF8PHQTnTNSfURWNEiq/eVVBXQfiKq0Xwvm/ay6auUTXUptV+/Wjdjh4RH8CzekSlur1h8TwYZ", + "L07Xi1l2dd0zzj3j/JIZp884NHLpiO5snlpPe7RuoWrlPcJVbMx89HhWqo4alvFbi8tAOtIFQPTS4jOU", + "epdHgu3wMcyZSUhhv8RCPp06eko5jKY0NVJtGAGbhQekwk6cHHwonz79Dp6Rj1JiuoHDL/pl+suzg+0k", + "NDur8j+Y1GyNsKPYXOm7l5t7ubmXm1+q3GwXd44JzkI5C/+U2y86Y4LxZ1cIqywKJ066AoFdmH8PX5iK", + "F/rMAJX7mHu322BMtPAz4HQZrd53Yn8hEzALABFgJ2vl+r4gU1yH1nO5YAU4VWcnTeeRBfitZQKGipib", + "Z+RR2LdtD/aCOBPiTaAWTThMzQ5zwDr22DVSLLYmzXk9oWomVfL7gvqShBCQ+XvrL8lguQG7ay/jfXFb", + "FjuM3xOzN2EyD4LXB1Dc6lL3j6K11eB3VNmaHff62l5f+6K9hXyJxohUD7Uig2BHLxksHYu54O2nsugt", + "5r9uxbBmKV+OvZ0WvV0OJTG0WI3YN7Q4/HpCATdLxlaOpGgCm88x479P5DRIBpjHaZAM6jROg2RgSa5n", + "JvSme+0aepyL32TFx5bWHrafCbqsiBokA6tX2wOISUEszrAcV4IFcBz9LajKdkHcBtJac4/8bLDVzGwQ", + "8uqHxAbhM+Y1CB8wqUFPtF3QGfxgv76Sr5R8IGd/C3Q4aUDdopdG2u/V0b06+nX5K6wdgq84277FxbHz", + "SLhMFYDQc/mArCldBd2HP0U67ZnUTkzKIXA0gaUU2ejG66Gb80X6TgRuDWAhs8qCE/p3pn3lrOgs8WlJ", + "GgsgSUFcmzsq2DgKvsxuHgSTMLoXXPfQu9sIHaVDmyNgk/us4nYz/NvggHqPIZabh1jec4i9FPzcChl6", + "ZOxuHqnZ8CsHI2Idye2Zc0MQK4JAW552MP6vAmbjhIwLMXOZJhYwKR4mR5S9QYx0qaY0ZiWPMTYrkQ29", + "BlGHjfv+a3XZLMfr4nYd+sSa0IoqFbIwLGcfYTSVqsvRJcwdRCozSwlTeiMVZP4VSN6AIpp9hK4J/r2k", + "nJkYA5A5vvtZsvWNQpqNp09dDjoutV76nfyCntfuqxkJWjyOXuQB76IVVV32OtH+4rYXWVGR5c9Ip8AK", + "DWIyK5+bnD+MjNoiKvwkvvbbJ5caHpCzWnC9+KlruOeiey76FZq/kPq/cs7zIxUZh3+jN/QS13jCKJez", + "h2NF8yj8Prypq+eeWe1U8ChNodhi9coQs45qsbmbUMZ0zjZ5SO4Z4RfCCONHrcPRVuaFGe0eFQjCgEIH", + "TiMJJQ6OJ707Rwp+OZw6CSd1O8t+Q2/YjJoH1BeFh9iHLddt94x4rzV+0XdvRXOILvJtQf9eAsEGDc6y", + "gTO8IJRwKWag/IWauRu0pTx7wmoY92Lk4XB2BBdOQSl7QCRn6fIuRoV3HsSFg7BuVAgNiBvj0VLz1WtR", + "YGl4i/W7nZYUse76O8kTPvWTPg0N6LN0MFRUuKwld8/EXYHocBX1IsouXQHV+I/fykALlHNQoRocZwLL", + "MtkJYXJuBVzSByrPVCo+wjVE3kgu8fuqRjVow4Sb9/t3r8PsUH5hgeqJLDGPuOX7dnKOeHSVndd26iCe", + "xr589+2DXd+CLnAlf2TaSLU8FUYtH14zaMPfRU9Y7bnXGvZawxdd48CSeXSR/hwQbNFaTjgrKAN6Fw7d", + "cMy+aKNWA8fbGeSFYsJcyYts+nBMsfAwT171YYTN1nvmt2d+X3TYE9MFp8vRHGgGajSV0oDq1s0pcQ1x", + "vq4xWYCy2yMy2KB3u7YjA3nBqYHttwAawIcuVRA4Z3WmKv/TrreAUBRulMkUSXokS8OZgE3zCW2Jb4sT", + "gnwCWdZjJENnM8hGRTbdNIZrRQ5omlrePuFwSC5OXuFQ1XNv11h+D3fBsd/Nx8Axt/IkpcUWPyd0fLTD", + "csoyi1pkRKFvpzsTVTMmRhNpjMwjyaHxe+JaEfwvne9QWsODxwCUNeCvYWruDVrF/U7foavpfYEbWUT4", + "ryzuATiuy9SSMm56pjMYYU5V3YcYfSFyMVuhww4aKGgBqtOD98L+2vDd3XHBDniHW62DXTnU7goajRej", + "VOsRIkizj1vOCPq6ooMw++hwU3gDiHescwep2OJih7s1mtD0eqZkKTY48dVtyEzRYs5S7dg8gthgXYk7", + "Ol/gxqKEcD7OX3Z9JEWFtjucy+xu1U2z6ZWHcW5BrFtrfpQLXGctGrwmdDB+h3++1D9QDX/+k/NfDd9d", + "YvTYQ9ho7mr9eIdWoodT7L3VqYdSH1ruFfq9Qv8lK/RsJqSCUUrT+Rap4k4EmSwL6tgjGnnTeaf8sM1B", + "bXpfqVRk1/QP9dLilhu3s+BK7pRSnAnL6CAjrsPe+fwSzC8wec2mkC5TDpfmQd+9dQR6H+4f77eXBXtZ", + "8BU6D8UOwxeTjUXjau6gda+jZF3vrhoQHIZQd0MlB+Opkh9BOHXb1dp8PDU7LLIHMzZUGRfclVL9gJFA", + "ug24Fwte7bLnvnvu+4XXTlfLkTDzEbodra/1FXojaZoX3Cd5AXVDO9OP3jcY1p66ztgiN5euYFhka4WY", + "PVCAEb3tNNud01uWl7n31KrNd81Q78hTK73tstW1AVY2uy3wOgRnm4VFZebd4lj394ZLI4vXkmZMzB5S", + "TFVA+4moRvO9eNqLp6/xclCfga880MpypMfRnZtw+/Klvea8Z0171lRs0b6+Eu608kAYSWa/IJQE35MM", + "3wlZ/Uz42aS2bD9mDpJB+yWzbw5LV3opnvfT/+gmX2OMCseCXUbQzysXqOWAIHoiZyVAJFJeqiM+hAYn", + "WKym+tlklg3rGSSND7/MQZzIhZgpmln0ScVmTFR/2J+PldT6bfje8rr6g1EsNdGP6z1LoekU3qu+CVjX", + "7u4dZoS1q7tDqK66fzZ79F8FzCwJi9lOKGqkTlmXjfFUX00U2e6fJ4oWMCn6YqqdYmadlOIYcr5Hvu/n", + "wwvnJu97yq6omoF5mRp2Qw24Tw+i8TtQQ9qCvEXn7+iz1/r3Wv/XpfVHD8IXVDfCLmeTO41r8Xt40XQW", + "dK7mvPmG4jkol/oRmGlag+3HSVsd9mx0z0a/SjbaOAV7Hvr58FAF1ED4VgoDtw/LTCPwe3LVaM89e92z", + "1y89YFJqGEkxysDQdL4tkYlwWbI08T2zGt0ZTMrZzM4x8FYHEnT/NN4bDmNXOrDb5cg5fY8406ZXZBZu", + "lutEbCfk9qkUUzbbFAPoBtOgbvokfgnjrMDGMET3i5cvX3a6l1KwG1Ca8pEAs5DqeuSiQUfOGLm91pxr", + "p8lMUWE5VgWQeIDEAXSYDa3NHHIN/AY0HpA+ydzu8nbRlGqPcDVowN1Fiu0vB3eRXn1CCe1x8joYnmtE", + "dxbCJ2oIXSc4YMAz0k2qXuDvFc/9PaJP9hL988v/QiccRhOwzNWlkLMUpCTvpuofbGP38OLbumwACCoj", + "B3OgGbeSSgq+POxOipCWevPREbBoHh/ssSnLghoZOtmcYWASADbrh3gj//pJ7U42EHfg/IWJTC4anpsn", + "Zxdd3o1zlmUgduYdrltnlFo0aN9P69ZXGHcM0L38NMqc7uAQGhEfUX1LwGK0wME37YrdZteqX6qHz/Ku", + "HstK4Pdlecd9+RwyxSWDDtdkv/bKJ3nDSXG0Mbp7cAv27wpr8RNxMS1N529h5QS3WMmZwBJAmOsvp7f1", + "h2nJuduw3yuw3J2+E3e9ejxLSRYboJ+S2dF1r23upG3uNcG9Jvj7mM6j5/cLT9kXOW592PDbAkTgSg/J", + "fWUDbj+m2+6x57V7u/RXybuax6AjS5cAHkVP6EawCbGQ0Hn4U0nQ/YvkH+xFUpbp/PQGhIn7UuPvzmOa", + "FHOq4bPxFTR25hgtb9GByxRZ+PNc3kD4+5iKFHp7Fbazrq+b7HsmXf9s0MiZuPZ8GAukuMM3mlBlP5VG", + "jiZSXudUXYfPupy46GhLvKKkvPlN5Y4fWhtZ4Hn1zN+2zZndMp/cJxlcw3IhVeOvURNIn01bzwMRz2fH", + "47kgPpu9chkrsIyNYUjgvbDTMCSsp930gmwRtSd8RkECKqeWxiqjh2Ot1d+1yaMX1qTQksOpUlIh81xH", + "3MvmjdU2JmBbW/2uFCktZ3ND6mJPBG5TwK4hOuU0ZwbdtbFE9EKSjGnDRGpQpdGyVClosmBmTjI2nYKy", + "KLLqINFzWoAeknelMCyHoR//5cXZsWU9GTnw3wzdjCxD0odWS8pKCxOPY4KVoBKrtuoENSBtaHo9Moqm", + "UMOupn01V3IhyEG1tuqXJmgHkzMBCUklL3OR+KWMSsUj47xiwDMvH+1hTOmEQ1A7XU/UsShqAVG1lxqY", + "SbVsqlF+/dEdzvzNpo8RbpUK8FZklRycWE8o2PPS9cBUkxaFJlaP+0pZbcHbPu1OTy12XDnx0ItkJeIH", + "04pyljOjh1Fzs4m8UuBUiN1YbWhe2GvHe8FuSc5SJTWk0qpT/bT0UNVkBeUjJLkI4lf0GKMD1KTewQqx", + "m1Sa6J7sal7FnsEm8Fvyj9V6fmoWwd5LzquzXl3HSCpBpU4PdGvVQ3Lh3CbwJcndiNzC/GnvOrgW9cxA", + "jmOva6nuC6oUXbp7kj1fsaQV9nviErKGR1vXwM5FOUNvzY+QvPB09574ClcYRinESf3oJSBg0XZyoiEh", + "lC/oUpMPA6SgD4N7YXENefFE4a+ZgN8fUTWDXJ/h+3evw2OGn9mUcS9AzVzBoj3HB5hYKy1XYNR9GSbl", + "/NL2Qnq1Z2s9zLXMqThSQDPk9E5CeVGkWxaGQCQLWfKM+KT3aGp4JatfnYg7OHRCLkEAU6a0qe0xjQNK", + "/RF1ICKiLPGPIDBltyis3Pxy0JrOICH4APVh8D70RDb0nEykzD8MrOhv/HbABBZgZBoOib1M+Ma39YVw", + "Wgo0WHwYtB6Runhm24AZWOOva8zxtZz1Vlq4nPnbX6U1cDlLKvwyMZX1pwVVIiFg0uHh8HeQxGFhezm8", + "VQ7HS4s+sBRu7ccfSwbvJEo3iKpOJdvCSEiVh1fJcjYnpZgy7kqwIrt1VughGSMfGeMrqixdDSLSUpnc", + "IdSECW2AZi8I5ZzgPYWsSkxtVWWgilgZNSSX4KyguoAUb1vIA0vOiaWJKGN5JN7+Chnv6vas785wK6sL", + "FoPtLK9FRZ23W8fhwtMiHrraYBNYYi4FM/YGh8VzObdYPQrS023PkKyYn50ZLnGpytz9pg6xJ1DIFN0E", + "FnOWzp2oxpnINC1V5YvQJvzuiph2l1fLYeIN0esubjJx/ac7D7SF2p0EOiFWobD6BAGazpsJBGLjCHoz", + "0vD3SE43KaRxlgS+JEykCqi21/oGujT8vQSRBpUscc3svNB+7yZgZOENwI2eUST04J53sFaHE+ZNwvWr", + "QxQfG0zLgTbXbMvkQBtUjqiVBrqxTh0Wij5hh5tGDHKhx8l2jw6uyCS658TVUAUcbqiVW9I9cCEpv3BO", + "aLaBxUxjT+xZwN/c0UmCValu6z2b/dHayhQam9VEbHvJNQluEF9NVWC3R84LJW9AUEukORiK2oHfuaWl", + "ZnfQvT1EEfBGnurkr2tNENfULjyII8vW2ZSlnnMIe/y9I1SXbBojepvcqzJRIarjhHPNYj7BTlUJCxri", + "O9n4uRdspHptugh+Q16MOatWzVyHZHwNSgAf0YKNn5Of8AN5eXFGXKgBObB8Rt34F0X35VGd3CXMnIzh", + "1oCwhDB+Xqdy9/OpfhuSMZcp5aNCyRS0Hj8neqkN5MR/QVQphN0xyqWYeatkPd2WcTHNCjROh/nbn8JA", + "A8tbGwNFNd1AKt3EFlFSttFDkGaOGCy3cufgiT8nT5yoODtp7Xc4CytnCzd/w4n50ZjiRyw8pbsXYVS5", + "dmB+vLq68CWrNMlpYXd3QVWGbmRHzFOKnb1lbbI0xJly2UefpeZnZ3bGh9Zl4eWH1/LIpDQkp0syAULF", + "Eh+2UUVqaT1rizkTBhRFpn3MWXq99bJU4o3JNg2ahPclJDeM1kTocm64ogK9bkesnsh9b0jRNe3vSZ33", + "pAbqR7izj3hb6t6bB74zaeCQGhkpBnh8eUnCr6SgZh5s7Lh2y185KlodKsUsYsi5On9NDJ05ieRtVCvQ", + "7IaVRQEqpTpIrR/eX129fZOQlwk5Ofu5Q4eJKvM/M6yuh9Yix/2E6Rg4IUaxPO8wBt7GYMOikMqQ26Pa", + "hbkF3K4Fi3q5LMRRIltuALy8O+AVOrwd2JGSerfdDm28JjVI8CdYbmV417CcSKqyz4HdhfXsmV0vZncN", + "y0/D6lr78sCMzi5iDYE/wdK/M1fa50+ejh1uHQM6tVNMyA80vdYFTe2tPc6F7sBNA99D+/ycZi74p3aK", + "u4ZlqAWodQd36s9tfWTRJm579ubi/VVCrk7/dvXy3Wk3z11VB+EeDOYyVZLzSzCGQ7aV1WhsTbRr7hlO", + "uDfRqambVOEm2shCk3ROxYyJWfLHZk/r2Ngzql6Myu36yBPGp+FZHZv1wNzLsqfRbSz6Cen89qiidGq8", + "xwtVpvEOaFvNQFui76OW4HjLzvGWDz2et8fcgX+6sbapozKGvFdMUB4m20Th1Hgf07CCwGr6rETG8NYa", + "avkgQ63QsqeQauv8ov2E1jG8kTW/Zjdg1dBjZ6rs5Mic3QC5YbCoHLJch9oP3N7jpyUPvPsbTX6Bybur", + "48qG8wau5eGQ/OjbScGXL/CtMzD0qVSkCrRlOZ2B7v2Q6O2s9+XNMXTsWXInS7ZUMbJUEfzlH5ETd27N", + "jkZaUEfBcl/QJZbMtIQ3XlvLuGF8Xr1Kd78MvK4Oyvr7wJBctoz3CvxQ2js7YqlhPF7B/j3hrMC4C3tI", + "0BXQG1HR+a8KORjXUxrvZCzvgfCTKvChP3eogyUqL8YdWMQFZe7tKrork+Xacn8PFrGClj2X6MElarL4", + "BIwitkEPzisaUUGd7CIrFdqrR3ksOQTl/CjlMr0moV1lAaqDlpggOeOcNTZip9rqm7jSCxf65B+tU6kU", + "6EKKDGOhurjiji9yTRRs2Lpz98p+0uAeHTznyod3NQO7ZHjpsaeCS22G5Ap1RaOWgW36B4FMSQzQKYVh", + "PDzujyp+DCE0TA/JlQJq8AWBiaNCyRlmrLJnGn01nFP8QUjtxDKOnh8zGHG6lKUJd5RDQjUphQLOUAS4", + "kc0cRD8G5ud4X+7VheE9++pkX4E6mjLtEdnXxh3axr/adOSCkGI1IDA4KXgr1AvDR7UUD9FIAd70IKse", + "dKvX0fDLsPkOutJrO4b87Laj4kww84oyvpUZBN6WoleovVpM7J2UGUY5++jm+6lP2srk9+ds6zmzGzaa", + "Isoe/5jFtme3Q6YNFN0k6WIyiVQ1HXp/JgOFMwW7pXqbrA/y1WBelka+NIam8x42WZzE9tW+CwKu13GK", + "ytbW2VJwBOiPxPS8ssjC7ZyW2jj/CV5fcpwNyUBeGD0kbySZlsqlhVoV0gvGuRfABCO2mQ5n+/c4wjGs", + "7c/x1nNcbfwnO8ydG/UoYrNF2HaJpYJh/e3InwMrQN05sBQeDgBZgAKCLzRlUbm36BITeU5LzpcoZqUK", + "mQXaB7IpeSMjPqDwfQf3VsVXVhVhGXRVBzl1jCBYBrOywsOMFujv4/T747YajomoQuzoirthsKgYRdNr", + "C82rKmSqQM+DkYJpUkgmzO/KZ/Y8Zmce80nZy31YSzirfY0CFn2r139i6DXgKavgNd4X2kepD37XeENs", + "ktvxU9ft6jQUFqCYzFjaKNIVrB3hzffGO8X0O4E1nAc6hCuL2J/BrWdw4xY88BGM7c5uJ7AQEQ8KV4/y", + "CEQqM8jIxZt/7UmgFdomSwNbtfRCzDat8Y2TUGcZh62eEUGasSx4bq/4RVDy/dOnuSZ/LxkYf+6cTV1I", + "wsTRlGNCV3TB9c73PV/b/ND3PW8r7+D7E7Z+wppGxUc8W57ufJXwjVfDdQLkrle4xfoEFmdTryK7qA7M", + "3MQV0Gxp8eNpDz2frOZI8Zpr78BCkkIxqcg4rN2DGLt8zI2XYmYOEzIuFaYzDXFR9u8qnGnsYq7GCnwU", + "tUXAuJEy4gUZR4gRI/EKquxtnS9JIYuS1znOqSEp1dA328QDHZbOLdrLp62nx1Po499CN2/SA/sJpZi4", + "atueNQ9g6LEa2ohuNi13uPWtwzDUUdz1+k0I1cJQ1cZv3qQlwDx/fvru3ej47Zs3p8dXZ2/fjN6dvnp/", + "eXoS9630k+4MvAuLakTFVcn7TFUBg6IFaoWNdD5e2VEbXCI+sF/p8J1verUsoGEOwBHWwn6bkSw+4vcn", + "IRci5ExiIuVlBuTEh1km5BWYdJ6Qv/34LiEuQ1BCLs2Sg56Dvdti9duEnEPGaEJeSdvnCm7Nlb3ZJqRx", + "uhPyC0wuZXptu51TwaY4wwsFUzfGWzMH5dhkLhVsNzQ29qZFFUlNkBv9jTwK3zkwvaVM2D5MX9ERLPf4", + "7Lc56z3j3cp4/aY9Psdd25cH5rUhAnprGpYqVBr1BGfxDyGeHhtR3jNvRM/tMu9m5N16GniPlhBhN7Qj", + "+TnZY9vJ5s5CmyHm4GEiY6njpgun/pS6vaY78zztuVtBlbZ8qHB5/xxDwgQHUXQxPVKQMWWJYcPJYboW", + "FbqZq1ZOMeGmgzDcUpgrErLoH3WoJj6dDgJfMBU86//19CohF28vr+ICrpDajAL7ie/ZRGZLFC0WypOL", + "91fVJS2xi6M3lHE64dAhytzS4vTqStdTjrHWE5hKn8wo9MJtqPP1NpCNaFQlPJDUTkgp2N9LaEboN555", + "9hL6/hK6SgnbYmE1w1ljCP2Ety6k0LCD9HYdiIIUMOGyvya+spNumC6rhkj+dlP8m4HrluC7I1JliBp2", + "r4S/jzLQwMJeG+ihDTh8fQp1YHVnHlgfsNQZ3SS/Ey0yrtkppl2b+pRm5Pzs/NSl7PmkKoGfWVMn6CPr", + "vIIjg+zYpM3kLO/i0dWiA8AKVU5wWsw8mZucJyHlp+2IGfb3d8U/vCTC1FEmVgLNm5n9XrtWJJUZdGQ9", + "xAYd9oYorEa2i7c/JeSNNOSVLEV2eFeB6VdSH8SNkvGCzuBYUT3fYDkt6Ay+sSqpyECBqtzpUtePHFBB", + "PgxeLhJyKWjx//swCE4Fh2Qxd4kda6NN6MyMBj61WFhaScqtMCTvQtbxUO7Aj+Bn4HWspBFD4B3n7N5W", + "KYe07T521DsMWUrGQ3IcIip9GskwtbEFPyaBY1vx7evn9TWWWgD3lc6rO7GXzJ2SGb2UPW08olSO7shu", + "j3YbMmXVuW2aPD540DcI/9MmxMJUoXTmHGCk8Fcp0338t/Op7qxWdhZbNuBE5scuK8ZrSbMe7zsnb89b", + "HUIiUItvC3CYVRARFqryPRN/PtQ5jy5qf+A3H/hM5iOfIAWfRh797Hfv0kM/iWTFqMJbhFM4j7Q8JBsk", + "zsHG12ERJDjXUOMzta0dganFR0IUcGrYDW7xqjx2LmUH9p6Ku4ZZHg+H5L0GMjbaZV9btN17ItE8K/hv", + "r2yrJvIaI0/6JllwcSodSRaeebT4SzqyNIyDql0JDKgbwHRpAdKcTdFOVRsOb5guKbfYmTDOzHJITmk6", + "b3VwnnvOTvfsyI9qF60+HVPZ+yT04yHt0KZH5h+emi2NbM9cXealP5wt2jo4fn156Em7Cke9AIUIECmQ", + "K5YDZwLIy4uzTyvEVpe3l1/9aM8i7BNT3qO8LXkXy0i1tpVw0BZBgzBqueYXeuALJTxFMdNix6QAhWmg", + "D6PBo02sjjIwlHG9e7RsOE4NxBFqjGKT0oDecvJwSetnb06zkYLUqitYEHIzSbeQ5LMppZA5rwdM1YhA", + "wpMD+sglBG5TXqIbE/P84fj1ZZzkUV2IBNg2x9WpVMHYg7dgu1cHWFjeYiJ4yL++PIyL/jWa9NamHbM/", + "h0xQ+H1dtKKFoirZdPR2xGJ1uKObV5/3GLVuD19ejWdaWbCfSx1I3EMJSout4uK1vUZpQ7yaNy05uaDM", + "XnNeH1/8UeWFX9deTmyRE2nx2OKhuRMPLBZ4WtyRDXuarknaUfR92bBPuhTlPiyrwYfz//r4ok64yabh", + "EaQzAf0ozmzszcvFQKzD7ZUVQcism2WevD0ntkGEazbGiduonSGnY9rv8Me+E3/hBTZmhTlyTxI+AVIV", + "GnbFciZmRy85l4sj94QfzwLBPkJ3elSqgHZMyOWfIvrvJW3Lgxr2NveXJkR00bVLIFKRG5aBDD91ZHN/", + "XKHXnJrlYd4M9/ByDweKKWd3FnrbJZ2k22/59c191ZDHQ/ffw4RXzX0vzraIM0kf/aLd2os/uHEOdcya", + "nD8X01xdIrjfiW1WQHGJNdbOL/ILD9eeX3JMlWKAtUGqQgBTV0uTCeRaE0ylb4gvh+HLq4WyHU1L3GrB", + "mk/LHVawtecRm3lEvVmPzCli+7Lbi97dpLoIVO5a7FrN6A0syOaKRoRqzWbChxjhkdhS1KigyqrF3eu5", + "wAbrS8JKJr42drOMzwsfnORmEClopDsSUu9arejBahJ92pfVmgaMfLC6QM4rsqF51VTU+yhsfm8JJZ3x", + "IbjjIa4qi7RiYCdzegNkIs3cybnKj0i3aaf15FK9QDNNGuDdSwyWSUH/YXImMiisNuwKJjRjDl8QSjQT", + "Mw7EtnBJE5xvVCbBFaqcoKxk5lP6eOyfaXaVB5/oqeaKTt4WIDY8OgpYVAqOoRN7OfT8BB0lsLPTbXwm", + "pBAbeiXdF0j7SNeunz50bsQ6uLLTViowpuvoUp+o2E4hlObTspVLdFskqdeX2jGkDcWpOhVIflavjMWX", + "DsmxFLrMQdl7qAufXdHTsLZVqGc0x5RLBvMQMmN1NYqWfEb5TrGoD6WVtXd5r5RtPoSGTkaOrj/p4buD", + "ToazjGtOV10eVvYMY7CTP7p4GKQAF6UilrsqGXF3riDvBCz4shqKTh5F8zDM8Ij5x0VFcc97bJtKK0WG", + "Ep9MVI0JoBqms24YD+YFxqmxNPyyYMeU804ObZmO29KcCjRBNv1Ofz4nirqsbXMqSKbYTVA2fJOEzKnI", + "GnHGrjbekbNnHtGC+XTPzzF7jUL2x9kU0mXKIcEa5r4cH6pD/vbuJuPrN1UJ42yLRtXqKZv596EhuZqD", + "RoMnyaU2fEkKj4AjJrIyrTLuFUpi2XRNbyAhCrCSuK8acthaLJ1ZTuGKQejeTNePem/GG9m+PevtZr0e", + "XSNasJEl6cdkvl1bs3u2aTx8rVTTawup8kyT81BkVAq+fE5oReHuDKfBDCTtPdNfP/yFAzUfg9ZxLDhP", + "xqnMYOx32BXbd79JQcbV0DGiv2t2a8clVK9HHDueGyQmM84xfXXmqmd/g1qk8vchQXMI6wlZ5u136Dhf", + "TcGXTL1wrOb0FlKr/V0aqsy7wKLGu8ef2A2NxJ9Uz2/rjDG0zlmWcVjQx4yy2BQF0cJ3IxaiZz6wCyVv", + "l6dKSbXByEmFvZIWtukRp0uLGBfuQOTEF3ttJ6oYktYd2v5ihYAk4FJyz6U2RwjP7bRVk8Mw39/e+vwU", + "zil7LnUj9iicFIxi+NuRqz97hKs4OnXF2V0UyJC8loujG8nLHFD2hJ4Ug5oyh2xyZnSwXKPfzVEzvsJ+", + "toI/vJgyn1LSt9FO9oZsOV4QeR3BhVNqexXInzvcBay5KqgYkuHwh1nG6+gMq1gFAKnkvr4Oq2rdeo7A", + "NF6ZBJGFOWKCKJgy4Z7NQsQWXaxUZ24LSZLBlJbcHNn1cssnxIxoNhOUf+KkOStkuJeW3dLSYmqEB+Qx", + "5WRkPx76lUlmEK2XXTEZxwVsu+ebzrtqB0o2awd2cpU21+rgTVXR4pxhT0ypgLY6PM1gaeI5yUAbDEuU", + "YoQWNsgS2+KGZaBGE07Ta860aX1bCgU0ndtznzhoo1JUiQISUhaOceBzlSxN45tM6JHnI41v2+l7h+S9", + "uMZgxCZKHNvx5RTalbEja3Cnf20Rza8bq3Bft5dh7zkr62h+1VhI8+utiYh3CoL1qc6qIE4UR4iaRw9R", + "3RR2+2BBqVvWs5P2UeVOdCemcVoOvn/67eGuigme72oKG19bL0HdsHRrVKa7V2Z4eFkKBG6ZwcIgcFtg", + "qle+HJIzVJpRjfcFJp3K6PQkqY7qVC96XppMLsQhySSaAn15/KaZ8H//+3+cpK5HwXG1C8AElfsYa3zy", + "PZqxGzgqC18dCm+fJJN9ham7S99XlkawuZennfLUE9MnCK7s2pc7XD0tiPbdc2UZ9c3z9JYZlKFIsE65", + "Q0GA5fxuC6lrOViKDBRfWu7VtuWoKrd/OqdCAEcVFM9FuK3ZA+nYolkmzuUjGIpIMaca6ijPypOZMOGs", + "9QfIxyrJcehcHs9OcKLKh0jHThFCjtVQ6jH0kIzx0JbFmORAhQ6yHReeMYsX907BMMGAIiju7CXVylVu", + "5sugkbuc5kMy9p8DQEoKBTdMlpovqz6tEdrMazyjNzCKTyjsRJU53seoOl+ZKlk97rJxJZOMsnv5goi6", + "gEMXobhCDlPWdIYP2+rqH2lpRWsjG7uunhKrs+TQOUgGHg+DZOBXFGVqRfQqfnayFhPsUDAkLyd1sqMY", + "buxgpCzWq1tE0eTMKVwK27XKNU9dibyLs5OOhAcegYLmcf11pmjerqbvlxHw6W0YWIaHlfk4IeO8NAaU", + "/WvN0jDuU1OkOafEn4pNrAgFzVuZ/8Q6zctXcyCvmShvvfGDvH17fnTNOMcyICj3MIVxnd9AaJa5s/bz", + "+ZA4yeFLCo6fZHDz5DrXs3F4A7RkRkV9HBD0iiU6CI0ccqmW1Ya65/MQB+L90apobV1OPEwIN3TP7nRZ", + "WETp/mkOHkgir6F7L5C7BTIiayRlPrIk8ZgCOb4tu8tjO88VcdxeRHfBwVQKbRRlsRP4y7x9FiBlmXsb", + "D0dxSMZCCgjiYsblhPL10/KCjHPI04ZYSmdKlkVoibuP1DFn5gUZp0WpwYzJE+wn1XJUSM7SpXtMf/P+", + "/OUT98VRptiNvYEwzmv2LIWfsiaSZ8Ha9P3wqfcHzVhWFRP2dapVmbpEJWMpc1za8zHhTEBbwNjFYuaX", + "PLWyxc3TfVHPsuPOmI+mCmB0PYkUglYAxD9keZQwQX5iP4RC2s3gADu5hGSgMDtaZSEeW+jP3wS7vM+R", + "5/DwjSbnkB+diakkWZkXQ/JS6zJHY+SfcBxnlGAfYUhOgmNCyCCkIOWU5WgkTK0CEkrQ6pxy7s0dGONN", + "CadqBrhrIyMN5aPryRgLKWpjadRuv8O4W6zdcjsUKn5kTlWGwR8ay+P43fRsJBBhc++oywaJM6sWqH01", + "C9y49ePenFqEcdlf7r0VbxCfmrx7ee6o6B7b8ThY2Kb5eGEYFJ84DPdjhyJyLPM8Do1gTIVPO9QWtwc5", + "vSXPvrdavtJJQ1a0mnU8r2gd3dJ3oPFeQDQYJ2zis/LbfKBLnDcVUhwprd0rs/sLddt5Drn9eDgkV94G", + "jqrgfKlZWnO/pnpoybzUqNzFiairanwxMlRf6xidFqRWMiZYAQpXeaTBHOEq/VC5bFrkHcVqh3sL0vnq", + "rWhLLVIdX9kpuBvGmHhPwNO8MMtNROkdPmzbY4qXAWrI9xjugs8nkkxkiS6MTmohsSOxMgPueXBXxcbO", + "E084vT1zML6vsEqVokuntLDZDNRo2wHw7RpX0T5H0QkTKjLLycbHF++fkzdWk7f/2APxPLwONWRLZN/D", + "HHsfsIrQ8LGKci5dNrzKYNhIxOvnbSRh4kZeO4W51q2H5O3U+OsN+oxSTcbNmYzJQQOMP0QNoyCoQwwa", + "SKkgGZtOQdX3Jd8pddP0P1uc3rDUsHxIzvuc/xbeuuqnNHHn+F3FIvqqZEhQu2ljLysnWL8jLr5r26lC", + "KbCmm/Xf9/vwzW0nYaMM6M9021J0nSv1MO+6TfQ7un0vG65am3zHmikmncOWvbJ5U6yj7Cq7Y8s9MhlM", + "aHptFVmRjfw34SK8kOoalP1iThVk9WfMVB3VEMOsg8PSsbtKMNDH6K10JxcRn1+v9oIKj8QajGFi5q7B", + "wS2q85JAC5POd3+BW13L0q9kPdnosRuBaMlvIFhJiCxNKnNwqUcbZfkfcR6cgYuApun8SQYGUw9V1rzw", + "/mHJxz3CWZWAh4rpYZ5aOq/Ax5qkG8GipygNOeBylpAFVSJxjyaHOCvLAsrZ3BC4TaHw0SBufkZJfo/5", + "OQCd03s5s3qIv5l5FzhCZ5QJbVoOgv/73/8TiqOrIz8t9EfSCbngdLlQWPsHjcdwC2npLC91uS2dkJSz", + "YiKtuKVYOTJp+vnVQGWeU5GFJOw3sLKNPt+9AUUfm8Leu8Qi1VDB/nmQcpZe64RcwzKTC6FxoZJbrv1b", + "Uvk5PN7EmuW9nlRvcyGZ59AFMM0ek64vMO64OmwBMc2gFZfyfyV52OvjC4ekyoHyMRkV57rp8+rtjWuu", + "ru0crAeV/2rTazUJwrWXn+rhkJzH3VNfEDmdWlnv/WlcTQT0ykG8NMruPeLuhXqNk3aFvFADr3luh+RH", + "NpsT5x21dfbOBvp4M/+hdlh2byQJ0WU6t5qvLM2RnB75Ox2amVxWY/cUfBRM6s7EbhnsbxsUko4Z7SbY", + "j5s04azYQelsink3QiQ5h8uzG7P2gadgpluZeb3KkA3JmSDN8hJEA/dVfJn2O/acyJwZH1XGtLdGHXi5", + "uZhLNCI54IeEA73xznTViHI69fYlO5YfXBO4panx731ppRqhfmmkKzWB83t5dfxjowBG12y0D1KjggDe", + "Zd1ukfE/fhsfol8bEfJIFi/ak1NgrBzDpy98yLMqrnt7u5I+hzGRimRM45+07nrDqJtdQpayJHnpahRl", + "OIXbgrOUGTK2CxlbCGPc/HHrrlMZxXsRWVa0JfVuZHbZVBDRqpVmxcgL0urVzv5wAjdXUnLtNSJn2olo", + "kS5zFmQj5yITsWqcux/shiJl2OMXVPP28M5ZZ0jehls3Z9pUG9vYVQGHrvgtsiC4AbUkuiy89cnNZEhO", + "7dSqILDGOfJqcnCbFiQsIqgUtoOzbSrgmFjbh44FFl6KdE7FDLKEMHsVygu+DLcLfP/z9S3ea3znNRI9", + "pJzbM5vNQZvgROrRhmrT+EwUpRlmTBfUpPNzWfoaBuNQAJuSeZlTwT7auZZKoy+NZW2WtjAZgD9adZ3U", + "sbfDUs+qU6qdA0pILGNKJYKrUfso21O7u/kGSRTR6Ha+fo4JBptehH4X8r6qWWWEn1ZuxJfrHK5BdGGP", + "r2EZoz2cMZJf0zU3SDkN5jnB6pYLQD238qSm3PtJaJ8JTvKkUTI9IUF78PeywyH5xeWoG/sZjZPaOaLB", + "LC3fsQzTy4DnyDbxTSXw+BeEiqV7ZZfeg9oufDrFIBlXu72Gd+DvOknw8k3wBp009dvDhIx1g8QwODIo", + "MO5BJyL+kTtOwKIcfSWMHJKX9fL8poXMsm7CflUk5UCVY00mvstuMWNflbiRh/7AFacPLs9OGzh0D/Wm", + "hmE5+xwUvMAcgFwuNKGlkTk1Pg5zMQeBHhu0ibK2NI28APvl9Q1F67QU/JYM4NayuF0hnWKvAKXn4buz", + "iFnXZJBeq4ugV2HIJc2BjP32jomGnArDUnxIoGLpqn9V7RNS8FK3DRyNw7p+J2xf6IP4ij3QZ8XOW7Mq", + "hO3W7DWwr0MDa52m3Y7GK6kW1MU7ymm1/w1+ZqSbtQFl5UXDgXotTQO6jTeo6DlxzMFzdlIKjpZqjwG+", + "rDip5XEJKijOhO/wZLs2xkPQ/iR7EnWEczAtUS0qOE3hEANFvEjxQFw+CJ9ByH9npCO/5vND6NYgOquJ", + "2IYvCMPhkOYaIzgyaxJ3IBWv0FVqWeygS8N3Pulvr15f7M4+13rtRia2+xM03Hj0Ba53h3tfhMgYck9L", + "iLVeW281saO3Ke9tS5IPyY/UqbjTqT3ZB2GShi41YcIqCDdYsgYENttGW71P4rF3bQsSBjBUY9cz6GPM", + "8PFm4gMHg9NcPS3UkL2vhPYeJs7r0wdDrG1FDlp7S9r6a0zcobQabeRA57TQ7l6DfoVPapuS94x5YlmD", + "sFeaJz5q+Ym9LHC6JFZRe1HlxvEAsQCm5aw+ZYyleGqYT8HfePpYmQk+yDQhRd82tIFIIre3hdd2a1za", + "hs66ViOv9u6UxSjg33n2K9P8Av8E54VjUW21II8EjEh06w8NWZmPppzOtNsfi6Ltvl5hzWELY89Px5yl", + "13gj8xU6d8ytMCmNiSX5RpDE/eqeb52SjVpwA08cpmaQDNB4bqeKAaL+tcq5xNkTHd0ntEF3BIVc+Xcy", + "bOPt+s0QHrkQGEcz8GCiA8wlz0bXsIxd/mXmIlrsz3Z9tm24zSLnQaiNG+Z6OoeVx35R5iNnVnfDIVca", + "PH+2etLfYPQwWhpYDv5gFeDfKsO466+ft+ur+BtJJRp6aZ3f1mGskC4gIwopUiPw3+8CaYVcbwcWdAeR", + "uncTn/x31ypL0XJrx17I1o8ymKjGB5Jvz1dhgUYn6x+JXtaPM3d4kg9PTZ527S67VyVUMgqqfLVfZPX+", + "iminElzqnK7tWfwHUUMpXLZX9/TkZKRyDyiowLneFgmouNoGvm9BFc3BgLLXjVOvXktR/e56tiK88LU6", + "3I59JFzcmxiPcm55xjZVZp1h/ZYMMkVn/bqfKDpb7Z3LG+jX+1zewGpv9AG0bGJb5wvb8CdYNvq6R7Nt", + "HS+xVbMbmJEzk23tCuYYGzZ7c4CtGuOlbeRJuOF3vO71HjwS1iisJYcb+9vCt4McSu3XqKxQ09rb1srD", + "QmKcuwa6ZZlWTlzBranQs3rK47WDk8GxAmrgBMtHS7W8m/DMo1G9laaRBejENiQHMkV/T1xlQjAu4p+/", + "//5wSE6csEBZ8M/ff49KHDX2tjV4Pvh///Pp0T//+o/vkj/99n/iiR7NPBJAONGSW25TT8I2RPsgLn1l", + "kCfD/2u7m5MdKYbME+Bg4IKa+d3wuGUJYeIZDvPwE69yadxt9jGXprO1hFR1TqGQdKFaUeJEgqu4KsmT", + "qukT1DqH5CUv5lSUOSiWEqnIfFnMQQzJL/Yu42+hScveuz4a0360bJW86NHHl0f/8fToX45+/af/0y8F", + "+onTbnteI1fqpqABulueh5uDa1dngO9Idj9VoOcjRQ1sB+lbE9vaAv7xIznI6dJKN1FyTtgUTa8ZGEjR", + "n/QwOuiCZTF6XR0Nm22cfxS1qwLucfR5y5U7dPlKh3dKfTQcCOzdpqnmPl3VhE5sk7VCQBMwCwARJmL1", + "eB/ER11CDiOJFS+EclnlCjWY3TlnguV2ok9je7Ix24/PEoee+HW+n9W5BdutPbmYO4DOcC55FYWncynN", + "/K/O+ogPM/iCE6zxVqG3a5hQ7Wvc4oDIvjiImV8HvXXrePb06dOnjXV9H13YfS4xdgk73WHijPitwpIE", + "7tlTTsl/3iZk+WvzxlBQpnS1d6FqtEvyYicxQ7fvc6tJetWUUEM4UG3It6SQzHsCVjNdnXIzpqLyuP4W", + "kVd/WF3Nxh/dXrZo2O5rxIPKvW0ecXYN5Af4yLCcG+bxCdSMO7ygS7cQwoQ2QDEtA2cCqHfBKiT3livk", + "2zga2iD0qAA10jBDSnPHAYoRHrJR7jJZsJmQ7bIQjaC1VvPWkr7f8VxWeepxXms7eOZmsX4atp7PtXW2", + "L8lPu2/J1ZSQtty8sGaYx5ePdkE20T1Bcu6mR5615vpsux9wl+5QWfn62ttWAG+y6py6q2Ltl9hXGKw6", + "RjuH/Mblc8XVMRKil3WYY1wV9yf/Rm+o+9P5Staw3S0Wv5xT7V0k7e/fYH3vhHzjk8l+4y6v3/hHsm/I", + "DVXMilt/M80LDs/JhwFdUGZcjeSZNPLgm7kxhX7+5Am4NsNU5t8cviAK0ELfaI5pMA8OX3wYxLz3Xf0S", + "l8c6bdHhn9fo8Nxx69ol1IXT1JUfKu3dalh/ftri8N+1+Pt2WkPk96QHjRPekRxsJ3umOh1e1y35gcpX", + "QmIxX4onYas31fjxuWziiWD8pNevoS6wz+1kHUqAkztwGVsPHRvJQEXmcxniYFwilyoEormwiKE4k7G6", + "fRUw7/PcE1qJBL/ppRWa2IaM+C7TkvNl/LGhFffuB4gTiLc9vy+4pNl5yQ0rqHuTX3WMqqzUkUwSTsDX", + "bezxLREkHll8RLGqdkNU9wkjeeVCYzFPgJEEH+k8Rv1I3hvoyVzm8MRFkNSvCvrJh/Lp0+9S2x//gpUr", + "zMuj/6BHH58e/ctwdPTrP54l337/ffyy/JEVIzS+r03xP1hBqErnVtJ4HcU/GJeioOk1ZCQ89DRmfeDP", + "Ovn+KTlnP7xw1rIQzJpTwaagzfC/tBSHzQjxCRNULbdeXKvp+kiU2NY39KGnTZ3nWcS9qQm7QQgxsK8Y", + "hzMxletbzPQoY2oznaNGhM/qlf0hrrrksrPCmlUOc1RxfXxZKHxTYTGjBo58Acb1IOioJLPLcuaYCTM+", + "XVJCPgwytbhVR/a/DwN7xf4wOFKLI3Vk//swiAczxWn9B6qhlREDs/iik8A6JnqbccItaJ3tsI8wmiwN", + "RM7zpY+Fwp+HvphbmAYD3SMMKoS0UbwpNgZLAh009tAjvYucXLxbRwaOV3V6ZfdYXgdC7U5+FN+AIetP", + "h3fdy2qou27qblQSt+P6BBXLAppG2+N3py+vTgfJ4Jd3Z/jvyenrU/zj3embl+enPZJNuDwTnSrwT0Iu", + "xJojSnx/T5j9FBKplMJn3K1qLlR+AN7ZNxR695qAy4XoKvfVsdC0yqZAOTH0VgqZo+usB+MyOTVd85wv", + "r49dHWfUUOffJ1WOwk6Kaq9RK7VTmQCXC3LgnmTclNxbjfccGnfjYZwQBTOqMvR6Qf8YSYpywhkmyWFm", + "SI4p56CO6i89AtCB6O3lFXlSzf6J/ymkeKnyaQSPCaYdZl8QDUDGK3OpLBwLpoDoOS0Asz6yrEqAnOJk", + "QqB0M5KK6QrBIQo99dUivtEhvV54wketO6t33KmQOS0KS2ZWaw3Zrzc7vLRywichNHCEgXujoE5u9vp1", + "XS5tD6f/VsBqF+/ensPtvugj26cvNmz2tajp2/2kaltBcI6wPi/qFgCubSPpcd2fy1m/3q/lLPRtONu6", + "1+4tEM7q9vjyF4ODb299ofwEyxgM99xUlZPpDc69zbVKJCUDzm5gdMNg0XOTX7Mb+JnBYmWnazC99ztA", + "Wt907z/cALV1meeuy0mjxyo0JliVfbQXsDPBzCtsvwpKwUo2017w3oVeW4DuDG8dVjMwrQ+oOlYhQGrW", + "oNoCw2c0Pcs4rPa2nJWJWT80eTivXZ82kgJAFYxDfSB5m9A6DBeD2ReIax2gYEGZkFRye6GeVu5T33u9", + "6lgPQCcy9y4lr7FLC2K7Vlmfmq/YYYUXtEDN2dT0B2Rbt8GkxQ6F1Ktekma7VKwN/RpVF3euaLkOYwc8", + "dpSeS9bqDu1a0mmQROpn7F6epMrf3EeArtYMSNaSqO6coHaQrOV92zWlnk+JZK9Fyzd4dXHa+W/JQAro", + "H7e6KuB/S3bp1kBLz44xJrRr1ybr2a1vhIvuBqBm5z37rVJP326RE7lD1zhb3AFAzUt26LRyVnfo2Toc", + "u0xzlc/u0jdw2d3HazK1O23oXSDEFendO1f68+5dI7pyTyAdGtVuvdf12N36r6mGd+x+B/bRoTz37N2S", + "XX0JLib3+nL3lfvuLt0ad5b+3VZvOz17Rq9dO/a949BdZoWe3aMC/a757l11gddMG7ShRuyNStElkdOI", + "9ZIJZ0zH3DAuXd6wb1x19UIQcSSpFIpIZQMuZ6uZymhRcG/l3xjBsvJCIGfVE6SB23j1iQ21/a9YDr5e", + "f5jRguoqG1ffp4aOd/3m0DHj6Tm1yszv5XmYU3X9gH6HFhxg2SaaNeK3Ot0Rd/RB7LLPv2mY5t0UEoK5", + "B31ltfOLP5F0TgsDypXG9M/zr9Eba/D8W/9AHz4/27a5na9wK7vZ63W+z8tpc4UOi5D5pUbJXU6nGkzU", + "C+5CyRumnWuya9ZGXX0cG9tlCSFZdRdKSA5UY1heM9WWyzqP/hGYsUhduyc79AuhpZlLxYzz5fHjB0Oy", + "3yIHYKEsYaGH2JQJytlH6JVdO/5yVSMkum2y1HDhQ1zeVTaQ1SfPvrE3wbP97jE3XRB6x9qshTjsRoUP", + "6EeJPv/39KDMmDZUpNByq/n+sf0m7Zx38pu8vzOhf6msPQftn1SYFSzGHy+3kWftmBkojBh5JzLtC2kn", + "cr174EAG2oy2BUA0InzDK/q2+IFkoFW6DbDLud8b5qo3TxggaawihqG3102+tIO717+6Wu3k7U9V9at1", + "5Upeb6XaM5FZ3Qx08FcabvdVktfRtVxQk8598MDddrwreuCkO2qgYhTf/unp7jEEJ52xA0NyNq21oFL7", + "4H+fSKku8OO61NXMkHy8DuTf6v/8NPnuafLt98mzp7/Gp4io9Q8P2/Zr6n2LFUwt73CR2+wjOBZcJRC1", + "Gl2t8vkC01aDw0j5OKfxIeB1IPS6/lmP7sR55TXl6tTU6w9+HkYSEFabIMwQmtHCBUIJWIQiAbWDJdIE", + "4nIONJuWPHFphcI3vIM8O4M2TjqDNSqy+e7bp/1CN1YDBO8mebeEVQSpG8SWy7i81C6WYrVocYNE7XY/", + "TVxbqoAYzJS+3XN7gyCtIt3ybRL1Gpau2ALRFjleovcXsPHxg7+iha6X+URyHBwHGpJTms6JHYLouSx5", + "RiZAaKNtIzXbZEluM2mk5B/EgQYgf3v2DNeyzO0dBqvoSaEPh8S7J+vKx+/D4B06rX4YJOTDAG2R7s9j", + "o7j76yX3X736/sNg+ME56Dm/daZdVEWKE6RcSzvLVOYTL7K0DxR08P7JBO80/ISj/dMVnSDYHRC6wq0R", + "u1F+XVeefjAPdFpls9NLYfmIwIph66KJqlk7mOE/I8mJHSSqZmUOq0EkW6mK6pGSsh2KEF9G2S7BhanA", + "bFdSKHbDOMygg+1QPSp9lq3NIPHGyrSVI3izEyV3hUU9j19PnxB8V9a8wRDRITWRngOv8k+hLCjj5TPT", + "RSxfi1RYJ6y2GB3QpvfaoYfo/YF8lkIRW8B2nQvETTd5/SMWheb37B+/rW7YqbhhSgq8eFTRBVgACkwl", + "iteTzdeUvxYhsFtQQPcGdvv+u+3cegzv5fhPm4eu2rBqHcPdquifVuvvugzGE/nDLTOjzpLIrpRBqOTY", + "UZcO4wBGkz//Ke602UgJ7JqSSTmddthMXBxAX2CyNN3AfuvevZ9YnQNgx+yoro4lUq+obGsN6m1vmUvn", + "2GJqg6vTd+eDzXCbrqO++U9nr18PksHZm6tBMvjx/cV2j1E/9gYifoeq6F2liSs2Qy6u/v1o4pzyO9GQ", + "Sh4h2TewqAvZppKXudDbIsKSgZKLbbBskx1DyxBq4ia6AWOXBV2IJsJ6JaaOiO71suS+eAuMjFlul4Iv", + "fWtCSaGhzORRtfqDi6t/P1xlrE6zR0FUuerdgJNIHeIyvmlnWMWYr22cTxTXWARaFFcDEnfY0rWRbLO7", + "D/NbtBB0e1/vwM/PGq82dGIZEiXaQtt0HqKlV95eVpvVVQI0FLeJdb8EdQPqiGp77iFrlgqPCNnKgluW", + "LOuo4G3V8RE18ccaV35xrSCq77bDe03nUatKiO+SWbSRGNJVFqcbuFJRjoo0sr5TbViOvvHHF+9JiY9a", + "BagUhKGzphQUGBm7RYzWhZBZu3jPnGpfSryPjuIq2HVEl9QzDvXAQjkyN/sq8KRDgkfNLRf1nppWNENd", + "ZNdNPy6Lujc2Y+JuQueEGmo52UIxZwBdIT0XKsgwRfa6+kQN7aVYZM1RttfAreD+unXN99IX7XR8WgZt", + "wa2v0L/WdBFJHceNDcLjznDQ16Til6KA1pFDu+hOl6dV2TcFhQJtOVSj5reP8ZRqrRjIfXezek6riQXz", + "yEevPvHH8tftKa2F+NijEE3Q0Ys1VIzUAWeafMCOHwZdR9bOPyIFnCHch9bIRiXedF6K63ZaRQy5rQJ5", + "ex5iFxuD+38/O8REZksUTT7cJuQEdggQ/nSvhgsNN5ZPjsVi1fmkKxsZ2imyG6alWj73qd+vhVyE0X36", + "t1BiHhRxYnUlX3LrHZW7Ci4uOYRuJD0ekjOXclfwpXsRtwOWwg2YltpY2lwWoBNLBs72imk5HY9pV6IN", + "VabqykBJqErWrGNUl3tqVMdp1dKq6qu0ysRUgT21s/7GItRdyfUdHv1pH9674vSWULuGsrOdX3fmIXM+", + "A6DiobZTJjAmrI9GVD/ah15d+tBW05JT9da/1pWHQ+P3Vh6S3vrbiovBnSe7gmfUK5vzjOG8dkN8B7M+", + "OR77PUH96CsrBGeNmbeHbEhf1fEo8Qs+RuwCqKeDgoP1jb2ZFUccplYQKAH3clnYAWb0VThgIQmI3bZl", + "d3lcUdVGb0nU2CaMqDRqp3Pc9cGaGzq63fzG86NU7KMUmCwQxyI0l6UwQ+I8VewdGr/XBHN4JETAjLa+", + "t/sQF+JuBluSd/1sZ5z2GD+TCxEZvizig9/HKaNKKNnfvr/tVFDjU2jXWS/bQ+1+KHYG2dtTYi0V6I5c", + "i2UZiC3ZSZxHR/1c5jttfe737Tqm/YpxuACVM3T903ebP9bwj9vgXHl/F6avyL+2DBm75oOI5Oj885/+", + "dLhbSk65ELEnHztX/AkfecJ833fMt0/uABfGXtS4dS+77hHRlxy4Y7rMDbkcmrlld6wTS0sNzVxBrqBc", + "Aak9+1n1jLDjO0TzURyTysaeIZpZmVr+Y0+3Hsrm4FGEWBXmlf6FmvRBM6BW6WnRMoCZouN5lezBZTew", + "3YRbnXYPj1R9+bKHW0+nkxJi4J7ezFNFc4g74byrddvQyG7xtLAn9gb+P/a+dTmOG0n3VRCMEyFyTleT", + "lORzxlJMnKButo4tmyHSM7vedpBgFbobw2qgDKBIthSa2IfYJ9wn2UBmAlXVXdVXUiQ988ejYdcFhbwg", + "kcj8PmNkBuQwsG2iGdiry/zpwbJ8cGt2NOzd5vKasFWaqWmm0mO/h8Q6SVmDjkLaoKrEmgmVEVzgrnW6", + "6FFFtl9QkXcU0VqRXpfnub72d00A2AnwxVVgGYnPtLeGFFvLqK5VpT3hN8EW36sTtL3u49Pq1fXjw1BG", + "uliwC2U54TeANyM/iffqw6vuEUBDRGAM//BqRWWaBe487Cgr8193VGZSL7fL18TZxv3lCH5qZSbYlcyE", + "7rOPaIO2nh3wIRK/EowruovqEb2+HJe5FUf01/RSuDqTCjDqA5AKAzKcC+3GNSKVPdIWLLVqloNLiyNK", + "tOr0Fy2+QRfbugZtUuGfs3wm308mIpPciXzKvGFFPsGR4akYljmz49J5MyMYmQkU90HCE+h9Um1MCUxw", + "8KmgI+2HVVu0X6DJfx3YZ/+u4lZgnys8GXUlcl2sW5F6Cui6eCuLh0ZO+xigBoXHZrBwWviFQrp0ITZ8", + "E5EIcPd/7zxxSCZaaaeVTGOJGsOjlmqkPDXaWqIAHQoo+iApo1EisyZUB/3IrUvgzcn7N1SDWVK/0cnJ", + "25AtpQVCWkTBxbzbXKvDGofK/htDPvm3hTLs6s+agWLC9o1raUSSiyuRU5oN4IMA5LOowTSR5OLqBt4o", + "QDkRGFP19X12ZC6kM9wERCWKvJH3mOCZKjAi7yAzfFifvdMmokctx4zqtYE9wYiFSSCdh2rDMp1CKRkw", + "QSIZLOUH/0QoSvszf3kDz62VCfbYPFRUK2vGqknkx5KKraT5/09+/ilmYttElUtLU7wYPQvBBPH8ZlZ0", + "TeaTNqGgTP3cb5sMNqXy4mg9A3dB4WhljucqeAwEvCrXHCoG8CH+A4ZE6wrRRy4nsqO3w7UEUL8oecNi", + "dyFudrxrmkGkrSaKIkVwWNe11WOlvqqvlQqPsj8JR8MbHMJ3kbDOV5cWRS47ctV/43mepEAYGLrZKKlT", + "m8wmla+XLz0SG5tcQKFuMNzVmV1Xr1joERHa2oSgkQY0MxADnKH1tXEXTEqC2VbViS1UuVWIdDwivrGJ", + "hLDlQqSwo/c7HZHn7EKMJdESYQLFlj4cCwtnuB3de3MCMV3htzDMSOsNOtUllBRwOgKjFVNadiHoBBf6", + "dNmQW2jwHHNFx1h4gRE8ewkYgYJnyHWETwskvmPuLxWK5dpCvHXNp5bRIbFfrmDpsMgRR6ze0r1k/CJc", + "wOkaf1PGXchVgs33SGlI7HWSyU/C6P7Chb4dRH2z+IVClJxbNxdasTda4PiAGrMmqRbZrDviuRJXUEf8", + "jlYPMMPms3ZufTtSiksxtc7oS6+FLUDyrUVf7XLaqB0w1ClX4wjtkLW2QL+e3IiMwcf2B6rh6k0p2G7Q", + "sUloBN3PAqXIXp+dIIFu7KMZKGp88I7cvwuCV66YDrmP2vsaM8V24W9/OfDzQt2Ke/2BqpEbACGbn7Vp", + "gWv9tTZZYpEmflyqS6qkj18ulTM88VfhC+1AeU+hOCJ8QoSDPxfe71iMTXFsuM76sSwQXSupZ6+DYc6r", + "IswrUGThkj7W0K2B5G4dCK36zBtMKhbr4rEwSTrmPmLzzmtaaCbV34lg2XAnXnov6/ilwMgXoh0IKmHO", + "Lnh6aQueikoJ2EGf/azyKS1Etm0G2K6VuVAunzbmaaCqy0A39nCqYs7joH/YqvWhGm1Vdr2/GelE5APc", + "zNAXS6tRpxUQhcMLN6UF9JdJOqIHIIGdFzu0vXiPa8TR8fud3s6VMBaHc9A/7B/AYUAhFC/kzoudZ/2D", + "/jPC04UP2Q9tdPvIDYqJ4LQlE/xBmJGAlji4ElVA3EgLS45WwvZYWfgQgs08tKUR70r6/XYhDBSjZD00", + "MmBPKJWTOZKUh6vfiKtTrXPLBjsQtCupRoMdwMzIpQIyV30Bka+PB4baBBh/SENQxygok5ch5gYzOAtw", + "6Ti85R1xoxKU4SudTbGGu+KLrCBC9v9u8eQB456WsokwmzNBTvgknEOn2QSmlUDA/2OwkySXUttL7NZK", + "EqL1TkZFOdj5bW/zBiscULtaVdd5+8QeS2jWhfc8PThoObSC8aO8EZg/fhoJe5Zc4Etv5zk+qS1+jG/c", + "f8WDTSK9yZfezjer3AcoUYrndBfQIUwm3O9td35BvYxDzHmp0jEJwQ+exrzT27lJYrScVLvjagfrH1zp", + "d+TeXWY3pRUmCfyVNRh/YOUx0gqGPMasSv/GWrALHn8GGP/eQC01KLa+PQ3Uugb1WhggUgqzwCZc8RHm", + "HC4p86GGhgeEbNJzFqkiToi+uzdQAIeYANOOyOIT8Tvi84OiwhHI6zfH+wG2Qas9WKGAYl1kAwVJrTCX", + "S23/uKJQ3tT82xePtphrFeH32Q+hSZZ+Unwi7EDtUismrbevtb6UwtI8DnbwrAaYTOggdhyfgH/tD9SJ", + "ECzw2CCHdDWS/kjrUS6iYu/jAWlsJA9/p+o8bEX13/+KW5kelW7885Uw3ztXvA0E7DgHrQOGbKK/2P5S", + "jAzPhI130bL7gd+8jhkje0xwhjsvnj3t7RzroizsUZ7ra5G90+YXk1soBZjn6Nn57ctteb6gK4/W+c2q", + "nf+WbXwgkrMkTVaXQtuWAAmpYRDh3rCJ9ysVkcmniv4EByRuHPB9u7GYIDnLQK3KztJnP0M9jJlW5Ck1", + "ThnI4xKTTMZk7cDGm+BAvX5zHE9taF686wtz2CNaMjcW0jDjXexEhOXEQEbXYnbRW8+wdMj1zo0Dt4k+", + "heHM0GAwcYNdyhRTFRDVIWYBvkn5ALMCxEX4BEhwDtTbGmMOJgtAtVu8jHUyz1vAEcKK4ccclgi/1PBM", + "KmHtWqEVSvptnY++27NOAlfQvlevJGR2K+e6KOPUyTu0koEftlWnx4lE1RZN5qHsnq15jgqpYU8t2r69", + "RSdcZUnwD9tbd6/FtFfmXeoNlBUuGl31BjQ/qTbYfkTdH6ivuP2YtZEjlX2MPvgRW0uvZTnEKY4zCcUr", + "PJs+BFNaYj1sl1uvvXavvkrGT1zZuChhs38RtgntRvQ2YFR4794kPZ0h9LdYLEBs/0fH74E6pc+O6Fda", + "iPwQfESMKVkneZ5Pafka6zwL7Sc3aV5aeSWYj6B7zGqmNJUMQWMZi7prWcoVJsJywa8ErD2hnM46XdiQ", + "qRpKYx3x4fGQlCfRMBkxnTBHTezvSEnQH6hAsFNaKJnwi1I6Jkq0TGB3rF8oq2QzND4iWJl/26WYQsIl", + "TNdAhRW94FP/FDq+ZEaXKkuckQXzuw+VYn+OAPAWlckrmZU8p8e0GfIr2EuQdI7C4eamO4mFxyvzb6p4", + "5zeLZ+GRHYSA92md0RAYWEyrAdR1utsQwzl00w6BOuYM1KVujU3JAs41JK7vSKDVC7aVI9JrkxVFu79X", + "EZ5IONLzMkSzhDkPY+xIZ68rRMyq7vvlpFuOHwXPXtcysG3TeVvyxJdQkI/inEkAhGsYvRLWwjnL23r6", + "/UfjAUisAW1JRm8435Dj7p7wZpL9joynPZO/qQFB9j4gvzpdTdLD8Yl/w4OFcCh0GwJFtNdOOcaWjzsS", + "4VxLyerSu5X316At2ywVu1GuZKCVi0mfB6MS38uMQLb0dRO/dy09yAwfzS+Gs8f8gBKmMmyMCk79onRO", + "q148rvXhZUgjcD8u4/B8FEqpFKK3Qn0xjHckrwJ/PcbXueBWQABYJ3FdwvzfFpa9CYfOd6S78fnbeh7/", + "oAeyZMNQKuhkFBNn1I+zlkqNhEONOisI3brbzXwnXAMH+y6X6HbA7XbrhzIrnIr4Ebcxzd8J16jkovAI", + "3U14061ESN7alkW5EbD7jgxlDhB8uxiXpsl/2f0ay4eAQ90QX1iZY0tZ5avsrYgUwEWRsnKhqw7NGnEg", + "UDMDbrlWXBMb3vDIqeq8rEGaDlQbUClW1QKYZmHEWCjMH8wjovaYFWKg/GDaUU0Zd9WJ1Ei6/tAIkQl7", + "6XTR12a0f+P/Uxjt9P7N4SH+o8i5VPv4sEwM+2NcMqgCdqyVNrZeZUW14+F7LSsttXOlNBXQuGcpH4li", + "0lnr4SHB7N6Rvcyi+G5qLiBQ0JaHFLFgGFHPuoFe3oZl1Pk1u5zdKb8UJ/Vy8zsJa+fAAr6QEBcualDI", + "uV8guEX1puWc/XNrVzUArA69V4nH1jJWCSiUhG4rb53n3W4QcRLYFWEJIFbNvvbeIeAb+L+5WiBac9bN", + "kLaRMW2gTVOs2gAqwPSrVCzXI4AxcDK9tGxXaUcgGtRWWakYuxBjfiW9UfApu+Jm+pK5EvKdEyh8rEPj", + "QIkjtM1Vn4Jn/wE3AVAWKAtMdSe9BrQPVejBEUwjObwbnwHxevWCPSzTgnwc1vaFXpzgTM9DKSdmepLE", + "iEJwx35iSYI1kgcMD3Rw14BHOudtPvYkwBXckX3WADQ29a+kXg8k2YaDqcIRFA93Pny/zYgytGJ0uFcq", + "oL4jwc3WZ2+V7MGi4AezMPpvw+TOVmKi1o5ur1hh5ofTP+b/g90j09muEvB78UDPOj6N/ZxMq1SwXSwr", + "6A0UHbdWZ2c973qgw5mOfnu1uJNoD6z8JNVoj5ID8UVVCzgTNzx1+XSg4HWNc8SqOEFaxq85oEpWgGfn", + "SBVRmvwc3keOi7MLYV0ihkNt3EDVCioCQUR4ajgx8k+GYNFvz/hIMOwqe+W9q5cS+lnl1+kcasudHqjz", + "ENKeE9EQV1OYaTbVJcs09Dwo4Ud85FguuA+cVcjhY7mVv3pSWufdP3WF9AfqY6iDa8rKOh++mlJFZH84", + "QnxRK6ery4Yk0MOT8x4E6GpWYv1WkQCoG4oDF0+hMqyEj22X2HMyUM5wZUOI/YLJIeNwzGaqaj4/bjj4", + "8wPkJvcLa2WVDNrQxXAoUhd6pSdcKq8P8G6s/E9FVZTDlFbJ05sbOnssjC74yC/p/YE6NmIoCEBB+4XQ", + "ioIDnMN5VTjwp3Ns/9ynOTqHs1UqZ48ICHQWnDgjRyPhQ7GBQhmgJUkF8gyN0NE025a7MMuvo/1uVQMw", + "0+YJVX5n9WrVmdKN03fJn6llslmKyCa8YP/9n/+FjUNWTLhyMgWygOOj09ffs/li2HZsf7rqrKMyujYC", + "LNBj558HWLU82HlRL4z+7cv5igOCu1tHQ2JdZRgT7zQgtmnfq83zCZ2zXcAT20c0sX3h0n6ANEBejdBB", + "Ma9A2ENie+GsHIAhYl/frDeuWuubVYgNS20aaSv0Z6N0r6O+A2ogINkaRp/6JS0toWWvekQfUIXwM6pW", + "oIUlRXsNzox2TsI6bsBR8itPPh0k3/bPkt8+H/aefvNNOwrSJ1mceWe22iaqWTAf7+11Uy7Oon2R7zwj", + "3zk/m46b/ifrgnOFA0CqaUAQBQvTe94ohoLacWpEJ+dMrsD2GbmzWDiJeExADEJsqlUdMN3s/2P3A59G", + "2ANYkfv7d6H0AStn2TlV7e7jW6DI4nwPIQbO/bwVZ5VJnOOqAC4SxU21JeFjoSyRSGusX+/ggmvDi0JU", + "jLBypsuvS1yE9egX9xYz/vhjPCaj5V3Q4l554YXLd8xH9VgO1JzeqFKOtubY04Pnf0Y84V5lel6AKdTu", + "Y0kL+AgSAI7iIhcd/A/NuVwQtFUdlWEG4ZCkuhfBPYws8Nh3RiejVuz6NTLC5lHrIHDAiBu0yKVwHA/q", + "qK4RCZG/fFmFm1EL/JNzMXuG198m8n9+8O3y+/wAc5nO7Rdup+xgNnoI+4vOeRIQcPn/BV8eWzQyVow5", + "THF9a3IE8Qxu/LMY0EAygEAVmpFokZd2bu7xXGelarna+hzbalr6N2jdvas0bAtV4FfWeXp76KKfF+cv", + "dB4ddlMNMdybTm/drND+OSsqz9Dup0ZwJ84iZxQoUtlW4AUXRpS7u6ryar5lLWU6XATKh9/5gHIY+KWM", + "Q6NoVpvWVSWHmHMrSO4NXHjXksO31OlhNz7kj0LDT8y2s87ny+/7Sbt3ulTZLVYHwMgZ30ayIR5fINR3", + "GHY/bHkCbOsfQJS0x1lZioQO6S307JMEOLyRcG2Ama40yjLOfn1/zOKupbbbCZuYCGBWgbAG9erPF/XQ", + "+99I86ssoJXd8IlwwlggpOqiYI7WB9Gy03FX4oOY8FGwD/X3/V4K0G3cfQY42qaW9OrplmXwtr+tFSTQ", + "vG51AuhnPXxjxAEE1atP8GPUXBJW3Q35fQsqWth6b6rR1mUrqHTYx+86bmqb+Uk4bIeY2j9rb6HmD9QC", + "1We/WpcxPRwKY5mVIyWHMuWAm0FwQ+GFFIsPVCbqf/L/5gZ3s59kQckjno6luAKKe+FmnwKG1l5MV7M7", + "P0ePxfB6n+cJW+PnQkVIn30vR2Nh8P/ZAOrE7ITneT21clE65vilYLlWI2H6A5WgJKx7wf7hpY2PYIc9", + "RqglXrAiY7v/eHZwkHxzcMA+vNq3e/5GQmVp3visxy54zlXqQzp/5z5IgO3+4/Cb2r0ouOat/7cX5Blu", + "+eYg+XPjprlhHvbgr/GOpwfJ83hHh0Rq2nIGj9mpi6Oiewz/qnADaap2erXfcMjwD9tGI7Su3yTr3cpx", + "ns7k6P5JnOdManINBwrppQBNQ46z6Tx8rAT0Mqt6DfAVNPHgQLVpBgUPYZVeL/KMc9CichBLyopS8REq", + "1nfC1b8gkkLOSW8NxcqldbBfsJ2a9aO0QO5gN1yQHqcuVV/dokzVRjNHIIFHqE1Aqw+SxybXTbRnoq+6", + "N5of9BXsAu+w4vk2NplQYVwldx6hJOELAKcCzgW3cwhG8CwmEFr9wUfBM0ofrOYOYDghNPXPfygeQadO", + "uKQiPNwqpoEFprXL8JGpE/Q0No5A11AfK3A5OavR1XR6iHnWoLtrgeugJ9oYoqjGxkMNa49Q1CfCzTuL", + "OtPQPjAZ2TGkgVbVATyZ7i6OAzgpWzvAJnwFbaq6H1yYqM/DiIkmP4LNmP0OoI8QptxaVU+MjDpKJzJh", + "3dkSDid/jVR0aEdekOArKfRehb2pt7NplQVlH6uhLi+zaHnCpsCGh+1p3RrwzyN3ly0QJ0NSw/UMJqR6", + "FyL/cEgzYfVgDb9LOlvleue6o2Y1sMt8MNt7a8azrnFkdSKsGnxRVd2iV7OUW6pJWmQxG6r+r7JoIl7R", + "Z/5hzIDXUahmVHQDi6Bk0xKTWDdV3GU5A7XcdJanjBsZ4oGaSRF3o1RRzvfWzK+zQu50LGZTUXEZWqEm", + "7N7Mur2Cqwt5+6fVi7iIf5TG5se8C1jtXp2SBK5Jqvv2+usB4lfZvjtwKEc0h39wpzKrrhs7lutZaLCZ", + "HUmN4/Gu9iItNJKrS39DrGz47LM2KrNflPy9FPPch/Us3jVNx0rVirMkKy4ds9sGbL0ndcSPqaf1CTJN", + "jdaK92A+9z8HoXwhXguBaD+zGqmLSiFnEi6QRKGsCeVQoqQX5VGWp02et/HloCixGP6Ri/IESAND38Fm", + "2c9ZMe5XvDutibMTSDS9s2+vKKny1aQ5mwRz4sbhaFuzX8vOWE5gE06Eey2N0RXxnR7Wdu3Uxwoc8DyD", + "r/6882/JycnbhKC8ktNWDqoPIpOcCDqGwCwHnFvUFrs76wj3Guel4Wx0zl22HIV+eYyKjAyDs7NM2EDB", + "da+s00YuKyADhKxVEsBvakEgn0sGf8V6hJ8rlpvAA95JAd6gVfs/z593DRN4szuGtZA4HM1zlbhiy/T0", + "hpmZiM/22BdrSLH59TnUy65Thpfrkd2vpr79YFSPLJpfhy+fURmiJlyk28FZkRFUAMpt3qrX/pqhznN9", + "3V4zgu+b5/OdVQRoM4rNo3IYaIelDThVC0y3e2Va5z21b29/W3XBWYHsaDv3tir+qEcrLodesR70Cti2", + "uvhBYyfvycnbVU2oyPn02mB7JgLNrgDJHLlFj+PdLPUOG86oh0bYAKRL7b7QgsZHXCqLWYXQLWNKBSji", + "SiuW65TnY23di2+fPn2KXdTw1DG3wG5rwd0/KfhIPOmxJ/TcJ9h49oQe+SRSmAU8EmKUpioaeGI1OADg", + "dqVRFclsUMD+QA0Uvg2IDL3ng7o9hYjzgjl+QVyEiAeFzW999l7RaUlyLVWmr0OjELSzApozgkANtREj", + "g8/lF9QZG09XwhzhM7B7ThdC9UKTHb7axl55HNFAFfGmiDYdWXDp79KyUsUEGjYyhgntA9/C7t4TyL3A", + "jYB8NxIDJW68dkqXT9tSZKQglVa8xvX3Lnboc++6p86klnF4dWtvOYuq9xABpqtPAHSRExg52kuL6a4I", + "w0FOH5xLd0aHiDP9SO4MSiy+4Z4UpTGCLhWpAOQNXfMgkMdTPZl4V2KnKh0brXRp85U34UEFbMGv1VId", + "OIGr7lQJ4BX3qwU0hC41gJ/vGUdpXvp8K/F/pn9AEuZSNuHKWlXhBwm4V8sTMNWTF8btcUNWljLbZs+3", + "kcj91zxIcOeff3iURTHeHcmR4rkPU6q9xeY6iSgjS7XyI172h9FL/J5/aebtVeYBWA1nx6f/nlwgi85t", + "qKd13JXdeeuwsOBVX1s773i1xI9qWyjpl0fZJkACYDbIbBvlyOQKsRVc9YfxXPA59xzH4RC64rhXU+B1", + "wlzto03PVusrs6RBW2mqLt2yrG01vbp0C9O39+TTtkhDxm/zt62YkAzzr0tXlA7SOrkcinSa5uJfJ3Z3", + "d2JX03tdurWzq0akgKI82q8qB9o9NMIQfAzX3ynqQ3zLckzu2b5vuvH+8B7uCY4nokQURlxJ2P8yFK7I", + "2JXMhF7r4KqmF9SH2ukJQ6NqXTUWHui+r4qEYsduEFsArHI6dpz3GLes4FCC6TSrDQ3qgSgprSd+CSPg", + "bDqoanmutPG5orOBCDxu+5EsTz4dJb8eJN8mv/3v/7WRXwZZ7E+K51u3ClXKTpJteNf4a/JOKmnHIkuO", + "Wo5MTuVEWMcnhZcFIAI2BTKkm/vsu5IbrpxAMVwI9vHd62fPnn3bX3xW1xjKCVZwbTQSqv7adCB+KE8P", + "ni7yGQDGKfOcSQDXHRlhbY8VQHPEnJlilhkxcZvT/RGs6Wjof5gHHy9HI+xHB7YlIMOViiHXRZ2s2UzR", + "eqqPiPWhhy31oV8ecVM7gp9bMFEBZc+34qxyiUtXZwcyCttLbcvQO3byLFrNwtuwm3yuPWbOon8kRhYT", + "R3lrLbociMSrj19zYifcXHafu+J3WsaZ96AZI1xphbpOddHVqWR8LMBpD6UCLE/UCW4uhQmcDH/HI0EZ", + "CuopuPxw/NyvCemYF06YcM98O8oHbi7vOmBpvOMOC3HXGEPXXu8DzFM0tH+a0Ogoy6Jmoq7QIblUSXDz", + "lU6ubxtzZOstxeB3rYbNlywMmw8XLYG0yD5CPEqYgUhcU/cxPyMEfj2WKIRh798APTawtYykdcDgDSQc", + "3mv1N9EDXSxSA13cvRbU3rH53omKs++XJMXpohkArioQm/JcOP1JGL2fScsv8sVMmZhM8K/66wcEYvZP", + "AAAwzfxTel5BuMlyyG8M2fenp8fMGT4cypT5PYXrs9c8zwNm2NHxe+QFkdY/8tpHlNf8UjDp2IVIeWkF", + "+0XJS8OHDn/lpdMTHpiP4Fokf5sGMKPQjfnXD62QX/iZJ/7LT/WvwuidVUrx4frE6cR/JaO5ym5FfO8z", + "MSm0w9COngzzKsKs1qaov4lohVos2Y/COm2EJbBwfHn82MjgVI2i52MkfQ0bAZjv5nAx9od9icxygSLH", + "e+Nm5a8fmNIEOgZ8IZZ2KGORZ4x7wbZWJantpYfTcQfCwwdvL7t4yVLQvjrdZryrCTDcZ+Hi5wfPmRzW", + "rkM2kwo8vpUW8DvhTuN47jAJH19y4rhrPUE8bf/ATYOsee7SjuevILVeheg94zS5IQIyxKxAkXWKCtZf", + "eoMUllUleswKVxU1oqO70NkUwn9siMpehtRO/RFGOI73SRN1xQrnpBrZtZSDneBdTFyJ+tC9zodZgY5T", + "tK8XbMhz4McX3NgAEVn72jYOSj+LTXW7/aX/FRa9xdfUgci/3qHTxvr+iNFPCAh9O0Mr2zgRhVtiWUHP", + "nx4cNvX8mqOi15LBlc6/pIJif9+Bv086f4M3hVykoehYFy6R6gXjVQgy5o7swD+9bo+7fIZeAJvllXZj", + "zL5iAGNK0WPaBFsL5hUij71Os3oZypKZjGsTLbvrOf7j0t2fJT54y7vNpMTmA7LifqtKT7ZbNhvBTq2Z", + "sz1MfQ9JLsu4wmPNKtlVDQFPWXtsxKmMH2APqJ5+ZqB1p3CAVghXWytHSmRMqCuR60JUQSu91jKehTOU", + "pwfPW34fyhw3ybtKh9eHcxVq9oZrn9jKtKWtrBtM//nBgY8er3guMxQ3sZu0W+tFLm21duJZ9B2VbOC7", + "4BX3VLJRfScJqbUAG8RR4Gi9M48STbkJHFGVvJEvNhV9tO+WfQQ+kKepKEC9SldJerGuvcQ1JgxlC2ae", + "Ju00PnAFk1jfHOeqOmZbPAWghuf+c5sFDtW70aT77C1Px2xo+AQbgKhfZsLOZfaCfbbi9y+Dgcq44y/Y", + "5yCkxGuE//tgoM79iovSIa6oSAKcCmuTiVbaaSVTqKYohLGQyE+NtnbGZRJ4wEvG2Y/cugRkmrx/g/kM", + "YLOkSMDfqKpVHuwQkg1G2HISUhj42X32xugCB4WVrKgSI17YELafy+wcOeSAMZIyNkJeiQx/kxbRrNyY", + "K3bI+FjwLJz75n6sVggFl/ZCYce1MN6VSEj+wxdAW0c5HArTZ69zCVcR/70zPL1seRocIQsnUgfj7bN3", + "0PVVfb4NMcrMlEEKtHpttbsgUXlhQMOhFQLIU3DUL+GMmp3/PyOKnE//wvP8HLFhGo/TeQZA3rCB8f6Y", + "NNw6wYmY81r6+R7zAhoYgfBaKGFkys6bnvAcef1D5EWzJ2i7RLb7A1DTIbc42/WXT4Ei02sbUkFzlum0", + "nAjl7zp300KcI8lrdOfnyGnndU6bSYQGqwgXKeb5EwzrDVyMTq1XNXZdTOnhrRzSoHDNz1uKFPzRq2xg", + "i4MA0TbtidhctWFWqIwdtMgjiDcQL69qkz1mddOwrnheYi/fRHgzM0akgOeEr+IOj8X67JRfCmD7T0UG", + "L4KinXPUm3NceIEwHF8MVLLwOu+QeOl0YgSpcfW6XHAFRKagSHiImOAjvYTG0gIgd4UWj6fXVdFDwwjW", + "a789BsVfR+H77CPwGoBJs9T7E+7Y4cHT5y/hhqjMvOYJoL+nNEOeCgRCH0pjHRr7CLqzDXmZficoPs5I", + "e51Ynm+Ga79Fpd1KK/6PKyxGj64XePYLvERPgO8+OfH2GD3A8gX+y5f/CQAA//8xSecgqEADAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/server/lib/policy/policy.go b/server/lib/policy/policy.go index 036cb222..91d7a55c 100644 --- a/server/lib/policy/policy.go +++ b/server/lib/policy/policy.go @@ -191,47 +191,55 @@ func (p *Policy) ReadPolicy() (*Policy, error) { return readFromDisk() } -// AddExtension adds or updates an extension in the policy. -// extensionName is the user-provided name used for the directory and URL paths. -// chromeExtensionID is the actual Chrome extension ID (from update.xml appid) used in policy entries. -// extensionPath is the full path to the unpacked extension directory. -func (p *Policy) AddExtension(extensionName, chromeExtensionID, extensionPath string, requiresEnterprisePolicy bool) error { +// ExtensionRegistration describes one extension policy entry. +type ExtensionRegistration struct { + Name string + ChromeExtensionID string + RequiresEnterprisePolicy bool +} + +// AddExtension adds or updates one extension in the policy. +func (p *Policy) AddExtension(extensionName, chromeExtensionID, _ string, requiresEnterprisePolicy bool) error { + return p.AddExtensions([]ExtensionRegistration{{ + Name: extensionName, + ChromeExtensionID: chromeExtensionID, + RequiresEnterprisePolicy: requiresEnterprisePolicy, + }}) +} + +// AddExtensions applies a batch in one read-modify-write cycle. +func (p *Policy) AddExtensions(extensions []ExtensionRegistration) error { return p.Modify(func(current *Policy) error { - if _, exists := current.ExtensionSettings["*"]; !exists { - current.ExtensionSettings["*"] = ExtensionSetting{ - AllowedTypes: []string{"extension"}, - InstallSources: []string{"*"}, - } + addExtensionRegistrations(current, extensions) + return nil + }) +} + +func addExtensionRegistrations(current *Policy, extensions []ExtensionRegistration) { + if _, exists := current.ExtensionSettings["*"]; !exists { + current.ExtensionSettings["*"] = ExtensionSetting{ + AllowedTypes: []string{"extension"}, + InstallSources: []string{"*"}, } + } + for _, extension := range extensions { setting := ExtensionSetting{ - UpdateUrl: fmt.Sprintf("http://127.0.0.1:10001/extensions/%s/update.xml", extensionName), + UpdateUrl: fmt.Sprintf("http://127.0.0.1:10001/extensions/%s/update.xml", extension.Name), } - - if requiresEnterprisePolicy { - // Chrome requires the extension to be in ExtensionInstallForcelist. - // Format: "extension_id;update_url" per https://chromeenterprise.google/intl/en_ca/policies/#ExtensionInstallForcelist + if extension.RequiresEnterprisePolicy { setting.InstallationMode = "force_installed" - - forcelistEntry := fmt.Sprintf("%s;%s", chromeExtensionID, setting.UpdateUrl) - - if current.ExtensionInstallForcelist == nil { - current.ExtensionInstallForcelist = []string{} - } - - extensionIDPrefix := chromeExtensionID + ";" + forcelistEntry := fmt.Sprintf("%s;%s", extension.ChromeExtensionID, setting.UpdateUrl) + extensionIDPrefix := extension.ChromeExtensionID + ";" current.ExtensionInstallForcelist = slices.DeleteFunc(current.ExtensionInstallForcelist, func(entry string) bool { return strings.HasPrefix(entry, extensionIDPrefix) }) current.ExtensionInstallForcelist = append(current.ExtensionInstallForcelist, forcelistEntry) - - current.ExtensionSettings[chromeExtensionID] = setting + current.ExtensionSettings[extension.ChromeExtensionID] = setting } else { - current.ExtensionSettings[extensionName] = setting + current.ExtensionSettings[extension.Name] = setting } - - return nil - }) + } } // GenerateExtensionID returns a stable identifier for the extension policy. diff --git a/server/lib/policy/policy_test.go b/server/lib/policy/policy_test.go index f33bfb32..fbd0d7cf 100644 --- a/server/lib/policy/policy_test.go +++ b/server/lib/policy/policy_test.go @@ -146,6 +146,25 @@ func TestPolicy_ExtensionInstallForcelist(t *testing.T) { assert.Len(t, forcelist, 2) } +func TestAddExtensionRegistrationsAppliesBatch(t *testing.T) { + current := &Policy{ + ExtensionInstallForcelist: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;http://old.example/update.xml"}, + ExtensionSettings: make(map[string]ExtensionSetting), + } + addExtensionRegistrations(current, []ExtensionRegistration{ + {Name: "ordinary", ChromeExtensionID: "ordinary"}, + {Name: "enterprise", ChromeExtensionID: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", RequiresEnterprisePolicy: true}, + }) + + require.Contains(t, current.ExtensionSettings, "*") + require.Contains(t, current.ExtensionSettings, "ordinary") + enterprise := current.ExtensionSettings["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + require.Equal(t, "force_installed", enterprise.InstallationMode) + require.Equal(t, []string{ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;http://127.0.0.1:10001/extensions/enterprise/update.xml", + }, current.ExtensionInstallForcelist) +} + func TestPolicy_EmptyPolicy(t *testing.T) { // Test with minimal input input := `{}` diff --git a/server/openapi.yaml b/server/openapi.yaml index e60094da..47968df7 100644 --- a/server/openapi.yaml +++ b/server/openapi.yaml @@ -1154,24 +1154,7 @@ paths: content: multipart/form-data: schema: - type: object - properties: - extensions: - type: array - description: List of extensions to upload and activate - items: - type: object - properties: - zip_file: - type: string - format: binary - description: Zip archive containing an unpacked Chromium extension (must include manifest.json) - name: - type: string - description: Folder name to place the extension under /home/kernel/extensions/ - pattern: "^[A-Za-z0-9._-]{1,255}$" - required: [zip_file, name] - required: [extensions] + $ref: "#/components/schemas/ExtensionUploadMultipart" responses: "201": description: Extensions uploaded, Chromium restarted, and DevTools is ready @@ -1197,24 +1180,7 @@ paths: content: multipart/form-data: schema: - type: object - properties: - extensions: - type: array - description: List of extensions to upload and activate - items: - type: object - properties: - zip_file: - type: string - format: binary - description: Zip archive containing an unpacked Chromium extension (must include manifest.json) - name: - type: string - description: Folder name to place the extension under /home/kernel/extensions/ - pattern: "^[A-Za-z0-9._-]{1,255}$" - required: [zip_file, name] - required: [extensions] + $ref: "#/components/schemas/ExtensionUploadMultipart" responses: "201": description: Extensions uploaded and activated @@ -1593,6 +1559,28 @@ paths: $ref: "#/components/responses/InternalError" components: schemas: + ExtensionUploadMultipart: + type: object + required: [extensions] + properties: + extensions: + type: array + description: List of extensions to upload and activate + minItems: 1 + maxItems: 20 + items: + type: object + required: [zip_file, name] + properties: + zip_file: + type: string + format: binary + description: Zip archive containing an unpacked Chromium extension (maximum 50 MiB; must include manifest.json) + name: + type: string + description: Folder name to place the extension under /home/kernel/extensions/ + pattern: "^[A-Za-z0-9._-]{1,255}$" + TelemetryEvent: type: object description: > From 4066ce69e0659278527c0463518b0d72cf115457 Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:49:19 +0000 Subject: [PATCH 07/10] Verify extension restart fallback --- server/cmd/api/api/chromium.go | 120 +++++++++++++++++++------ server/e2e/e2e_chromium_test.go | 70 +++++++++++++-- server/lib/cdpclient/cdpclient.go | 24 +++++ server/lib/cdpclient/cdpclient_test.go | 46 ++++++++++ 4 files changed, 223 insertions(+), 37 deletions(-) diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index 224aff72..88efcfe8 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -108,7 +108,7 @@ func (s *ApiService) uploadExtensions(ctx context.Context, mr *multipart.Reader, s.chromiumConfigMu.Lock() defer s.chromiumConfigMu.Unlock() - requiresRestart, reqMsg, err := s.commitPreparedExtensions(ctx, prepared) + requiresRestart, transaction, reqMsg, err := s.commitPreparedExtensions(ctx, prepared) if reqMsg != "" { return badExtensionUpload(reqMsg) } @@ -119,14 +119,17 @@ func (s *ApiService) uploadExtensions(ctx context.Context, mr *multipart.Reader, restarted := forceRestart || requiresRestart if restarted { if err := s.restartChromiumAndWait(ctx, "extension upload"); err != nil { - return internalExtensionUpload(err.Error()) + return s.rollbackFailedExtensionActivation(ctx, transaction, err) } } else if loadErr := s.loadUnpackedExtensions(ctx, extItems); loadErr != nil { log.Warn("CDP extension load failed, restarting Chromium", "error", loadErr) if restartErr := s.restartChromiumAndWait(ctx, "extension upload fallback"); restartErr != nil { - return internalExtensionUpload(fmt.Sprintf("CDP extension load failed (%v), and fallback restart failed: %v", loadErr, restartErr)) + return s.rollbackFailedExtensionActivation(ctx, transaction, errors.Join(loadErr, restartErr)) } restarted = true + if verifyErr := s.verifyUnpackedExtensions(ctx, extItems); verifyErr != nil { + return s.rollbackFailedExtensionActivation(ctx, transaction, errors.Join(loadErr, verifyErr)) + } } log.Info("extensions ready", "restarted", restarted, "elapsed", time.Since(start).String()) @@ -263,7 +266,8 @@ func (s *ApiService) applyExtensionZipItems(ctx context.Context, items []extensi if reqMsg != "" || err != nil { return false, reqMsg, err } - return s.commitPreparedExtensions(ctx, prepared) + requiresRestart, _, reqMsg, err := s.commitPreparedExtensions(ctx, prepared) + return requiresRestart, reqMsg, err } // prepareExtensionZipItems performs archive extraction and validation before the global Chromium @@ -409,54 +413,69 @@ func restoreOptionalFileSnapshot(snapshot optionalFileSnapshot) error { return os.WriteFile(snapshot.path, snapshot.data, snapshot.mode) } -func (s *ApiService) commitPreparedExtensions(ctx context.Context, batch *preparedExtensionBatch) (requiresRestart bool, reqMsg string, err error) { +type committedExtensionBatch struct { + paths []string + flagsSnapshot optionalFileSnapshot + policySnapshot optionalFileSnapshot +} + +func (batch *committedExtensionBatch) rollback() error { + var rollbackErr error + for _, path := range batch.paths { + if err := os.RemoveAll(path); err != nil { + rollbackErr = errors.Join(rollbackErr, fmt.Errorf("remove extension directory %s: %w", path, err)) + } + } + if err := restoreOptionalFileSnapshot(batch.policySnapshot); err != nil { + rollbackErr = errors.Join(rollbackErr, fmt.Errorf("restore chromium policy: %w", err)) + } + if err := restoreOptionalFileSnapshot(batch.flagsSnapshot); err != nil { + rollbackErr = errors.Join(rollbackErr, fmt.Errorf("restore chromium flags: %w", err)) + } + return rollbackErr +} + +func (s *ApiService) commitPreparedExtensions(ctx context.Context, batch *preparedExtensionBatch) (requiresRestart bool, transaction *committedExtensionBatch, reqMsg string, err error) { for _, extension := range batch.extensions { if _, statErr := os.Stat(extension.finalPath); statErr == nil { - return false, fmt.Sprintf("extension name already exists: %s", extension.name), nil + return false, nil, fmt.Sprintf("extension name already exists: %s", extension.name), nil } else if !os.IsNotExist(statErr) { - return false, "", fmt.Errorf("failed to check extension dir: %w", statErr) + return false, nil, "", fmt.Errorf("failed to check extension dir: %w", statErr) } } flagsSnapshot, err := captureOptionalFileSnapshot(chromiumFlagsPath) if err != nil { - return false, "", fmt.Errorf("failed to snapshot chromium flags: %w", err) + return false, nil, "", fmt.Errorf("failed to snapshot chromium flags: %w", err) } policySnapshot, err := captureOptionalFileSnapshot(policy.PolicyPath) if err != nil { - return false, "", fmt.Errorf("failed to snapshot chromium policy: %w", err) + return false, nil, "", fmt.Errorf("failed to snapshot chromium policy: %w", err) } - committedPaths := make([]string, 0, len(batch.extensions)) + transaction = &committedExtensionBatch{ + paths: make([]string, 0, len(batch.extensions)), + flagsSnapshot: flagsSnapshot, + policySnapshot: policySnapshot, + } committed := false defer func() { if committed { return } - var rollbackErr error - for _, path := range committedPaths { - if removeErr := os.RemoveAll(path); removeErr != nil { - rollbackErr = errors.Join(rollbackErr, fmt.Errorf("remove extension directory %s: %w", path, removeErr)) - } - } - if restoreErr := restoreOptionalFileSnapshot(policySnapshot); restoreErr != nil { - rollbackErr = errors.Join(rollbackErr, fmt.Errorf("restore chromium policy: %w", restoreErr)) - } - if restoreErr := restoreOptionalFileSnapshot(flagsSnapshot); restoreErr != nil { - rollbackErr = errors.Join(rollbackErr, fmt.Errorf("restore chromium flags: %w", restoreErr)) - } - if rollbackErr != nil { + if rollbackErr := transaction.rollback(); rollbackErr != nil { reqMsg = "" err = errors.Join(err, fmt.Errorf("rollback extension installation: %w", rollbackErr)) } + transaction = nil }() registrations := make([]policy.ExtensionRegistration, 0, len(batch.extensions)) for _, extension := range batch.extensions { if err := os.Rename(extension.stagingPath, extension.finalPath); err != nil { - return false, "", fmt.Errorf("commit extension directory %s: %w", extension.name, err) + return false, nil, "", fmt.Errorf("commit extension directory %s: %w", extension.name, err) } - committedPaths = append(committedPaths, extension.finalPath) + transaction.paths = append(transaction.paths, extension.finalPath) registrations = append(registrations, policy.ExtensionRegistration{ Name: extension.name, ChromeExtensionID: extension.chromeExtensionID, @@ -465,7 +484,7 @@ func (s *ApiService) commitPreparedExtensions(ctx context.Context, batch *prepar } if err := s.policy.AddExtensions(registrations); err != nil { - return false, "", fmt.Errorf("failed to update enterprise policy: %w", err) + return false, nil, "", fmt.Errorf("failed to update enterprise policy: %w", err) } var newTokens []string @@ -473,7 +492,7 @@ func (s *ApiService) commitPreparedExtensions(ctx context.Context, batch *prepar newTokens = []string{fmt.Sprintf("--load-extension=%s", strings.Join(batch.flagPaths, ","))} } if _, err := s.mergeAndWriteChromiumFlags(ctx, newTokens); err != nil { - return false, "", err + return false, nil, "", err } committed = true @@ -483,7 +502,7 @@ func (s *ApiService) commitPreparedExtensions(ctx context.Context, batch *prepar "chromeExtensionID", extension.chromeExtensionID, "requiresEnterprisePolicy", extension.requiresEnterprisePolicy) } - return batch.requiresRestart, "", nil + return batch.requiresRestart, transaction, "", nil } func (s *ApiService) loadUnpackedExtensions(ctx context.Context, items []extensionZipItem) error { @@ -501,6 +520,51 @@ func (s *ApiService) loadUnpackedExtensions(ctx context.Context, items []extensi }) } +func (s *ApiService) verifyUnpackedExtensions(ctx context.Context, items []extensionZipItem) error { + return s.withCDPClientTimeout(ctx, extensionActivationTimeout, func(cdpCtx context.Context, client *cdpclient.Client) error { + wanted := make(map[string]struct{}, len(items)) + for _, item := range items { + wanted[filepath.Join(extensionsBaseDir, item.name)] = struct{}{} + } + + ticker := time.NewTicker(200 * time.Millisecond) + defer ticker.Stop() + for { + extensions, err := client.GetExtensions(cdpCtx) + if err == nil { + missing := make(map[string]struct{}, len(wanted)) + for path := range wanted { + missing[path] = struct{}{} + } + for _, extension := range extensions { + if extension.Enabled { + delete(missing, filepath.Clean(extension.Path)) + } + } + if len(missing) == 0 { + return nil + } + } + + select { + case <-cdpCtx.Done(): + return fmt.Errorf("extensions were not active after restart: %w", cdpCtx.Err()) + case <-ticker.C: + } + } + }) +} + +func (s *ApiService) rollbackFailedExtensionActivation(ctx context.Context, transaction *committedExtensionBatch, activationErr error) *extensionUploadError { + rollbackErr := transaction.rollback() + restartErr := s.restartChromiumAndWait(ctx, "extension upload rollback") + return internalExtensionUpload(errors.Join( + fmt.Errorf("extension activation failed: %w", activationErr), + rollbackErr, + restartErr, + ).Error()) +} + // mergeAndWriteChromiumFlags reads existing flags, merges them with new flags, // and writes the result back to chromiumFlagsPath. Returns the merged tokens or an error. func (s *ApiService) mergeAndWriteChromiumFlags(ctx context.Context, newTokens []string) ([]string, error) { diff --git a/server/e2e/e2e_chromium_test.go b/server/e2e/e2e_chromium_test.go index 25b7bcf4..99e1cbe2 100644 --- a/server/e2e/e2e_chromium_test.go +++ b/server/e2e/e2e_chromium_test.go @@ -303,8 +303,58 @@ func TestExtensionUploadAndActivation(t *testing.T) { require.NoError(t, err, "title verify failed: %v output=%s", err, string(out)) } - // A manifest that passes server-side JSON validation but is rejected by Chromium forces - // the CDP activation failure path. The endpoint falls back to a restart and still succeeds. + // Stop Chromium to inject a transient CDP connection failure, then upload a valid + // extension. The fallback restart must activate it before returning success. + fallbackExtDir := t.TempDir() + fallbackManifest := `{ + "manifest_version": 3, + "version": "1.0", + "name": "Fallback Test Extension", + "content_scripts": [{ + "matches": ["https://www.sfmoma.org/*"], + "js": ["content-script.js"] + }] +}` + require.NoError(t, os.WriteFile(filepath.Join(fallbackExtDir, "manifest.json"), []byte(fallbackManifest), 0o600)) + require.NoError(t, os.WriteFile(filepath.Join(fallbackExtDir, "content-script.js"), []byte(`document.title += " -- Fallback extension active";`), 0o600)) + fallbackExtZip, err := zipDirToBytes(fallbackExtDir) + require.NoError(t, err, "zip fallback extension") + _, err = execCombinedOutputWithClient(ctx, c, "supervisorctl", []string{"-c", "/etc/supervisor/supervisord.conf", "stop", "chromium"}) + require.NoError(t, err, "stop Chromium to inject transient CDP failure") + { + client, err := c.APIClient() + require.NoError(t, err) + var body bytes.Buffer + w := multipart.NewWriter(&body) + fw, err := w.CreateFormFile("extensions.zip_file", "fallback-ext.zip") + require.NoError(t, err) + _, err = io.Copy(fw, bytes.NewReader(fallbackExtZip)) + require.NoError(t, err) + require.NoError(t, w.WriteField("extensions.name", "cdp-fallback-testext")) + require.NoError(t, w.Close()) + + rsp, err := client.UploadExtensionsWithBodyWithResponse(ctx, w.FormDataContentType(), &body) + require.NoError(t, err, "uploadExtensions fallback request error") + require.Equal(t, http.StatusCreated, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) + } + browserWebSocketAfterFallback, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) + require.NoError(t, err, "get browser WebSocket URL after CDP fallback") + require.NotEqual(t, browserWebSocketAfter, browserWebSocketAfterFallback, "transient CDP failure did not fall back to restart") + { + cmd := exec.CommandContext(ctx, "pnpm", "exec", "tsx", "index.ts", + "verify-title-contains", + "--url", "https://www.sfmoma.org/", + "--substr", "Fallback extension active", + "--ws-url", c.CDPURL(), + "--timeout", "45000", + ) + cmd.Dir = getPlaywrightPath() + out, err := cmd.CombinedOutput() + require.NoError(t, err, "fallback extension was not active after restart: %v output=%s", err, string(out)) + } + + // A permanently invalid extension is rejected after fallback verification. Its committed + // directory, flag, and policy state must be removed before the endpoint returns 500. invalidExtDir := t.TempDir() require.NoError(t, os.WriteFile(filepath.Join(invalidExtDir, "manifest.json"), []byte(`{ "manifest_version": 3, @@ -321,16 +371,18 @@ func TestExtensionUploadAndActivation(t *testing.T) { require.NoError(t, err) _, err = io.Copy(fw, bytes.NewReader(invalidExtZip)) require.NoError(t, err) - require.NoError(t, w.WriteField("extensions.name", "cdp-fallback-testext")) + require.NoError(t, w.WriteField("extensions.name", "cdp-invalid-testext")) require.NoError(t, w.Close()) rsp, err := client.UploadExtensionsWithBodyWithResponse(ctx, w.FormDataContentType(), &body) - require.NoError(t, err, "uploadExtensions fallback request error") - require.Equal(t, http.StatusCreated, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) + require.NoError(t, err, "uploadExtensions invalid-extension request error") + require.Equal(t, http.StatusInternalServerError, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) } - browserWebSocketAfterFallback, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) - require.NoError(t, err, "get browser WebSocket URL after CDP fallback") - require.NotEqual(t, browserWebSocketAfter, browserWebSocketAfterFallback, "CDP activation failure did not fall back to restart") + rollbackCheck := `test ! -e /home/kernel/extensions/cdp-invalid-testext && ! grep -q cdp-invalid-testext /chromium/flags && ! grep -q cdp-invalid-testext /etc/chromium/policies/managed/policy.json` + _, err = execCombinedOutputWithClient(ctx, c, "sh", []string{"-c", rollbackCheck}) + require.NoError(t, err, "invalid extension state was not rolled back") + browserWebSocketAfterRollback, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) + require.NoError(t, err, "get browser WebSocket URL after activation rollback") // The legacy endpoint retains its unconditional restart behavior. { @@ -352,7 +404,7 @@ func TestExtensionUploadAndActivation(t *testing.T) { browserWebSocketAfterRestart, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) require.NoError(t, err, "get browser WebSocket URL after legacy extension upload") - require.NotEqual(t, browserWebSocketAfterFallback, browserWebSocketAfterRestart, "legacy endpoint did not restart Chromium") + require.NotEqual(t, browserWebSocketAfterRollback, browserWebSocketAfterRestart, "legacy endpoint did not restart Chromium") } func TestScreenshotHeadless(t *testing.T) { diff --git a/server/lib/cdpclient/cdpclient.go b/server/lib/cdpclient/cdpclient.go index ec1cbdff..ac1449d7 100644 --- a/server/lib/cdpclient/cdpclient.go +++ b/server/lib/cdpclient/cdpclient.go @@ -181,6 +181,30 @@ func (c *Client) LoadUnpackedExtension(ctx context.Context, path string) (string return result.ID, nil } +// ExtensionInfo describes an unpacked extension known to Chromium. +type ExtensionInfo struct { + ID string `json:"id"` + Name string `json:"name"` + Version string `json:"version"` + Path string `json:"path"` + Enabled bool `json:"enabled"` +} + +// GetExtensions returns all unpacked extensions known to Chromium. +func (c *Client) GetExtensions(ctx context.Context) ([]ExtensionInfo, error) { + raw, err := c.send(ctx, "Extensions.getExtensions", nil, "") + if err != nil { + return nil, fmt.Errorf("Extensions.getExtensions: %w", err) + } + var result struct { + Extensions []ExtensionInfo `json:"extensions"` + } + if err := json.Unmarshal(raw, &result); err != nil { + return nil, fmt.Errorf("unmarshal Extensions.getExtensions: %w", err) + } + return result.Extensions, nil +} + // Histogram is a snapshot of a Chrome UMA histogram as returned by // Browser.getHistograms. Values are cumulative since browser start and the // units follow the UMA definition of the histogram (PageLoad timings are diff --git a/server/lib/cdpclient/cdpclient_test.go b/server/lib/cdpclient/cdpclient_test.go index ac652492..5cb9aec6 100644 --- a/server/lib/cdpclient/cdpclient_test.go +++ b/server/lib/cdpclient/cdpclient_test.go @@ -35,6 +35,9 @@ type fakeCDP struct { loadUnpackedPath string loadUnpackedID string failLoadUnpacked bool + getExtensionsCalled bool + extensions []ExtensionInfo + failGetExtensions bool navigateCalled bool navigateCalls int navigateURL string @@ -123,6 +126,13 @@ func (f *fakeCDP) handler(w http.ResponseWriter, r *http.Request) { } else { result = map[string]string{"id": f.loadUnpackedID} } + case "Extensions.getExtensions": + f.getExtensionsCalled = true + if f.failGetExtensions { + cdpErr = &cdpError{Code: -5, Message: "extensions unavailable"} + } else { + result = map[string]any{"extensions": f.extensions} + } case "Page.navigate": f.navigateCalled = true f.navigateCalls++ @@ -362,6 +372,42 @@ func TestGetBrowserVersion(t *testing.T) { }) } +func TestGetExtensions(t *testing.T) { + t.Run("happy path", func(t *testing.T) { + want := []ExtensionInfo{{ + ID: "abcdefghijklmnopabcdefghijklmnop", + Name: "Test Extension", + Version: "1.0", + Path: "/home/kernel/extensions/test", + Enabled: true, + }} + f := &fakeCDP{extensions: want} + url := startFakeCDP(t, f) + + client, err := Dial(context.Background(), url) + require.NoError(t, err) + defer client.Close() + + got, err := client.GetExtensions(context.Background()) + require.NoError(t, err) + assert.Equal(t, want, got) + assert.True(t, f.getExtensionsCalled) + }) + + t.Run("CDP error", func(t *testing.T) { + f := &fakeCDP{failGetExtensions: true} + url := startFakeCDP(t, f) + + client, err := Dial(context.Background(), url) + require.NoError(t, err) + defer client.Close() + + _, err = client.GetExtensions(context.Background()) + require.Error(t, err) + assert.Contains(t, err.Error(), "Extensions.getExtensions") + }) +} + func TestLoadUnpackedExtension(t *testing.T) { t.Run("happy path", func(t *testing.T) { f := &fakeCDP{loadUnpackedID: "abcdefghijklmnopabcdefghijklmnop"} From 28f7b889fd11b3ab8c1770fa7a78ad0890e9f388 Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:56:57 +0000 Subject: [PATCH 08/10] Keep rollback transaction stable --- server/cmd/api/api/chromium.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index 88efcfe8..7c51c37d 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -458,12 +458,13 @@ func (s *ApiService) commitPreparedExtensions(ctx context.Context, batch *prepar flagsSnapshot: flagsSnapshot, policySnapshot: policySnapshot, } + rollbackTransaction := transaction committed := false defer func() { if committed { return } - if rollbackErr := transaction.rollback(); rollbackErr != nil { + if rollbackErr := rollbackTransaction.rollback(); rollbackErr != nil { reqMsg = "" err = errors.Join(err, fmt.Errorf("rollback extension installation: %w", rollbackErr)) } From 91ea648970cfc584cc9899f04fd0e355d57a43a0 Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Wed, 19 Aug 2026 18:18:52 +0000 Subject: [PATCH 09/10] Verify mixed extension restart batches --- server/cmd/api/api/chromium.go | 36 +++++++++++++++++++++------------ server/e2e/e2e_chromium_test.go | 23 ++++++++++++++------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/server/cmd/api/api/chromium.go b/server/cmd/api/api/chromium.go index 7c51c37d..fedb7db2 100644 --- a/server/cmd/api/api/chromium.go +++ b/server/cmd/api/api/chromium.go @@ -117,17 +117,20 @@ func (s *ApiService) uploadExtensions(ctx context.Context, mr *multipart.Reader, } restarted := forceRestart || requiresRestart + var loadErr error if restarted { if err := s.restartChromiumAndWait(ctx, "extension upload"); err != nil { return s.rollbackFailedExtensionActivation(ctx, transaction, err) } - } else if loadErr := s.loadUnpackedExtensions(ctx, extItems); loadErr != nil { + } else if loadErr = s.loadUnpackedExtensions(ctx, prepared.extensions); loadErr != nil { log.Warn("CDP extension load failed, restarting Chromium", "error", loadErr) if restartErr := s.restartChromiumAndWait(ctx, "extension upload fallback"); restartErr != nil { return s.rollbackFailedExtensionActivation(ctx, transaction, errors.Join(loadErr, restartErr)) } restarted = true - if verifyErr := s.verifyUnpackedExtensions(ctx, extItems); verifyErr != nil { + } + if restarted && !forceRestart { + if verifyErr := s.verifyUnpackedExtensions(ctx, prepared.extensions); verifyErr != nil { return s.rollbackFailedExtensionActivation(ctx, transaction, errors.Join(loadErr, verifyErr)) } } @@ -506,28 +509,35 @@ func (s *ApiService) commitPreparedExtensions(ctx context.Context, batch *prepar return batch.requiresRestart, transaction, "", nil } -func (s *ApiService) loadUnpackedExtensions(ctx context.Context, items []extensionZipItem) error { +func (s *ApiService) loadUnpackedExtensions(ctx context.Context, extensions []preparedExtension) error { log := logger.FromContext(ctx) return s.withCDPClientTimeout(ctx, extensionActivationTimeout, func(cdpCtx context.Context, client *cdpclient.Client) error { - for _, item := range items { - path := filepath.Join(extensionsBaseDir, item.name) - id, err := client.LoadUnpackedExtension(cdpCtx, path) + for _, extension := range extensions { + if extension.requiresEnterprisePolicy { + continue + } + id, err := client.LoadUnpackedExtension(cdpCtx, extension.finalPath) if err != nil { - return fmt.Errorf("failed to load extension %s: %w", item.name, err) + return fmt.Errorf("failed to load extension %s: %w", extension.name, err) } - log.Info("loaded unpacked extension over CDP", "name", item.name, "id", id) + log.Info("loaded unpacked extension over CDP", "name", extension.name, "id", id) } return nil }) } -func (s *ApiService) verifyUnpackedExtensions(ctx context.Context, items []extensionZipItem) error { - return s.withCDPClientTimeout(ctx, extensionActivationTimeout, func(cdpCtx context.Context, client *cdpclient.Client) error { - wanted := make(map[string]struct{}, len(items)) - for _, item := range items { - wanted[filepath.Join(extensionsBaseDir, item.name)] = struct{}{} +func (s *ApiService) verifyUnpackedExtensions(ctx context.Context, extensions []preparedExtension) error { + wanted := make(map[string]struct{}, len(extensions)) + for _, extension := range extensions { + if !extension.requiresEnterprisePolicy { + wanted[extension.finalPath] = struct{}{} } + } + if len(wanted) == 0 { + return nil + } + return s.withCDPClientTimeout(ctx, extensionActivationTimeout, func(cdpCtx context.Context, client *cdpclient.Client) error { ticker := time.NewTicker(200 * time.Millisecond) defer ticker.Stop() for { diff --git a/server/e2e/e2e_chromium_test.go b/server/e2e/e2e_chromium_test.go index 99e1cbe2..50dcfe47 100644 --- a/server/e2e/e2e_chromium_test.go +++ b/server/e2e/e2e_chromium_test.go @@ -353,8 +353,12 @@ func TestExtensionUploadAndActivation(t *testing.T) { require.NoError(t, err, "fallback extension was not active after restart: %v output=%s", err, string(out)) } - // A permanently invalid extension is rejected after fallback verification. Its committed - // directory, flag, and policy state must be removed before the endpoint returns 500. + // A mixed batch with an enterprise extension and a permanently invalid unpacked extension + // must verify the unpacked item after the policy-required restart, then roll back both items. + enterpriseExtDir, err := filepath.Abs("test-extension-enterprise") + require.NoError(t, err, "resolve enterprise extension fixture") + enterpriseExtZip, err := zipDirToBytes(enterpriseExtDir) + require.NoError(t, err, "zip enterprise extension") invalidExtDir := t.TempDir() require.NoError(t, os.WriteFile(filepath.Join(invalidExtDir, "manifest.json"), []byte(`{ "manifest_version": 3, @@ -367,20 +371,25 @@ func TestExtensionUploadAndActivation(t *testing.T) { require.NoError(t, err) var body bytes.Buffer w := multipart.NewWriter(&body) - fw, err := w.CreateFormFile("extensions.zip_file", "invalid-ext.zip") + fw, err := w.CreateFormFile("extensions.zip_file", "enterprise-ext.zip") + require.NoError(t, err) + _, err = io.Copy(fw, bytes.NewReader(enterpriseExtZip)) + require.NoError(t, err) + require.NoError(t, w.WriteField("extensions.name", "mixed-enterprise-testext")) + fw, err = w.CreateFormFile("extensions.zip_file", "invalid-ext.zip") require.NoError(t, err) _, err = io.Copy(fw, bytes.NewReader(invalidExtZip)) require.NoError(t, err) - require.NoError(t, w.WriteField("extensions.name", "cdp-invalid-testext")) + require.NoError(t, w.WriteField("extensions.name", "mixed-invalid-testext")) require.NoError(t, w.Close()) rsp, err := client.UploadExtensionsWithBodyWithResponse(ctx, w.FormDataContentType(), &body) - require.NoError(t, err, "uploadExtensions invalid-extension request error") + require.NoError(t, err, "uploadExtensions mixed-batch request error") require.Equal(t, http.StatusInternalServerError, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) } - rollbackCheck := `test ! -e /home/kernel/extensions/cdp-invalid-testext && ! grep -q cdp-invalid-testext /chromium/flags && ! grep -q cdp-invalid-testext /etc/chromium/policies/managed/policy.json` + rollbackCheck := `test ! -e /home/kernel/extensions/mixed-enterprise-testext && ! -e /home/kernel/extensions/mixed-invalid-testext && ! grep -q mixed-invalid-testext /chromium/flags && ! grep -q mixed-enterprise-testext /etc/chromium/policies/managed/policy.json` _, err = execCombinedOutputWithClient(ctx, c, "sh", []string{"-c", rollbackCheck}) - require.NoError(t, err, "invalid extension state was not rolled back") + require.NoError(t, err, "mixed extension state was not rolled back") browserWebSocketAfterRollback, err := cdpclient.BrowserWebSocketURL(ctx, versionURL) require.NoError(t, err, "get browser WebSocket URL after activation rollback") From 83b26d87e0592edc5568ff69c0ea3b85abd7e2b9 Mon Sep 17 00:00:00 2001 From: rgarcia <72655+rgarcia@users.noreply.github.com> Date: Wed, 19 Aug 2026 18:25:52 +0000 Subject: [PATCH 10/10] Assert mixed extension directory rollback --- server/e2e/e2e_chromium_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/e2e/e2e_chromium_test.go b/server/e2e/e2e_chromium_test.go index 50dcfe47..1d99df2e 100644 --- a/server/e2e/e2e_chromium_test.go +++ b/server/e2e/e2e_chromium_test.go @@ -387,7 +387,7 @@ func TestExtensionUploadAndActivation(t *testing.T) { require.NoError(t, err, "uploadExtensions mixed-batch request error") require.Equal(t, http.StatusInternalServerError, rsp.StatusCode(), "unexpected status: %s body=%s", rsp.Status(), string(rsp.Body)) } - rollbackCheck := `test ! -e /home/kernel/extensions/mixed-enterprise-testext && ! -e /home/kernel/extensions/mixed-invalid-testext && ! grep -q mixed-invalid-testext /chromium/flags && ! grep -q mixed-enterprise-testext /etc/chromium/policies/managed/policy.json` + rollbackCheck := `test ! -e /home/kernel/extensions/mixed-enterprise-testext && test ! -e /home/kernel/extensions/mixed-invalid-testext && ! grep -q mixed-invalid-testext /chromium/flags && ! grep -q mixed-enterprise-testext /etc/chromium/policies/managed/policy.json` _, err = execCombinedOutputWithClient(ctx, c, "sh", []string{"-c", rollbackCheck}) require.NoError(t, err, "mixed extension state was not rolled back") browserWebSocketAfterRollback, err := cdpclient.BrowserWebSocketURL(ctx, versionURL)