magnitude-core
Version:
Magnitude e2e testing agent
826 lines (789 loc) • 26.5 kB
text/typescript
import EventEmitter from 'eventemitter3';
import z$1, { Schema, ZodTypeAny, z, ZodSchema } from 'zod';
import { Image as Image$1 } from '@boundaryml/baml';
import sharp, { Sharp } from 'sharp';
import { BrowserContext, Page, PageScreenshotOptions, Browser, BrowserContextOptions, LaunchOptions } from 'playwright';
import { PostHog } from 'posthog-node';
import pino from 'pino';
type Base64Image = `data:image/${'jpeg' | 'png' | 'gif'};base64,${string}`;
type WebAction = NavigateWebAction | ClickWebAction | TypeWebAction | ScrollWebAction | SwitchTabWebAction;
interface NavigateWebAction {
variant: 'load';
url: string;
}
interface ClickWebAction {
variant: 'click';
x: number;
y: number;
}
interface TypeWebAction {
variant: 'type';
x: number;
y: number;
content: string;
}
interface ScrollWebAction {
variant: 'scroll';
x: number;
y: number;
deltaX: number;
deltaY: number;
}
type SwitchTabWebAction = {
variant: 'tab';
index: number;
};
interface PixelCoordinate {
x: number;
y: number;
}
/**
* "Intents" are natural language descriptors that align 1:1 with executable web actions.
* Micro converts intents into web actions.
*/
interface Action {
variant: string;
[key: string]: any;
}
type ActionIntent = ClickIntent | TypeIntent | ScrollIntent | SwitchTabIntent;
type Intent = ActionIntent | CheckIntent;
interface ClickIntent {
variant: 'click';
target: string;
}
interface TypeIntent {
variant: 'type';
target: string;
content: string;
}
interface ScrollIntent {
variant: 'scroll';
target: string;
deltaX: number;
deltaY: number;
}
type SwitchTabIntent = SwitchTabWebAction;
interface CheckIntent {
variant: 'check';
checks: string[];
}
type BrowserAgentRole = 'act' | 'extract' | 'query';
declare const allBrowserAgentRoles: BrowserAgentRole[];
type LLMClient = (AnthropicClient | ClaudeCodeClient | BedrockClient | GoogleAIClient | GoogleVertexClient | OpenAIClient | OpenAIGenericClient | AzureOpenAIClient) & {
roles?: BrowserAgentRole[];
};
interface AnthropicClient {
provider: 'anthropic';
options: {
model: string;
apiKey?: string;
temperature?: number;
promptCaching?: boolean;
};
}
interface ClaudeCodeClient {
provider: 'claude-code';
options: {
model: string;
temperature?: number;
promptCaching?: boolean;
};
}
interface BedrockClient {
provider: 'aws-bedrock';
options: {
model: string;
temperature?: number;
};
}
interface GoogleAIClient {
provider: 'google-ai';
options: {
model: string;
apiKey?: string;
temperature?: number;
baseUrl?: string;
};
}
interface GoogleVertexClient {
provider: 'vertex-ai';
options: {
model: string;
location?: string;
baseUrl?: string;
projectId?: string;
credentials?: string | object;
anthropicVersion?: string;
temperature?: number;
};
}
interface OpenAIClient {
provider: 'openai';
options: {
model: string;
apiKey?: string;
temperature?: number;
};
}
interface AzureOpenAIClient {
provider: 'azure-openai';
options: {
resourceName: string;
deploymentId: string;
apiVersion: string;
apiKey: string;
};
}
interface OpenAIGenericClient {
provider: 'openai-generic';
options: {
model: string;
baseUrl: string;
apiKey?: string;
temperature?: number;
headers?: Record<string, string>;
};
}
interface LLMClientIdentifier {
provider: string;
model: string;
}
interface ModelUsage {
llm: LLMClientIdentifier;
inputTokens: number;
outputTokens: number;
cacheWriteInputTokens?: number;
cacheReadInputTokens?: number;
inputCost?: number;
outputCost?: number;
}
interface AgentEvents {
'start': () => void;
'stop': () => void;
'thought': (thought: string) => void;
'actStarted': (task: string, options: ActOptions) => void;
'actDone': (task: string, options: ActOptions) => void;
'actionStarted': (action: Action) => void;
'actionDone': (action: Action) => void;
'pause': () => void;
'resume': () => void;
'tokensUsed': (usage: ModelUsage) => void;
}
type StoredMedia = {
type: 'media';
format: string;
storage: 'base64';
base64: string;
};
interface StoredPrimitive {
type: 'primitive';
content: string | boolean | number;
}
type MultiMediaPrimitive = StoredMedia | StoredPrimitive | undefined | null;
type MultiMediaArray = Array<MultiMediaJson>;
type MultiMediaObject = {
[key: string]: MultiMediaJson;
};
type MultiMediaJson = MultiMediaPrimitive | MultiMediaArray | MultiMediaObject;
declare class Image {
/**
* Wrapper for a Sharp image with conveniences to go to/from base64, convert to BAML, or serialize as JSON
*/
private img;
constructor(img: Sharp);
static fromBase64(base64: string): Image;
getFormat(): Promise<keyof sharp.FormatEnum>;
/**
* Convert the image to a JSON representation
*/
toJson(): Promise<StoredMedia>;
toBase64(): Promise<string>;
toBaml(): Promise<Image$1>;
saveToFile(filepath: string): Promise<void>;
getDimensions(): Promise<{
width: number;
height: number;
}>;
resize(width: number, height: number): Promise<Image>;
}
/*************************************************************************************************
Welcome to Baml! To use this generated code, please run one of the following:
$ npm install @boundaryml/baml
$ yarn add @boundaryml/baml
$ pnpm add @boundaryml/baml
*************************************************************************************************/
interface AgentContext {
instructions?: string | null;
observationContent: MultiMediaMessage[];
connectorInstructions: ConnectorInstructions[];
}
interface ConnectorInstructions {
connectorId: string;
instructions: string;
}
interface MultiMediaMessage {
role: "user" | "assistant";
cacheControl: boolean;
content: (Image$1 | string)[];
}
type MultiMediaContentPart = Image$1 | string;
type ObservableDataPrimitive = Image | string | number | boolean | null | undefined;
type ObservableDataArray = Array<RenderableContent>;
type ObservableDataObject = {
[key: string]: RenderableContent;
};
type RenderableContent = ObservableDataPrimitive | ObservableDataArray | ObservableDataObject;
type ObservationRole = 'user' | 'assistant';
interface ObservationRetentionOptions {
type: string;
limit?: number;
dedupe?: boolean;
}
type ObservationSource = `connector:${string}` | `action:taken:${string}` | `action:result:${string}` | `thought`;
declare class Observation {
readonly source: ObservationSource;
readonly role: ObservationRole;
readonly timestamp: number;
readonly content: RenderableContent;
readonly retention?: ObservationRetentionOptions;
constructor(source: ObservationSource, role: ObservationRole, content: RenderableContent, retention?: ObservationRetentionOptions, timestamp?: number);
static fromConnector(connectorId: string, content: RenderableContent, options?: ObservationRetentionOptions): Observation;
static fromActionTaken(actionId: string, content: RenderableContent, options?: ObservationRetentionOptions): Observation;
static fromActionResult(actionId: string, content: RenderableContent, options?: ObservationRetentionOptions): Observation;
static fromThought(content: RenderableContent, options?: ObservationRetentionOptions): Observation;
toString(): string;
toJson(): Promise<MultiMediaJson>;
render(options?: {
prefix?: MultiMediaContentPart[];
postfix?: MultiMediaContentPart[];
cacheControl?: boolean;
}): Promise<MultiMediaMessage>;
hash(): Promise<string>;
equals(obs: Observation): Promise<boolean>;
}
interface ActionDefinition<T> {
name: string;
description?: string;
schema: Schema<T>;
resolver: ({ input, agent }: {
input: T;
agent: Agent;
}) => Promise<void | RenderableContent>;
render: (action: T) => string;
}
declare function createAction<S extends ZodTypeAny>(action: {
name: string;
description?: string;
schema?: S;
resolver: ({ input, agent }: {
input: z.infer<S>;
agent: Agent;
}) => Promise<void | RenderableContent>;
render?: (action: z.infer<S>) => string;
}): ActionDefinition<z.infer<S>>;
type ActionPayload<A extends ActionDefinition<any>> = {
name: A['name'];
} & z.infer<A['schema']>;
interface AgentConnector {
id: string;
onStart?(): Promise<void>;
onStop?(): Promise<void>;
getActionSpace?(): ActionDefinition<any>[];
collectObservations?(): Promise<Observation[]>;
getInstructions?(): Promise<void | string>;
}
interface SerializedAgentMemory {
instructions?: string;
observations: {
source: ObservationSource;
role: ObservationRole;
timestamp: number;
data: MultiMediaJson;
options?: ObservationRetentionOptions;
}[];
}
interface AgentMemoryOptions {
instructions?: string | null;
promptCaching?: boolean;
thoughtLimit?: number;
}
interface MemoryRenderOptions {
}
declare class AgentMemory {
private options;
private observations;
private freezeMask?;
private cacheControlIndices;
constructor(options?: AgentMemoryOptions);
get instructions(): string | null;
render(options?: MemoryRenderOptions): Promise<MultiMediaMessage[]>;
simpleRender(): Promise<(Image$1 | string)[]>;
isEmpty(): boolean;
recordThought(content: string): void;
recordObservation(obs: Observation): void;
getLastThoughtMessage(): string | null;
toJSON(): Promise<SerializedAgentMemory>;
loadJSON(data: SerializedAgentMemory): Promise<void>;
}
declare function mergeMessages(messages: MultiMediaMessage[]): MultiMediaMessage[];
interface ModelHarnessEvents {
'tokensUsed': (usage: ModelUsage) => {};
}
declare class MultiModelHarness {
/**
* Delegates model responsibilites to different LLMs and consolidates their usage
*/
private roles;
private uniqueModels;
readonly events: EventEmitter<ModelHarnessEvents>;
constructor(clients: LLMClient[]);
setup(): Promise<void>;
describe(): string;
partialAct<T>(context: AgentContext, task: string, data: MultiMediaContentPart[], actionVocabulary: ActionDefinition<T>[]): Promise<{
reasoning: string;
actions: Action[];
}>;
extract<T extends z$1.Schema>(instructions: string, schema: T, screenshot: Image, domContent: string): Promise<z$1.infer<T>>;
query<T extends z$1.Schema>(context: AgentContext, query: string, schema: T): Promise<z$1.infer<T>>;
get numUniqueModels(): number;
}
interface AgentOptions {
llm?: LLMClient | LLMClient[];
connectors?: AgentConnector[];
actions?: ActionDefinition<any>[];
prompt?: string | null;
telemetry?: boolean;
}
interface ActOptions {
prompt?: string;
data?: RenderableContent;
memory?: AgentMemory;
}
declare class Agent {
private options;
private connectors;
private actions;
private memoryOptions;
readonly models: MultiModelHarness;
readonly events: EventEmitter<AgentEvents>;
private doneActing;
private _paused;
private _pauseResolve;
protected latestTaskMemory: AgentMemory;
constructor(baseConfig?: Partial<AgentOptions>);
getConnector<C extends AgentConnector>(connectorClass: new (...args: any[]) => C): C | undefined;
require<C extends AgentConnector>(connectorClass: new (...args: any[]) => C): C;
start(): Promise<void>;
identifyAction(action: Action): ActionDefinition<any>;
exec(action: Action, memory?: AgentMemory): Promise<void>;
protected _recordConnectorObservations(memory: AgentMemory): Promise<void>;
get memory(): AgentMemory;
act(taskOrSteps: string | string[], options?: ActOptions): Promise<void>;
_traceAct(task: string, memory: AgentMemory, options?: ActOptions): Promise<void>;
private _buildContext;
_act(description: string, memory: AgentMemory, options?: ActOptions): Promise<void>;
query<T extends z$1.Schema>(query: string, schema: T): Promise<z$1.infer<T>>;
queueDone(): Promise<void>;
private _waitIfPaused;
pause(): void;
resume(): void;
get paused(): boolean;
stop(): Promise<void>;
}
interface ActionVisualizerOptions {
showCursor?: boolean;
showHoverCircle?: boolean;
showClickRipple?: boolean;
showDragLine?: boolean;
showTypeEffects?: boolean;
}
declare class ActionVisualizer {
private options;
private context;
private page;
private cursor;
private mouseEffects;
private typeEffects;
constructor(context: BrowserContext, options: ActionVisualizerOptions);
setup(): Promise<void>;
setActivePage(page: Page): Promise<void>;
moveVirtualCursor(x: number, y: number): Promise<void>;
hideAll(): Promise<void>;
showAll(): Promise<void>;
}
interface TabState {
activeTab: number;
tabs: {
title: string;
url: string;
}[];
}
interface WebHarnessOptions {
virtualScreenDimensions?: {
width: number;
height: number;
};
visuals?: ActionVisualizerOptions;
switchTabsOnActivity?: boolean;
}
interface WebHarnessEvents {
'activePageChanged': (page: Page) => Promise<void>;
}
declare class WebHarness {
/**
* Executes web actions on a page
* Not responsible for browser lifecycle
*/
readonly context: BrowserContext;
private options;
private stability;
readonly visualizer: ActionVisualizer;
private transformer;
private tabs;
readonly events: EventEmitter<WebHarnessEvents>;
constructor(context: BrowserContext, options?: WebHarnessOptions);
setActivePage(page: Page): Promise<void>;
retrieveTabState(): Promise<TabState>;
start(): Promise<void>;
stop(): Promise<void>;
get page(): Page;
screenshot(options?: PageScreenshotOptions): Promise<Image>;
_type(content: string): Promise<void>;
transformCoordinates({ x, y }: {
x: number;
y: number;
}): Promise<{
x: number;
y: number;
}>;
click({ x, y }: {
x: number;
y: number;
}, options?: {
transform: boolean;
}): Promise<void>;
private _click;
rightClick({ x, y }: {
x: number;
y: number;
}, options?: {
transform: boolean;
}): Promise<void>;
doubleClick({ x, y }: {
x: number;
y: number;
}, options?: {
transform: boolean;
}): Promise<void>;
drag({ x1, y1, x2, y2 }: {
x1: number;
y1: number;
x2: number;
y2: number;
}, options?: {
transform: boolean;
}): Promise<void>;
type({ content }: {
content: string;
}): Promise<void>;
clickAndType({ x, y, content }: {
x: number;
y: number;
content: string;
}, options?: {
transform: boolean;
}): Promise<void>;
scroll({ x, y, deltaX, deltaY }: {
x: number;
y: number;
deltaX: number;
deltaY: number;
}, options?: {
transform: boolean;
}): Promise<void>;
switchTab({ index }: {
index: number;
}): Promise<void>;
newTab(): Promise<void>;
navigate(url: string): Promise<void>;
selectAll(): Promise<void>;
enter(): Promise<void>;
backspace(): Promise<void>;
tab(): Promise<void>;
goBack(): Promise<void>;
executeAction(action: WebAction): Promise<void>;
waitForStability(timeout?: number): Promise<void>;
}
type BrowserOptions = {
instance: Browser;
contextOptions?: BrowserContextOptions;
} | {
cdp: string;
contextOptions?: BrowserContextOptions;
} | {
launchOptions?: LaunchOptions;
contextOptions?: BrowserContextOptions;
} | {
context: BrowserContext;
};
declare class BrowserProvider {
private activeBrowsers;
private logger;
private constructor();
static getInstance(): BrowserProvider;
private _launchOrReuseBrowser;
_createAndTrackContext(options: BrowserOptions): Promise<BrowserContext>;
newContext(options?: BrowserOptions): Promise<BrowserContext>;
private _applyEmulationSettings;
}
interface BrowserConnectorOptions {
browser?: BrowserOptions;
url?: string;
virtualScreenDimensions?: {
width: number;
height: number;
};
minScreenshots?: number;
visuals?: ActionVisualizerOptions;
}
interface BrowserConnectorStateData {
screenshot: Image;
tabs: TabState;
}
declare class BrowserConnector implements AgentConnector {
readonly id: string;
private harness;
private options;
private browser?;
private context;
private logger;
constructor(options?: BrowserConnectorOptions);
onStart(): Promise<void>;
onStop(): Promise<void>;
getActionSpace(): ActionDefinition<any>[];
getHarness(): WebHarness;
private captureCurrentState;
transformScreenshot(screenshot: Image): Promise<Image>;
getLastScreenshot(): Promise<Image>;
collectObservations(): Promise<Observation[]>;
getInstructions(): Promise<void | string>;
}
declare function startBrowserAgent(options?: AgentOptions & BrowserConnectorOptions & {
narrate?: boolean;
}): Promise<BrowserAgent>;
type ExtractedOutput = string | number | boolean | bigint | Date | null | undefined | {
[key: string]: ExtractedOutput;
} | ExtractedOutput[];
interface BrowserAgentEvents {
'nav': (url: string) => void;
'extractStarted': (instructions: string, schema: ZodSchema) => void;
'extractDone': (instructions: string, data: ExtractedOutput) => void;
}
declare class BrowserAgent extends Agent {
readonly browserAgentEvents: EventEmitter<BrowserAgentEvents>;
constructor({ agentOptions, browserOptions }: {
agentOptions?: Partial<AgentOptions>;
browserOptions?: BrowserConnectorOptions;
});
get page(): Page;
get context(): BrowserContext;
nav(url: string): Promise<void>;
extract<T extends Schema>(instructions: string, schema: T): Promise<z$1.infer<T>>;
}
/**
* Generic desktop automation interface.
* Implementations can use any desktop automation technology
* (Lume, PyAutoGUI, Windows UI Automation, etc.)
*/
interface DesktopInterface {
click(x: number, y: number): Promise<void>;
rightClick(x: number, y: number): Promise<void>;
doubleClick(x: number, y: number): Promise<void>;
moveCursor(x: number, y: number): Promise<void>;
drag(fromX: number, fromY: number, toX: number, toY: number): Promise<void>;
scroll(x: number, y: number, deltaX: number, deltaY: number): Promise<void>;
type(text: string): Promise<void>;
key(key: string): Promise<void>;
hotkey(keys: string[]): Promise<void>;
screenshot(): Promise<Buffer>;
getScreenSize(): Promise<{
width: number;
height: number;
}>;
navigate?(url: string): Promise<void>;
getActiveWindow?(): Promise<{
title: string;
app: string;
}>;
getOpenWindows?(): Promise<Array<{
title: string;
app: string;
isActive: boolean;
}>>;
focusWindow?(title: string): Promise<void>;
openApplication?(name: string): Promise<void>;
closeApplication?(name: string): Promise<void>;
}
interface DesktopConnectorOptions {
desktopInterface: DesktopInterface;
virtualScreenDimensions?: {
width: number;
height: number;
};
minScreenshots?: number;
}
declare class DesktopConnector implements AgentConnector {
readonly id: string;
private desktopInterface;
private options;
private logger;
constructor(options: DesktopConnectorOptions);
onStart(): Promise<void>;
onStop(): Promise<void>;
getActionSpace(): ActionDefinition<any>[];
collectObservations(): Promise<Observation[]>;
private formatWindowInfo;
getInterface(): DesktopInterface;
}
interface AgentErrorOptions {
variant?: string;
adaptable?: boolean;
}
declare class AgentError extends Error {
readonly options: Required<AgentErrorOptions>;
constructor(message: string, options?: AgentErrorOptions);
}
/**
* Represents any reason why a test case could have failed, for example:
* - Step could not be completed
* - Check did not pass
* - Could not navigate to starting URL
* - Time or action based timeout
* - Operation cancelled by signal
* - ...
*/
type FailureDescriptor = BugDetectedFailure | MisalignmentFailure | NetworkFailure | BrowserFailure | RateLimitFailure | ApiKeyFailure | UnknownFailure | CancelledFailure;
type BugSeverity = 'critical' | 'high' | 'medium' | 'low';
/**
* Step and check failures are classified into one of:
* BugDetectedFailure: seems to be something wrong with the application itself
* MisalignmentFailure: seems to be a discrepency between the test case and the interface
* OR the agent did not properly recognize the relationship between test case and interface
*/
interface BugDetectedFailure {
variant: 'bug';
title: string;
expectedResult: string;
actualResult: string;
severity: BugSeverity;
}
interface MisalignmentFailure {
/**
* Major misalignment: when a step/check fails due to:
* 1. Poorly written step/check that is completely unrelated to the interface
* 2. Or interface has changed so much that step/check no longer applicable
* 3. Planner did not do good enough job adjusting recipe for minor misalignment
* Misalignment could be due to a poorly written test case OR bad agent behavior.
*/
variant: 'misalignment';
message: string;
}
interface NetworkFailure {
/**
* For example, failure to connect to starting URL, or any other network errors
* that would completely prevent the test from executing.
*/
variant: 'network';
message: string;
}
interface BrowserFailure {
/**
* E.g. something goes wrong with playwright interactions, any DOM manipulation, etc.
*/
variant: 'browser';
message: string;
}
interface RateLimitFailure {
variant: 'rate_limit';
message: string;
}
interface ApiKeyFailure {
variant: 'api_key';
message: string;
}
interface UnknownFailure {
variant: 'unknown';
message: string;
}
interface CancelledFailure {
/**
* Operation was cancelled, typically by an AbortSignal from a controlling process (e.g., test runner pool).
*/
variant: 'cancelled';
}
type RetryMode = {
mode: 'retry_on_partial_message';
errorSubstrings: string[];
} | {
mode: 'retry_all';
};
type RetryParams = {
retryLimit: number;
delayMs: number;
showWarnOnRetry: boolean;
};
type RetryOptions = RetryMode & RetryParams;
declare function retryOnErrorIsSuccess<T>(fnToRetry: () => Promise<T>, retryOptions: RetryMode & Partial<RetryParams>): Promise<boolean>;
declare function retryOnError<T>(fnToRetry: () => Promise<T>, retryOptions: RetryMode & Partial<RetryParams>): Promise<T>;
/**
* Performs a deep comparison between two values to determine if they are equivalent.
*
* @param a The first value to compare.
* @param b The second value to compare.
* @param cache A WeakMap to handle circular references. Should not be provided by the caller.
* @returns `true` if the values are deeply equal, `false` otherwise.
*/
declare function deepEquals(a: any, b: any, cache?: WeakMap<object, WeakSet<object>>): boolean;
interface TestDataEntry {
key: string;
value: string;
sensitive: boolean;
}
interface TestData {
data?: TestDataEntry[];
other?: string;
}
interface TestStepDefinition {
description: string;
checks: string[];
testData: TestData;
}
interface TestCaseDefinition {
url: string;
steps: TestStepDefinition[];
recipe?: Intent[];
}
type TestCaseResult = SuccessfulTestCaseResult | FailedTestCaseResult;
interface SuccessfulTestCaseResult {
passed: true;
recipe: Intent[];
}
interface FailedTestCaseResult {
passed: false;
failure: FailureDescriptor;
}
declare const createId: () => string;
declare const posthog: PostHog;
declare function getMachineId(): string;
declare function getCodebaseId(): string | undefined;
declare function sendTelemetry(eventName: string, properties: Record<string, any>): Promise<void>;
declare function buildDefaultBrowserAgentOptions({ agentOptions, browserOptions }: {
agentOptions: AgentOptions;
browserOptions: BrowserConnectorOptions;
}): {
agentOptions: AgentOptions;
browserOptions: BrowserConnectorOptions;
};
declare const logger: pino.Logger<never, boolean>;
export { Agent, AgentError, AgentMemory, BrowserAgent, BrowserConnector, BrowserProvider, DesktopConnector, Observation, WebHarness, allBrowserAgentRoles, buildDefaultBrowserAgentOptions, createAction, createId, deepEquals, getCodebaseId, getMachineId, logger, mergeMessages, posthog, retryOnError, retryOnErrorIsSuccess, sendTelemetry, startBrowserAgent };
export type { ActOptions, Action, ActionDefinition, ActionIntent, ActionPayload, AgentConnector, AgentErrorOptions, AgentEvents, AgentMemoryOptions, AgentOptions, AnthropicClient, ApiKeyFailure, AzureOpenAIClient, Base64Image, BedrockClient, BrowserAgentRole, BrowserConnectorOptions, BrowserConnectorStateData, BrowserFailure, BrowserOptions, BugDetectedFailure, BugSeverity, CancelledFailure, CheckIntent, ClaudeCodeClient, ClickIntent, ClickWebAction, DesktopConnectorOptions, DesktopInterface, FailedTestCaseResult, FailureDescriptor, GoogleAIClient, GoogleVertexClient, Intent, LLMClient, LLMClientIdentifier, MemoryRenderOptions, MisalignmentFailure, ModelUsage, NavigateWebAction, NetworkFailure, ObservableDataArray, ObservableDataObject, ObservableDataPrimitive, ObservationRetentionOptions, ObservationRole, ObservationSource, OpenAIClient, OpenAIGenericClient, PixelCoordinate, RateLimitFailure, RenderableContent, RetryMode, RetryOptions, RetryParams, ScrollIntent, ScrollWebAction, SerializedAgentMemory, SuccessfulTestCaseResult, SwitchTabIntent, SwitchTabWebAction, TestCaseDefinition, TestCaseResult, TestData, TestDataEntry, TestStepDefinition, TypeIntent, TypeWebAction, UnknownFailure, WebAction, WebHarnessEvents, WebHarnessOptions };