Add Brave CDP automation, replace Oracle browser mode

Connects to user's running Brave via Chrome DevTools Protocol
to automate ChatGPT interaction. Uses puppeteer-core to open a
tab, send the prompt, wait for response, and extract the result.

No cookies, no separate profiles, no copy/paste. Just connects
to the browser where the user is already logged in.

One-time setup: relaunch Brave with --remote-debugging-port=9222

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Taylor Eernisse
2026-02-07 16:16:41 -05:00
parent d776a266a8
commit e7882b917b
4163 changed files with 782828 additions and 148 deletions

2977
node_modules/webdriver-bidi-protocol/out/gen/main.d.ts generated vendored Normal file

File diff suppressed because it is too large Load Diff

2
node_modules/webdriver-bidi-protocol/out/gen/main.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
'use strict';
Object.defineProperty(exports, '__esModule', {value: true});

View File

@@ -0,0 +1,310 @@
import type * as Bidi from './main.js';
import type * as BidiPermissions from './permissions.js';
import type * as BidiBluetooth from './web-bluetooth.js';
import type * as BidiUaClientHints from './ua-client-hints.js';
export interface Commands {
'bluetooth.disableSimulation': {
params: BidiBluetooth.Bluetooth.DisableSimulationParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.handleRequestDevicePrompt': {
params: BidiBluetooth.Bluetooth.HandleRequestDevicePromptParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateAdapter': {
params: BidiBluetooth.Bluetooth.SimulateAdapterParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateAdvertisement': {
params: BidiBluetooth.Bluetooth.SimulateAdvertisementParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateCharacteristic': {
params: BidiBluetooth.Bluetooth.SimulateCharacteristicParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateCharacteristicResponse': {
params: BidiBluetooth.Bluetooth.SimulateCharacteristicResponseParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateDescriptor': {
params: BidiBluetooth.Bluetooth.SimulateDescriptorParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateDescriptorResponse': {
params: BidiBluetooth.Bluetooth.SimulateDescriptorResponseParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateGattConnectionResponse': {
params: BidiBluetooth.Bluetooth.SimulateGattConnectionResponseParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateGattDisconnection': {
params: BidiBluetooth.Bluetooth.SimulateGattDisconnectionParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulatePreconnectedPeripheral': {
params: BidiBluetooth.Bluetooth.SimulatePreconnectedPeripheralParameters;
returnType: Bidi.EmptyResult;
};
'bluetooth.simulateService': {
params: BidiBluetooth.Bluetooth.SimulateServiceParameters;
returnType: Bidi.EmptyResult;
};
'browser.close': {
params: Bidi.Extensible;
returnType: Bidi.Browser.CloseResult;
};
'browser.createUserContext': {
params: Bidi.Browser.CreateUserContextParameters;
returnType: Bidi.Browser.CreateUserContextResult;
};
'browser.getClientWindows': {
params: Bidi.Extensible;
returnType: Bidi.Browser.GetClientWindowsResult;
};
'browser.getUserContexts': {
params: Bidi.Extensible;
returnType: Bidi.Browser.GetUserContextsResult;
};
'browser.removeUserContext': {
params: Bidi.Browser.RemoveUserContextParameters;
returnType: Bidi.Browser.RemoveUserContextResult;
};
'browser.setClientWindowState': {
params: Bidi.Browser.SetClientWindowStateParameters;
returnType: Bidi.Browser.SetClientWindowStateResult;
};
'browser.setDownloadBehavior': {
params: Bidi.Browser.SetDownloadBehaviorParameters;
returnType: Bidi.Browser.SetDownloadBehaviorResult;
};
'browsingContext.activate': {
params: Bidi.BrowsingContext.ActivateParameters;
returnType: Bidi.BrowsingContext.ActivateResult;
};
'browsingContext.captureScreenshot': {
params: Bidi.BrowsingContext.CaptureScreenshotParameters;
returnType: Bidi.BrowsingContext.CaptureScreenshotResult;
};
'browsingContext.close': {
params: Bidi.BrowsingContext.CloseParameters;
returnType: Bidi.BrowsingContext.CloseResult;
};
'browsingContext.create': {
params: Bidi.BrowsingContext.CreateParameters;
returnType: Bidi.BrowsingContext.CreateResult;
};
'browsingContext.getTree': {
params: Bidi.BrowsingContext.GetTreeParameters;
returnType: Bidi.BrowsingContext.GetTreeResult;
};
'browsingContext.handleUserPrompt': {
params: Bidi.BrowsingContext.HandleUserPromptParameters;
returnType: Bidi.BrowsingContext.HandleUserPromptResult;
};
'browsingContext.locateNodes': {
params: Bidi.BrowsingContext.LocateNodesParameters;
returnType: Bidi.BrowsingContext.LocateNodesResult;
};
'browsingContext.navigate': {
params: Bidi.BrowsingContext.NavigateParameters;
returnType: Bidi.BrowsingContext.NavigateResult;
};
'browsingContext.print': {
params: Bidi.BrowsingContext.PrintParameters;
returnType: Bidi.BrowsingContext.PrintResult;
};
'browsingContext.reload': {
params: Bidi.BrowsingContext.ReloadParameters;
returnType: Bidi.BrowsingContext.ReloadResult;
};
'browsingContext.setViewport': {
params: Bidi.BrowsingContext.SetViewportParameters;
returnType: Bidi.BrowsingContext.SetViewportResult;
};
'browsingContext.traverseHistory': {
params: Bidi.BrowsingContext.TraverseHistoryParameters;
returnType: Bidi.BrowsingContext.TraverseHistoryResult;
};
'emulation.setClientHintsOverride': {
params: {
clientHints: BidiUaClientHints.Emulation.ClientHintsMetadata | null;
contexts?: [string, ...string[]];
userContexts?: [string, ...string[]];
};
returnType: BidiUaClientHints.Emulation.SetClientHintsOverrideResult;
};
'emulation.setForcedColorsModeThemeOverride': {
params: Bidi.Emulation.SetForcedColorsModeThemeOverrideParameters;
returnType: Bidi.Emulation.SetForcedColorsModeThemeOverrideResult;
};
'emulation.setGeolocationOverride': {
params: Bidi.Emulation.SetGeolocationOverrideParameters;
returnType: Bidi.Emulation.SetGeolocationOverrideResult;
};
'emulation.setLocaleOverride': {
params: Bidi.Emulation.SetLocaleOverrideParameters;
returnType: Bidi.Emulation.SetLocaleOverrideResult;
};
'emulation.setNetworkConditions': {
params: Bidi.Emulation.SetNetworkConditionsParameters;
returnType: Bidi.Emulation.SetNetworkConditionsResult;
};
'emulation.setScreenOrientationOverride': {
params: Bidi.Emulation.SetScreenOrientationOverrideParameters;
returnType: Bidi.Emulation.SetScreenOrientationOverrideResult;
};
'emulation.setScreenSettingsOverride': {
params: Bidi.Emulation.SetScreenSettingsOverrideParameters;
returnType: Bidi.Emulation.SetScreenSettingsOverrideResult;
};
'emulation.setScriptingEnabled': {
params: Bidi.Emulation.SetScriptingEnabledParameters;
returnType: Bidi.Emulation.SetScriptingEnabledResult;
};
'emulation.setTimezoneOverride': {
params: Bidi.Emulation.SetTimezoneOverrideParameters;
returnType: Bidi.Emulation.SetTimezoneOverrideResult;
};
'emulation.setTouchOverride': {
params: Bidi.Emulation.SetTouchOverrideParameters;
returnType: Bidi.Emulation.SetTouchOverrideResult;
};
'emulation.setUserAgentOverride': {
params: Bidi.Emulation.SetUserAgentOverrideParameters;
returnType: Bidi.Emulation.SetUserAgentOverrideResult;
};
'input.performActions': {
params: Bidi.Input.PerformActionsParameters;
returnType: Bidi.Input.PerformActionsResult;
};
'input.releaseActions': {
params: Bidi.Input.ReleaseActionsParameters;
returnType: Bidi.Input.ReleaseActionsResult;
};
'input.setFiles': {
params: Bidi.Input.SetFilesParameters;
returnType: Bidi.Input.SetFilesResult;
};
'network.addDataCollector': {
params: Bidi.Network.AddDataCollectorParameters;
returnType: Bidi.Network.AddDataCollectorResult;
};
'network.addIntercept': {
params: Bidi.Network.AddInterceptParameters;
returnType: Bidi.Network.AddInterceptResult;
};
'network.continueRequest': {
params: Bidi.Network.ContinueRequestParameters;
returnType: Bidi.Network.ContinueRequestResult;
};
'network.continueResponse': {
params: Bidi.Network.ContinueResponseParameters;
returnType: Bidi.Network.ContinueResponseResult;
};
'network.continueWithAuth': {
params: Bidi.Network.ContinueWithAuthParameters;
returnType: Bidi.Network.ContinueWithAuthResult;
};
'network.disownData': {
params: Bidi.Network.DisownDataParameters;
returnType: Bidi.Network.DisownDataResult;
};
'network.failRequest': {
params: Bidi.Network.FailRequestParameters;
returnType: Bidi.Network.FailRequestResult;
};
'network.getData': {
params: Bidi.Network.GetDataParameters;
returnType: Bidi.Network.GetDataResult;
};
'network.provideResponse': {
params: Bidi.Network.ProvideResponseParameters;
returnType: Bidi.Network.ProvideResponseResult;
};
'network.removeDataCollector': {
params: Bidi.Network.RemoveDataCollectorParameters;
returnType: Bidi.Network.RemoveDataCollectorResult;
};
'network.removeIntercept': {
params: Bidi.Network.RemoveInterceptParameters;
returnType: Bidi.Network.RemoveInterceptResult;
};
'network.setCacheBehavior': {
params: Bidi.Network.SetCacheBehaviorParameters;
returnType: Bidi.Network.SetCacheBehaviorResult;
};
'network.setExtraHeaders': {
params: Bidi.Network.SetExtraHeadersParameters;
returnType: Bidi.Network.SetExtraHeadersResult;
};
'permissions.setPermission': {
params: BidiPermissions.Permissions.SetPermissionParameters;
returnType: Bidi.EmptyResult;
};
'script.addPreloadScript': {
params: Bidi.Script.AddPreloadScriptParameters;
returnType: Bidi.Script.AddPreloadScriptResult;
};
'script.callFunction': {
params: Bidi.Script.CallFunctionParameters;
returnType: Bidi.Script.CallFunctionResult;
};
'script.disown': {
params: Bidi.Script.DisownParameters;
returnType: Bidi.Script.DisownResult;
};
'script.evaluate': {
params: Bidi.Script.EvaluateParameters;
returnType: Bidi.Script.EvaluateResult;
};
'script.getRealms': {
params: Bidi.Script.GetRealmsParameters;
returnType: Bidi.Script.GetRealmsResult;
};
'script.removePreloadScript': {
params: Bidi.Script.RemovePreloadScriptParameters;
returnType: Bidi.Script.RemovePreloadScriptResult;
};
'session.end': {
params: Bidi.Extensible;
returnType: Bidi.Session.EndResult;
};
'session.new': {
params: Bidi.Session.NewParameters;
returnType: Bidi.Session.NewResult;
};
'session.status': {
params: Bidi.Extensible;
returnType: Bidi.Session.StatusResult;
};
'session.subscribe': {
params: Bidi.Session.SubscribeParameters;
returnType: Bidi.Session.SubscribeResult;
};
'session.unsubscribe': {
params: Bidi.Session.UnsubscribeParameters;
returnType: Bidi.Session.UnsubscribeResult;
};
'storage.deleteCookies': {
params: Bidi.Storage.DeleteCookiesParameters;
returnType: Bidi.Storage.DeleteCookiesResult;
};
'storage.getCookies': {
params: Bidi.Storage.GetCookiesParameters;
returnType: Bidi.Storage.GetCookiesResult;
};
'storage.setCookie': {
params: Bidi.Storage.SetCookieParameters;
returnType: Bidi.Storage.SetCookieResult;
};
'webExtension.install': {
params: Bidi.WebExtension.InstallParameters;
returnType: Bidi.WebExtension.InstallResult;
};
'webExtension.uninstall': {
params: Bidi.WebExtension.UninstallParameters;
returnType: Bidi.WebExtension.UninstallResult;
};
}

View File

@@ -0,0 +1,2 @@
'use strict';
Object.defineProperty(exports, '__esModule', {value: true});

View File

@@ -0,0 +1,28 @@
export type PermissionsCommand = Permissions.SetPermission;
export declare namespace Permissions {
type PermissionDescriptor = {
name: string;
};
}
export declare namespace Permissions {
const enum PermissionState {
Granted = 'granted',
Denied = 'denied',
Prompt = 'prompt',
}
}
export declare namespace Permissions {
type SetPermission = {
method: 'permissions.setPermission';
params: Permissions.SetPermissionParameters;
};
}
export declare namespace Permissions {
type SetPermissionParameters = {
descriptor: Permissions.PermissionDescriptor;
state: Permissions.PermissionState;
origin: string;
embeddedOrigin?: string;
userContext?: string;
};
}

View File

@@ -0,0 +1,2 @@
'use strict';
Object.defineProperty(exports, '__esModule', {value: true});

View File

@@ -0,0 +1,35 @@
export type UserAgentClientHintsCommand =
Emulation.SetClientHintsOverrideCommand;
export declare namespace Emulation {
type SetClientHintsOverrideCommand = {
method: 'emulation.setClientHintsOverride';
params: {
clientHints: Emulation.ClientHintsMetadata | null;
contexts?: [string, ...string[]];
userContexts?: [string, ...string[]];
};
};
}
export declare namespace Emulation {
type ClientHintsMetadata = {
brands?: [...Emulation.BrandVersion[]];
fullVersionList?: [...Emulation.BrandVersion[]];
platform?: string;
platformVersion?: string;
architecture?: string;
model?: string;
mobile?: boolean;
bitness?: string;
wow64?: boolean;
formFactors?: [...string[]];
};
}
export declare namespace Emulation {
type BrandVersion = {
brand: string;
version: string;
};
}
export declare namespace Emulation {
type SetClientHintsOverrideResult = Record<string, never>;
}

View File

@@ -0,0 +1,2 @@
'use strict';
Object.defineProperty(exports, '__esModule', {value: true});

View File

@@ -0,0 +1,314 @@
export declare namespace Bluetooth {
type BluetoothUuid = string;
}
export declare namespace Bluetooth {
type BluetoothManufacturerData = {
key: number;
data: string;
};
}
export declare namespace Bluetooth {
type CharacteristicProperties = {
broadcast?: boolean;
read?: boolean;
writeWithoutResponse?: boolean;
write?: boolean;
notify?: boolean;
indicate?: boolean;
authenticatedSignedWrites?: boolean;
extendedProperties?: boolean;
};
}
export declare namespace Bluetooth {
type RequestDevice = string;
}
export declare namespace Bluetooth {
type RequestDeviceInfo = {
id: Bluetooth.RequestDevice;
name: string | null;
};
}
export declare namespace Bluetooth {
type RequestDevicePrompt = string;
}
export declare namespace Bluetooth {
type ScanRecord = {
name?: string;
uuids?: [...Bluetooth.BluetoothUuid[]];
appearance?: number;
manufacturerData?: [...Bluetooth.BluetoothManufacturerData[]];
};
}
export type BluetoothCommand =
| Bluetooth.HandleRequestDevicePrompt
| Bluetooth.SimulateAdapter
| Bluetooth.DisableSimulation
| Bluetooth.SimulatePreconnectedPeripheral
| Bluetooth.SimulateAdvertisement
| Bluetooth.SimulateGattConnectionResponse
| Bluetooth.SimulateGattDisconnection
| Bluetooth.SimulateService
| Bluetooth.SimulateCharacteristic
| Bluetooth.SimulateCharacteristicResponse
| Bluetooth.SimulateDescriptor
| Bluetooth.SimulateDescriptorResponse;
export declare namespace Bluetooth {
type HandleRequestDevicePrompt = {
method: 'bluetooth.handleRequestDevicePrompt';
params: Bluetooth.HandleRequestDevicePromptParameters;
};
}
export declare namespace Bluetooth {
type HandleRequestDevicePromptParameters = {
context: string;
prompt: Bluetooth.RequestDevicePrompt;
} & (
| Bluetooth.HandleRequestDevicePromptAcceptParameters
| Bluetooth.HandleRequestDevicePromptCancelParameters
);
}
export declare namespace Bluetooth {
type HandleRequestDevicePromptAcceptParameters = {
accept: true;
device: Bluetooth.RequestDevice;
};
}
export declare namespace Bluetooth {
type HandleRequestDevicePromptCancelParameters = {
accept: false;
};
}
export declare namespace Bluetooth {
type SimulateAdapter = {
method: 'bluetooth.simulateAdapter';
params: Bluetooth.SimulateAdapterParameters;
};
}
export declare namespace Bluetooth {
type SimulateAdapterParameters = {
context: string;
leSupported?: boolean;
state: 'absent' | 'powered-off' | 'powered-on';
};
}
export declare namespace Bluetooth {
type DisableSimulation = {
method: 'bluetooth.disableSimulation';
params: Bluetooth.DisableSimulationParameters;
};
}
export declare namespace Bluetooth {
type DisableSimulationParameters = {
context: string;
};
}
export declare namespace Bluetooth {
type SimulatePreconnectedPeripheral = {
method: 'bluetooth.simulatePreconnectedPeripheral';
params: Bluetooth.SimulatePreconnectedPeripheralParameters;
};
}
export declare namespace Bluetooth {
type SimulatePreconnectedPeripheralParameters = {
context: string;
address: string;
name: string;
manufacturerData: [...Bluetooth.BluetoothManufacturerData[]];
knownServiceUuids: [...Bluetooth.BluetoothUuid[]];
};
}
export declare namespace Bluetooth {
type SimulateAdvertisement = {
method: 'bluetooth.simulateAdvertisement';
params: Bluetooth.SimulateAdvertisementParameters;
};
}
export declare namespace Bluetooth {
type SimulateAdvertisementParameters = {
context: string;
scanEntry: Bluetooth.SimulateAdvertisementScanEntryParameters;
};
}
export declare namespace Bluetooth {
type SimulateAdvertisementScanEntryParameters = {
deviceAddress: string;
rssi: number;
scanRecord: Bluetooth.ScanRecord;
};
}
export declare namespace Bluetooth {
type SimulateGattConnectionResponse = {
method: 'bluetooth.simulateGattConnectionResponse';
params: Bluetooth.SimulateGattConnectionResponseParameters;
};
}
export declare namespace Bluetooth {
type SimulateGattConnectionResponseParameters = {
context: string;
address: string;
code: number;
};
}
export declare namespace Bluetooth {
type SimulateGattDisconnection = {
method: 'bluetooth.simulateGattDisconnection';
params: Bluetooth.SimulateGattDisconnectionParameters;
};
}
export declare namespace Bluetooth {
type SimulateGattDisconnectionParameters = {
context: string;
address: string;
};
}
export declare namespace Bluetooth {
type SimulateService = {
method: 'bluetooth.simulateService';
params: Bluetooth.SimulateServiceParameters;
};
}
export declare namespace Bluetooth {
type SimulateServiceParameters = {
context: string;
address: string;
uuid: Bluetooth.BluetoothUuid;
type: 'add' | 'remove';
};
}
export declare namespace Bluetooth {
type SimulateCharacteristic = {
method: 'bluetooth.simulateCharacteristic';
params: Bluetooth.SimulateCharacteristicParameters;
};
}
export declare namespace Bluetooth {
type SimulateCharacteristicParameters = {
context: string;
address: string;
serviceUuid: Bluetooth.BluetoothUuid;
characteristicUuid: Bluetooth.BluetoothUuid;
characteristicProperties?: Bluetooth.CharacteristicProperties;
type: 'add' | 'remove';
};
}
export declare namespace Bluetooth {
type SimulateCharacteristicResponse = {
method: 'bluetooth.simulateCharacteristicResponse';
params: Bluetooth.SimulateCharacteristicResponseParameters;
};
}
export declare namespace Bluetooth {
type SimulateCharacteristicResponseParameters = {
context: string;
address: string;
serviceUuid: Bluetooth.BluetoothUuid;
characteristicUuid: Bluetooth.BluetoothUuid;
type:
| 'read'
| 'write'
| 'subscribe-to-notifications'
| 'unsubscribe-from-notifications';
code: number;
data?: [...number[]];
};
}
export declare namespace Bluetooth {
type SimulateDescriptor = {
method: 'bluetooth.simulateDescriptor';
params: Bluetooth.SimulateDescriptorParameters;
};
}
export declare namespace Bluetooth {
type SimulateDescriptorParameters = {
context: string;
address: string;
serviceUuid: Bluetooth.BluetoothUuid;
characteristicUuid: Bluetooth.BluetoothUuid;
descriptorUuid: Bluetooth.BluetoothUuid;
type: 'add' | 'remove';
};
}
export declare namespace Bluetooth {
type SimulateDescriptorResponse = {
method: 'bluetooth.simulateDescriptorResponse';
params: Bluetooth.SimulateDescriptorResponseParameters;
};
}
export declare namespace Bluetooth {
type SimulateDescriptorResponseParameters = {
context: string;
address: string;
serviceUuid: Bluetooth.BluetoothUuid;
characteristicUuid: Bluetooth.BluetoothUuid;
descriptorUuid: Bluetooth.BluetoothUuid;
type: 'read' | 'write';
code: number;
data?: [...number[]];
};
}
export type BluetoothEvent =
| Bluetooth.RequestDevicePromptUpdated
| Bluetooth.GattConnectionAttempted;
export declare namespace Bluetooth {
type RequestDevicePromptUpdated = {
method: 'bluetooth.requestDevicePromptUpdated';
params: Bluetooth.RequestDevicePromptUpdatedParameters;
};
}
export declare namespace Bluetooth {
type RequestDevicePromptUpdatedParameters = {
context: string;
prompt: Bluetooth.RequestDevicePrompt;
devices: [...Bluetooth.RequestDeviceInfo[]];
};
}
export declare namespace Bluetooth {
type GattConnectionAttempted = {
method: 'bluetooth.gattConnectionAttempted';
params: Bluetooth.GattConnectionAttemptedParameters;
};
}
export declare namespace Bluetooth {
type GattConnectionAttemptedParameters = {
context: string;
address: string;
};
}
export declare namespace Bluetooth {
type CharacteristicEventGenerated = {
method: 'bluetooth.characteristicEventGenerated';
params: Bluetooth.CharacteristicEventGeneratedParameters;
};
}
export declare namespace Bluetooth {
type CharacteristicEventGeneratedParameters = {
context: string;
address: string;
serviceUuid: Bluetooth.BluetoothUuid;
characteristicUuid: Bluetooth.BluetoothUuid;
type:
| 'read'
| 'write-with-response'
| 'write-without-response'
| 'subscribe-to-notifications'
| 'unsubscribe-from-notifications';
data?: [...number[]];
};
}
export declare namespace Bluetooth {
type DescriptorEventGenerated = {
method: 'bluetooth.descriptorEventGenerated';
params: Bluetooth.DescriptorEventGeneratedParameters;
};
}
export declare namespace Bluetooth {
type DescriptorEventGeneratedParameters = {
context: string;
address: string;
serviceUuid: Bluetooth.BluetoothUuid;
characteristicUuid: Bluetooth.BluetoothUuid;
descriptorUuid: Bluetooth.BluetoothUuid;
type: 'read' | 'write';
data?: [...number[]];
};
}

View File

@@ -0,0 +1,2 @@
'use strict';
Object.defineProperty(exports, '__esModule', {value: true});