Skip to main content
Glama

BrowserAttach

M8ven Score BrowserAttach MCP server – quality and maintenance score on Glama BrowserAttach on Agensi

npm version license

Drive the Chrome / Edge tabs you already have open and already signed in from an MCP client. BrowserAttach connects to the browser through a locally paired extension, keeps your existing sign-in state, and needs neither a remote debugging port nor a separate automation browser.

npm · Usage guide · Architecture · Agent integration · Test report · Issues · Contributing

What it does

  • Discover multiple browser profiles, pick one precisely, claim a tab exclusively, and release it when done.

  • Control existing ordinary file:// tabs after enabling BrowserAttach's Allow access to file URLs setting in the browser's extension details; use the same discovery, claim, observation and input tools.

  • Read the accessibility tree, query names/values/nearby field context, inspect field values and supported editor models; click, fill and type through refs or strict CSS/XPath, HTML label, placeholder and AX role/name locators. Type can also target the currently focused field explicitly.

  • Native pointer hover, stepped drags and conditional waits; select HTML options without opening a native popup.

  • Navigate and go back/forward, open or close tabs, handle JavaScript dialogs, upload local files, and capture the whole page or a single element.

  • Evaluate JavaScript expressions in the main page; read console, page-error, network and navigation logs captured after claiming, with bounded available stacks and request initiators; opt in to bounded, redacted request/response details when XHR/fetch needs verification.

  • Read one HTTP(S) URL in a temporary background tab with the profile's sign-in, returning rendered text, current DOM, or complete JSON with the main-document HTTP status when observed.

  • Standard stdio MCP with 24 tools. The Hub listens on loopback only and pairs with the extension through a random key.

Related MCP server: byob

Requirements

  • Node.js 22 or newer, plus npm.

  • Chrome / Edge 125 or newer with permission to load unpacked extensions. Latest stable is recommended.

  • An MCP client that speaks stdio MCP and can find Node/npm on PATH.

Quick start

1. Install and pair

npm install --global @evan_zhong/browser-attach
browser-attach setup

setup prints a stable extension directory and starts the local Hub. The directory is usually:

  • Windows: %USERPROFILE%\.browser-attach\extension

  • macOS / Linux: ~/.local/share/browser-attach/extension

Open chrome://extensions or edge://extensions, enable developer mode, choose "Load unpacked" and load that directory. Load it once for every browser profile you want to expose; the extension options page lets you set a recognizable profile name.

Or without a global install:

npx --yes --package=@evan_zhong/browser-attach@latest browser-attach setup

2. Configure the MCP client

Merge the following into your client's MCP configuration, or see mcp-config.json:

{
  "mcpServers": {
    "browser_attach": {
      "command": "npx",
      "args": ["--yes", "--package=@evan_zhong/browser-attach@latest", "browser-attach", "mcp"]
    }
  }
}

On Windows clients that require a full command extension, use npx.cmd. With a global install you can also configure "command": "browser-attach", "args": ["mcp"]. Restart the MCP client to discover the tools.

@latest selects the package at launch; upgrading an existing pair is coordinated at startup. The first extension load, and pairs still on an older protocol, need one manual extension reload — see local data and upgrades.

Host entry points are collected in agent integration, and the connection parameters, JSON/TOML examples and verification steps are in the setup reference; other clients use the stdio entry above.

The npm package includes an optional browser-attach skill with setup, recovery and cross-site recipes. Copy the whole skills/browser-attach directory to your host's skill location if desired; npm installation does not register it with the host.

3. Start driving

  1. browser_discover(kind="browsers") → browser_discover(kind="tabs") to confirm the browser, tab title and URL.

  2. browser_claim_tab with the tab_id from discover(kind="tabs") (optional expected_url / expected_title exact guards) to take control and receive this connection's tab_handle.

  3. browser_snapshot to get element refs, then click, fill or run other actions.

  4. Observe when the next decision needs new state, and finish with browser_tab_control(action="release"). Use snapshot(diff_since="latest") or action observe:{diff_since:"latest"} for page changes; inspect mode/reset_reason and finish pagination. A full-page refresh is not required after every action.

When titles change often, omit expected_title and check the identity returned by claim instead. Elements may be addressed by ref or by a selector re-resolved on every call; design trade-offs: architecture notes.

Claiming and ordinary input never activate a tab or window; call browser_tab_control(action="activate") explicitly when foreground rendering is needed. When an outcome is unknown, observe again first and avoid duplicate submissions. Full parameters, pagination, uploads and input semantics: usage guide.

Tools

Tool

Purpose

browser_discover

kind=browsers/tabs; discover browser profiles, tab identity and control status

browser_claim_tab

Exclusively claim a discovered tab

browser_open_tab / browser_tab_control

Create a tab, optionally claim it with claim:true; explicit release/activate/close

browser_fetch

Read one HTTP(S) URL in a temporary background tab using the profile's sign-in; text/html/json, optional HTTP status and cursor continuation

browser_snapshot / browser_read_text

AX snapshot, literal name/value query with actionable refs, and page text

browser_read_control

Control state, related popups and active/selected options; preserves existing refs

browser_wait

Read-only checks with uniform expected/actual, pass/fail/unavailable and safe read retry; one top-level condition or checks[]

browser_click / browser_hover / browser_drag / browser_select_option / browser_type / browser_fill / browser_press_key / browser_scroll

Native/DOM input, pointer hover and drag, option selection, character typing and scrolling

browser_batch

Run 1–30 click/fill/type/press_key/hover/scroll/select_option/wait steps in one queue; stops on the first failure and returns partial results

browser_navigate

HTTP(S)/file navigation, back/forward and load waiting; local destinations require file access

browser_handle_dialog

alert, confirm, prompt

browser_upload_file

Native file input or an intercepted file chooser

browser_screenshot

Viewport or full-page PNG with coordinate mapping

browser_evaluate

Main-page JS evaluation, promise awaiting, bounded results

browser_logs

Read kind=console/network/navigation with independent cursors; buffered reads survive blank or unresponsive pages

Local data and upgrades

Platform

Default data directory

Windows

%USERPROFILE%/.browser-attach

macOS / Linux

${XDG_DATA_HOME:-~/.local/share}/browser-attach

Override it explicitly with the absolute path BROWSER_ATTACH_HOME. The Windows default avoids AppData, which packaged hosts may virtualize; no other host's private cache is searched or merged automatically. The directory holds the pairing configuration, Hub logs and the stable extension copy, and depends on neither the clone location, the client working directory nor the npm cache. If you already use a custom directory, keep using the same environment variable or --config instead of accidentally creating a second pairing under the new default.

A host assembly step that writes the client entry pins the absolute paths of the current Node, CLI and the actual pairing file and sets BROWSER_ATTACH_HOME; it works together with a custom --config. When the MCP launches the Hub it passes the same absolute pairing path and directory, so different launch environments cannot derive a second configuration. See agent integration.

To upgrade, install again with the command from step 1 and reconnect the MCP client. With @latest and a pair on 0.17 or newer the restart is enough; a pair still on an older protocol needs browser-attach stop, a restart and one manual extension reload. Custom pairing paths, ports and extension directories are retained, closed browser profiles update when they next connect, and an older MCP package cannot downgrade a newer Hub or installed extension.

An upgrade waits for extension cleanup and confirms the new version after reload; cleanup or reload failures are reported instead of replaying page actions. Manual reload remains available on the extension options page for recovery, and Hub and extension versions must match for page control. The default port is 47831; choose another port with setup --port when creating a pairing.

Architecture and boundaries

MCP client → Node.js stdio MCP → 127.0.0.1 Hub
                                  ↕ local pairing
                          Chrome / Edge MV3 extension
                                  ↓ chrome.debugger / CDP
                               existing HTTP(S) / authorized file:// tabs

Each MCP connection holds its own control and handles cannot be used across connections. Disconnecting or stopping debugging releases control. The client endpoint requires a Bearer key and rejects web page Origins; the extension verifies a fixed Origin, key and version. browser_evaluate can read and write data with the page's existing sign-in state; a timeout or error may already have had an effect and must not be replayed automatically. No generic CDP tool is exposed.

Logs are collected from claim time, survive navigation and are cleared on release, with bounded buffers that report data_loss on eviction. Buffered reads use the existing claim without requiring a supported or responsive current page; capture changes still require page access. Network logs store lifecycle metadata and available initiators by default; an explicit capture reads bounded, redacted headers/bodies of subsequent XHR/fetch requests without changing caches or intercepting traffic. Navigation requests and commits remain separate observations. Buffer limits and parameters: usage guide.

The extension holds debugger permission and client actions can use existing site sign-in state; only connect clients you trust. Web page content must not be treated as user authorization. The pairing key and the generated config.generated.js must not be committed or published; the packaging check rejects packages that contain that file.

Chrome / Edge HTTP(S) pages and existing ordinary file:// tabs with extension file access enabled are supported, and file access is checked during discovery, claim, operations and navigation. open_tab and fetch still accept HTTP(S) only. Browser internal pages, arbitrary extension pages, download management, network interception and Firefox / WebKit remain outside scope, and built-in PDF viewer content is browser-dependent. Native pointer input requires an unsuspended tab in a non-minimized window; an unmodified left single click may target an inactive tab, while hover, drag and other click variants require an active tab. Full limits and failure modes: usage guide.

Local development

git clone https://github.com/EvannZhongg/BrowserAttach.git
cd BrowserAttach
npm ci
npm test
npm run test:package

Run the source directly and pair the extension in the repository:

node bin/browser-attach.mjs setup --extension-dir ./extension
node bin/browser-attach.mjs mcp

Development mode deliberately uses the repository extension path. For normal installs, use setup without --extension-dir so it keeps working after the repository moves.

Real-browser tests need a Chromium / Edge executable that allows loading extensions from the command line; the path is supplied by the developer:

npm run test:live -- --executable /path/to/chromium --family chromium
npm run test:interaction -- --executable /path/to/chromium --family chromium
npm run test:interaction -- --tab-indicators --executable /path/to/chromium --family chromium
npm run test:upgrade -- --executable /path/to/chromium

These tests use temporary profiles and local fixtures. Coverage and limits: test report; implementation and design trade-offs: architecture.

Contributing

Reproducible issues via Issues, or Pull Requests. Please include Node, OS, browser and extension versions, and remove pairing keys and private page data. See CONTRIBUTING.md for the process.

Released under the MIT License.

Available Tools

24 tools
browser_batchA

Run ordered steps in one tab queue under a shared deadline; per-step timeouts cap remaining time. Prevalidates all steps, including skipped ones. Stops on failure with failed_step/prior results and isError; no rollback or automatic replay.

NameRequiredDescriptionDefault
stepsYesElement steps require selector; type uses selector XOR focused=true; press_key optionally guards focus with selector; scroll may omit target, wait follows condition. Step observe uses a fresh selector; batch observe reads at the end. No refs; coordinates only for scroll x/y. Common locators: selector_type defaults css; label=exact associated HTML label with normalized whitespace; placeholder=exact attribute; role uses selector="link", name="Claim" (exact AX name, empty allowed). nth=zero-based DOM/AX-role order. Locator options need selector; frame/frame_id exclusive. frame needs at least one of exact url/title or nested CSS iframe path (each step unique, e.g. ["#frame"]). Steps may override dialog_policy.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
start_atNoExplicitly skip a reviewed completed prefix.
tab_handleYes
timeout_msNo
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden and does so well: shared deadline semantics, per-step timeouts capping remaining budget, prevalidation of all steps, stop-on-failure returning failed_step/prior results with isError, and explicit 'no rollback or automatic replay'. It omits that steps mutate live page state and says nothing about step-count limits (maxItems 30).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler, execution model stated first followed by validation and failure semantics. Every clause carries operational meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-param tool taking a polymorphic array of up to 30 steps with no output schema, the description covers the failure-mode return shape (failed_step/prior results/isError) and execution budget model. Gaps remain around success-path return values and how tab_handle is obtained, which matter for first-time invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 67% schema coverage the description adds real value on timeout_ms ('shared deadline; per-step timeouts cap remaining time') and start_at ('prevalidates all steps, including skipped ones'), which the schema does not explain. However it says nothing about tab_handle (presumably from browser_claim_tab/browser_open_tab) or dialog_policy, leaving two parameters to the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

'Run ordered steps in one tab queue' states a specific verb and resource, and the batching nature implicitly distinguishes it from the single-action siblings (browser_click, browser_type, etc.). It never names those siblings explicitly, so the differentiation is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Behavioral rules (shared deadline, prevalidation, stop-on-failure) imply batch use for multi-step flows, but there is no explicit 'use this instead of N separate calls' or 'when not to batch'. The start_at skip path is only hinted at via 'including skipped ones'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_claim_tabB

Exclusively claim a tab_id from this connection's latest tab discovery; optional expected_url/title must match exactly.

NameRequiredDescriptionDefault
tab_idYes
browser_idYes
expected_urlNo
expected_titleNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it does disclose two real traits — that claiming is exclusive (implying a lock/ownership state change) and that expected_url/expected_title must match exactly. It omits what happens on mismatch (error vs. no-op), whether another connection's claim blocks this one, and whether the claim is released.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single densely packed sentence with the core constraint (latest discovery) and the validation rule front-loaded. No filler, though 'Exclusively claim' is compact to the point of ambiguity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter mutation-ish tool with no annotations, no output schema, and no schema descriptions, the definition is thin. It leaves unaddressed what the claim returns, what error a mismatched URL yields, and how browser_id relates to 'this connection'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% across four parameters, so the description must compensate: it explains tab_id's origin and that expected_url/expected_title are exact-match guards. browser_id is required yet never explained, and no format or value examples are given for any parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('claim') on a specific resource ('tab_id') and pins the source to 'this connection's latest tab discovery', which separates it from browser_discover (finds tabs) and browser_open_tab (creates one). The word 'exclusively' hints at an ownership/locking semantic that is not quite nailed down.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'from this connection's latest tab discovery' implies a prerequisite call to browser_discover before this tool can be used, which is useful routing. It never states when not to use it or contrasts it with browser_open_tab / browser_tab_control, and no failure preconditions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_clickB

Click exactly one ref/selector/x+y; elements auto-scroll and may recenter once before dispatch, with hit checks. Unmodified left single clicks may target inactive tabs. Native target_verified requires an element; coordinates return null and verify trusted delivery to the hit only. Native select requires select_option.

NameRequiredDescriptionDefault
xNo
yNo
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
modeNoDOM: ref/selector, left single click, no modifiers.native
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
buttonNoleft
offsetNoNative element only: ratios within its content quad; hit checks still apply.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
modifiersNo
settle_msNoAfter preparation, before dispatch: ms or uniform [min,max]; min<=max.
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
click_countNo
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.
coordinate_spaceNox+y only; document scrolls the top-level page first.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It usefully describes auto-scrolling, recentering once before dispatch, hit checks, inactive-tab targeting, and trusted-delivery verification for coordinates. But it omits behavior for many of the 20 parameters, such as `dialog_policy`, `observe`, `modifiers`, `click_count`, and `settle_ms`, leaving substantial behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the core action and target selection. Sentences are dense but most earn their place; however, the 'target_verified' sentence is jargon-heavy and could be clearer, slightly reducing readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex 20-parameter tool with no annotations and no output schema. The description covers some important behaviors but leaves major gaps around return values, dialog handling, observation semantics, modifier behavior, click_count, and frame targeting, which are needed for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 65%, in the middle range. The description adds meaningful constraints: exactly one of ref/selector/x+y, coordinates return null verification, and native select must use `select_option`. It does not explain the semantics of most other parameters (modifiers, click_count, dialog_policy, settle_ms, observe, frame nesting, coordinate_space), so it only partially compensates for the schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Click') and the three accepted target forms ('ref/selector/x+y'), and explicitly routes native select interactions to the sibling `browser_select_option`. It does not clearly differentiate from other sibling actions like `browser_hover` or `browser_drag`, so sibling differentiation is only partial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives some usage constraints (exactly one target, unmodified left single clicks may target inactive tabs, native select requires `select_option`), implying when this tool is appropriate. However, it never states when to prefer hover, drag, double-click, or other alternatives, so guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_discoverB

List connected profiles/capabilities or tabs with URL/title and control status. Tab discovery records this connection's latest observation for claim_tab.

NameRequiredDescriptionDefault
kindYes
browser_idNoRequired for kind=tabs; omit for kind=browsers.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose a valuable non-obvious side effect — that kind=tabs writes this connection's latest observation for later claim_tab use — and lists return fields, but it omits whether the listing is scoped per connection, pagination/limits, and failure behavior when no browser is connected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core listing behavior, with the claim_tab side effect placed second. Slight compression cost in the 'profiles/capabilities' phrase, but no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter discovery tool with no output schema and no annotations, the description covers the essentials (what is listed, what fields come back, the claim_tab linkage) but leaves connection scoping, listing limits, and the mandatory browser_id for kind=tabs unstated — details an agent would need to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: browser_id is documented in-schema, but kind's enum has no schema description. The description partially compensates by mapping 'profiles/capabilities' to browsers and 'tabs' to tabs, but it does not state that browser_id becomes mandatory for kind=tabs or what browser_id values look like.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb (List) and two distinct resources (connected profiles/capabilities or tabs), plus the key fields returned (URL/title, control status). It also relates itself to browser_claim_tab, giving partial sibling differentiation, though it never contrasts itself with other read siblings like browser_snapshot or browser_logs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the mention that tab discovery records the latest observation 'for claim_tab' hints at a discover-then-claim workflow, but the description never says when to choose this over alternatives or what preconditions apply (e.g. must a browser already be connected).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_dragB

Drag between endpoints, each exactly one ref/selector/x+y; destination auto-scrolls while held.

NameRequiredDescriptionDefault
modeNopointer for mouse-driven dragging; html5 for HTML drag-and-drop.pointer
stepsNo
sourceYes
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
settle_msNoAfter preparation, before dispatch: ms or uniform [min,max]; min<=max.
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
trajectoryNoOpt-in curved, variable-speed steps/intervals; curve_px is signed CSS-pixel offset. Duration covers interpolation waits only.
destinationYes
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does add one genuinely useful trait: the destination auto-scrolls while the drag is held. It says nothing about drop verification, hit-check failures, dialog handling during the drag, or what a failed drag returns, which matters for a stateful pointer operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with no filler, and the core operation is front-loaded. It is terse to the point of under-specification, but that cost is accounted for elsewhere rather than being padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, nested-object tool with no annotations and no output schema, one sentence is not enough. An agent gets no guidance on mode selection, the timeout/preparation budget, the optional post-action observation, or dialog behavior during the drag.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The phrase 'each exactly one ref/selector/x+y' encodes a mutual-exclusivity rule the schema does not express (the nested objects have no oneOf constraint), which is real added value. But it leaves 'mode', 'steps', 'trajectory', 'settle_ms', 'observe', 'dialog_policy' and 'coordinate_space' to the schema, several of which have no description at all (60% coverage).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Drag between endpoints'), and the 'source'/'destination' framing makes the operation unambiguous. No sibling is named, but no other sibling tool performs a drag, so confusion risk is low.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never says when to choose a drag over browser_click/browser_hover, nor when to pick the 'pointer' mode versus 'html5' drag-and-drop (the schema documents what each mode means but not which situation calls for it). Only the endpoint-shape constraint is given as usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_evaluateB

Evaluate expression once; call a returned function once and await its Promise, without user activation. Use an async IIFE for statements. capture_truncated marks capture loss; required_chars/next_item signal page-budget needs. cursor reads cache without re-execution.

NameRequiredDescriptionDefault
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
cursorNoExactly one of expression/cursor. Cursor reads cached JSON; omit frame/frame_id and result_type=element.
frame_idNo
max_charsNoPer-page JSON value budget, excluding metadata; capture cap 1M chars / 50000 nodes / depth 8.
expressionNo
tab_handleYes
timeout_msNo
result_typeNoelement: return one connected DOM element as a ref.json
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and it does disclose real behavior: it runs without user activation, awaits a returned Promise, and reports capture loss via capture_truncated. It does not say whether the expression can mutate page state or whether the tool is read-only, which is the most important unknown for an arbitrary-code tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core execution contract is front-loaded in the first sentence, and the following sentences each add a distinct fact (IIFE pattern, truncation signals, cursor reuse). It is dense but no sentence is pure filler; the jargon terms are only lightly defined.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no annotations and no output schema, the description helpfully names three return-side fields (capture_truncated, required_chars, next_item) that would otherwise be invisible. But it omits dialog_policy behavior, result_type=element semantics, and frame targeting that the schema only partly documents.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 56% across 9 parameters. The description adds meaning for expression, cursor (cache read, no re-execution) and the page-budget mechanic that governs max_chars, but leaves tab_handle, frame/frame_id, timeout_ms, result_type, and dialog_policy unaddressed. Partial compensation, not full.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening clause 'Evaluate expression once' names a specific verb (evaluate) and resource (a page expression), which no sibling tool duplicates. It also states the execution contract (call a returned function once, await its Promise). It stops short of naming when to prefer it over browser_snapshot or browser_read_text, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use an async IIFE for statements' and 'cursor reads cache without re-execution' give concrete usage hints for two scenarios. However, there is no guidance on when to reach for this tool instead of the sibling read tools (browser_read_text, browser_snapshot), and no statement of when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_fetchA

Read a URL's main document using the profile's sign-in in a temporary background tab, then close it. Site scripts run and may affect other tabs. status/ok describe HTTP only (unknown=null); readiness/degradation are separate. body is a string. next_cursor reads immutable cache without revisiting; up to 4 captures per connection/profile.

NameRequiredDescriptionDefault
urlNoHTTP(S), no URL credentials; required unless cursor is supplied.
cursorNoContinuation accepts only browser_id, cursor and max_chars.
formatNoDefault rendered text; html=current DOM (dom=rendered); json=validated JSON.
max_charsNoText/HTML page budget; capture_truncated marks source loss. JSON returns whole, ignores this budget, errors above 1M chars.
browser_idYes
timeout_msNoDefault 15000; total including creation/cleanup, reserving capture time after unmet waits.
wait_untilNoDefault load; network_idle waits for load then 500ms without observed requests. Unmet waits return a degraded capture if readable.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the temporary tab that is closed, the side effect that site scripts may affect other tabs, the distinction between HTTP status and readiness/degradation, and the capture limit. It omits auth-failure or error behavior detail, so it is not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and every subsequent sentence carries distinct information. The telegraphic style ('status/ok describe HTTP only') is dense but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must explain returns; it covers status/ok, readiness/degradation, body-as-string, and cursor semantics but does not describe the overall response shape or error outcomes. Adequate but with clear gaps for a 7-parameter fetch tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 86%, so the baseline is 3; the description earns a bump by explaining that next_cursor reads an immutable cache without revisiting and that body is a string, adding meaning beyond the schema's cursor and max_chars descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Read a URL's main document') and adds the mechanism ('temporary background tab') plus profile sign-in, which distinguishes it from a plain navigation tool. It stops short of naming a sibling such as browser_navigate or browser_read_text for contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the mechanics: it fetches a main document with the profile's credentials and returns text/html/json, and the cursor sentence implies pagination continuation. There is no explicit when-to-use/when-not guidance and no named alternative among the many browser_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_fillA

Replace one ref/selector input/textarea/contenteditable and verify retained text. Known Monaco/CM5 proxy textareas are rejected before focus/writes. verification_basis identifies the expectation; verification_source identifies DOM value, selected text or innerText. Native contenteditable readback temporarily selects/reads plain text, then restores selection. CR/CRLF count as LF; requested spaces may retain NBSP. No editor model write, paste, blur or dropdown commit.

NameRequiredDescriptionDefault
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
modeNonative: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.native
nameNorole only: exact AX name; empty allowed.
textYes
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.
expected_valueNoExpected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers substantial behavioral detail: proxy textareas are rejected before focus, native contenteditable readback temporarily selects and restores selection (a real side effect), CR/CRLF collapse to LF, and spaces may retain NBSP. The scoring drag is that it references 'verification_basis' and 'verification_source' as concepts the caller supposedly sets, yet no such parameters exist in the schema, which is a mild misleading signal about how the write is configured.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action is correctly front-loaded in the first sentence, but the passage is dense with unexplained jargon (Monaco/CM5, NBSP, ref) and one sentence is spent on verification_basis/verification_source, which map to no schema property. That sentence does not earn its place and inflates the description's cognitive load.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter tool with nested objects, no annotations, and no output schema, the description covers the core write-and-verify contract plus normalization edge cases, which is a reasonable foundation. It leaves the observe block, dialog_policy, frame targeting, and time budgeting entirely undocumented at the description level, and its dangling verification_* references create an inconsistency an agent must resolve by reading the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 79%, just below the high-coverage baseline, so the description should compensate somewhat and mostly does not. It adds normalization semantics relevant to text/expected_value (CR/LF collapse, NBSP retention, default expectation) but says nothing about mode, observe, dialog_policy, frame/frame_id, timeout_ms, or nth — all left entirely to the schema. Worse, the verification_basis/verification_source sentence describes behavior for parameters that do not exist in the input schema, adding confusion rather than meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first clause states a specific verb and resource set: 'Replace one ref/selector input/textarea/contenteditable and verify retained text.' An agent can tell this writes text into a form control and verifies it, which implicitly separates it from browser_type (key-by-key) and browser_select_option. However, it never names a sibling or explicitly scopes the difference, leaving the distinction (insert without character keydown) to be inferred from the trailing negation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied through negatives: 'No editor model write, paste, blur or dropdown commit' and rejection of Monaco/CM5 proxy textareas tell the agent what this tool does NOT cover, but there is no positive statement of when to choose browser_fill over browser_type, browser_select_option, or browser_press_key. The reader must reconstruct the decision boundary from sibling names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_handle_dialogC

Accept/dismiss a JS dialog and return its original details and accepted.

NameRequiredDescriptionDefault
acceptYes
tab_handleYes
prompt_textNoResponse sent to the website for a prompt dialog.

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral-disclosure burden. It says the tool accepts/dismisses and returns original details, but does not explain side effects, blocking behavior, failure modes, or interaction with prompt dialogs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted text. However, the phrase 'return its original details and accepted' is slightly awkward and could be clearer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an unannotated browser-automation mutation tool with three parameters, no output schema, and low schema coverage, the description is too thin. It does not describe return shape, tab targeting, prompt handling, or expected dialog states.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, and the description does little to compensate. It implies the accept/dismiss choice but does not explain tab_handle or clarify when prompt_text is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: accept/dismiss a JS dialog. It is clear enough to distinguish the tool from most browser siblings, though it does not explicitly contrast with alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to call this tool, what prerequisite state must exist, or how it relates to sibling tools. The agent must infer that a JS dialog must already be open.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_hoverA

Move to exactly one ref/selector/x+y, verify trusted mousemove, and leave the pointer there without clicking.

NameRequiredDescriptionDefault
xNo
yNo
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
offsetNoNative element only: ratios within its content quad; hit checks still apply.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.
coordinate_spaceNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that it verifies a trusted mousemove and leaves the pointer in place without clicking, but it says nothing about scrolling into view, hit-test failures, dialog handling, or what the 'observe' option does behaviorally.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. Every clause adds a distinct fact: target mode, verification, pointer final state, and no click.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with nested objects, no annotations, and no output schema, the description is thin. The schema documents many individual parameters, but the description leaves important features like observe, dialog_policy, timeout behavior, and frame targeting entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 67% of parameters, but the description adds a crucial semantic the schema does not express: exactly one of ref, selector, or x+y must identify the target. That mutual-exclusion rule is high-value parameter guidance beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: move the pointer to one target, verify a trusted mousemove, and leave it there without clicking. This distinguishes it from browser_click and browser_drag by the explicit 'without clicking' clause, though it never names those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'exactly one ref/selector/x+y' constraint gives targeting guidance, and 'without clicking' implies the tool is for hover-state inspection rather than activation. However, it never states when to use this instead of browser_click or browser_drag, nor any prerequisite or exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_logsA

Read buffered console, network or navigation events since claim, even if the page is blank or unresponsive. Capture changes require a supported page. Continue next_seq as after_seq for the same claim/kind; restart at 0 when changing filters. data_loss reports eviction.

NameRequiredDescriptionDefault
kindYes
levelNoOnly valid for kind=console.
limitNo
captureNoNetwork only: opt in before XHR/fetch for bounded headers/bodies, with credential headers and named secrets redacted; unavailable bodies are explicit.
after_seqNo
max_charsNo
tab_handleYes
url_containsNoOnly valid for kind=network.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden and does substantive work: it discloses that reads succeed on blank/unresponsive pages, that capture requires a supported page, that credential headers and named secrets are redacted, and that eviction is surfaced via data_loss. It never explicitly states the call is side-effect-free or describes rate/size limits beyond the schema's bounds.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with what the tool reads and its key robustness property. The main cost is over-compression: 'Capture changes require a supported page' is too terse to be actionable without defining 'supported page'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with a nested object, no annotations, and no output schema, the description covers pagination and data-loss signaling but omits what the response contains (how next_seq and data_loss are returned) and leaves several filter parameters unexplained. It is adequate rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at only 38%, the description must compensate, and it partially does by explaining after_seq continuation semantics and capture's page-support prerequisite. But level, limit, max_chars, url_contains (already in schema), and tab_handle get no added meaning, and the interaction between limit and max_chars/eviction is unstated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (Read) and a precise resource (buffered console, network or navigation events) with an explicit temporal scope (since claim). It is clearly distinct from mutation siblings like browser_click or browser_navigate, though it doesn't name an alternative read tool such as browser_read_text or browser_snapshot to sharpen the line.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Even if the page is blank or unresponsive' gives a useful condition for when this tool still works, and the after_seq/restart-at-0 sentence tells the agent how to continue vs. re-filter. However, there is no guidance on when NOT to use it or which sibling (browser_read_text, browser_snapshot, browser_evaluate) to prefer for other read needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_navigateB

Navigate a claimed tab to an HTTP(S)/file URL or history entry and optionally return a fresh snapshot; also recovers a claimed tab currently at about:blank. File destinations require extension file access. Snapshot observation has a separate deadline; observation_error does not mean navigation failed.

NameRequiredDescriptionDefault
urlNoProvide exactly one of url or direction.
directionNo
tab_handleYes
timeout_msNo
wait_untilNodomcontentloaded
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
include_snapshotNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description does provide useful behavioral context: snapshot observation has a separate deadline and observation_error does not mean navigation failed. It still omits timeout behavior, dialog handling implications, and what the navigation result contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the primary action, then adds important caveats about file access and snapshot observation. No sentence is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter navigation tool with no annotations and no output schema, the description is not complete enough. It covers the main action and one error nuance, but most parameter behavior and the return/result shape remain unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 29%, so the description must compensate but does not. It clarifies URL versus history-entry intent and file-access requirements, but leaves tab_handle, timeout_ms, wait_until, and most dialog_policy semantics undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: navigate a claimed tab to an HTTP(S)/file URL or history entry, optionally return a snapshot, and recover an about:blank tab. It is clear what the tool does, but it does not explicitly distinguish itself from siblings such as browser_open_tab or browser_fetch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage through 'claimed tab', 'history entry', and recovery from about:blank, and notes that file destinations require extension file access. However, it gives no explicit guidance on when to use this versus browser_open_tab, browser_fetch, or browser_click.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_open_tabB

Create a new HTTP(S) tab in the selected profile even if the URL is already open. claim=true also acquires a tab_handle without tab discovery; it does not wait for page load. A claim failure leaves the tab open and reports its identity in error.open_tab; never automatically repeat creation.

NameRequiredDescriptionDefault
urlYes
claimNo
activeNo
browser_idYes

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full load and delivers real behavioral facts: it does not wait for page load, a failed claim leaves the tab open, the tab identity is surfaced in error.open_tab, and creation must not be auto-retried. It omits what a successful call returns (handle vs id) and any auth/permission requirements, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core behavior and then the claim semantics and failure caveat. Every clause carries information; the density is high but the ordering is sensible rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations mean the description is the only source of truth, and it does well on side effects and failure modes. It is still incomplete for a 4-parameter tool: 'active' is unexplained and the successful return value/handle semantics are never stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% across 4 parameters, so the description must compensate and only covers one: 'claim'. It never explains 'active' (activation/foreground semantics), 'browser_id' (profile selection), or the URL format beyond HTTP(S). Three of four parameters remain semantically opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource ('Create a new HTTP(S) tab in the selected profile') and adds a distinguishing scope note ('even if the URL is already open'), which separates it from a plain navigate. It never names the sibling it replaces (browser_navigate, browser_claim_tab, browser_tab_control), so full differentiation still requires the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Guidance is implied through behavior: 'claim=true also acquires a tab_handle without tab discovery' implicitly points at browser_discover/browser_claim_tab as the alternative path, and 'never automatically repeat creation' constrains retry behavior. There is no explicit statement of when to prefer this over browser_navigate or browser_tab_control, so the agent must infer the routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_press_keyA

Send a native key/chord to current focus and report its trusted keydown target. Optional ref/selector guards focus without focusing it; a mismatch before dispatch sends no key. Supports F1–F12, navigation/editing keys and US ASCII punctuation.

NameRequiredDescriptionDefault
keyYes
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it does disclose useful behavior — trusted native events, reporting the keydown target, and the fail-safe of sending no key on a pre-dispatch guard mismatch. However, it omits the chord syntax (how modifiers are expressed), what happens on failure (error vs silent), and how dialog_policy interacts with the dispatch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact clauses with the core action front-loaded and the guard semantics second. Dense but every sentence contributes; only mild jargon ('trusted keydown target') costs a little clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with a nested observe object and no output schema, the description covers the primary key dispatch and guard behavior but says nothing about the observe block, timeout budget, or dialog handling. The return value is only loosely gestured at ('report its trusted keydown target').

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the baseline is 3, but the description adds real value: the `key` parameter has no schema description, yet the text specifies supported ranges (F1–F12, navigation/editing keys, US ASCII punctuation), and it explains the semantics of the otherwise-undescribed ref/selector guard. The nested observe/timeout/dialog_policy parameters remain unaddressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Send a native key/chord to current focus' and adds that it reports the trusted keydown target. This clearly separates it from text-entry siblings like browser_type/browser_fill, though it never names those alternatives explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'Optional ref/selector guards focus without focusing it; a mismatch before dispatch sends no key' explains how the guards behave but not when an agent should reach for this tool instead of browser_type or browser_click. There is no explicit when-to-use/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_read_controlA

Read one explicit control: separate native DOM/AX values, rendered text and state; related popups, active descendant and currently exposed options in AX order. Bounded refs preserve the existing snapshot. No library-specific inference, complete virtual list, application commit or atomic DOM/AX view.

NameRequiredDescriptionDefault
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
max_charsNo
tab_handleYes
timeout_msNo
max_optionsNo
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.
popup_selectorNoOptional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden and does substantial work: it discloses that DOM and AX values are reported separately (i.e., non-atomic), that refs are bounded to preserve an existing snapshot, and it explicitly disclaims library-specific inference, complete virtual lists, application commit and atomic DOM/AX views. It stops short of stating read-only safety, permissions, or error behavior, but the limitation disclosure is genuinely informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core verb and resource, and most clauses carry information. However, the trailing negation string ('No library-specific inference, complete virtual list, application commit or atomic DOM/AX view') is a compressed list whose meaning is hard to parse and partly ambiguous, costing clarity for brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with nested frame objects and no output schema, the description does explain the shape of what comes back (DOM/AX values, text, state, popups, options), which is necessary. But with no annotations and only 58% schema coverage, the remaining parameters and any error/timeout semantics go unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 58%, so several parameters (ref, tab_handle, max_chars, timeout_ms, frame_id) are undocumented in either place. The description only obliquely maps to parameters — 'bounded refs' to ref, 'currently exposed options' to max_options, 'related popups' to popup_selector, 'AX order' to nth — so it adds marginal semantics rather than compensating for the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Read one explicit control') and enumerates what is returned: native DOM/AX values, rendered text, state, related popups, active descendant and exposed options. The closing clause implicitly contrasts it with broader reads (full snapshots, atomic DOM/AX views), so it is distinguishable from siblings, though the AX/DOM jargon makes the scope harder to grasp than it needs to be.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Bounded refs preserve the existing snapshot' hints at when this is preferable to a full snapshot, and the negation list implies when not to rely on it. But no sibling is named (browser_snapshot, browser_read_text) and there is no explicit 'use this when…' statement, leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_read_textA

Read page/frame text. Visible text excludes input/textarea values; use value for one field or snapshot profile=fields for forms. complete_source is source coverage, not pagination; next_offset continues live text, which may change.

NameRequiredDescriptionDefault
nthNoSelector only: zero-based DOM index, AX tree order for role.
modeNovalue: DOM field text; editor: exposed Monaco/CM5 model, otherwise error with evaluate guidance. Both require selector. Virtualized editor DOM/proxy values are not model text.visible
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
offsetNo
frame_idNo
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
max_charsNo
tab_handleYes
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full load and does disclose non-obvious behavior: visible text excludes input/textarea values, and continued reads return 'live text, which may change' rather than a stable snapshot. It omits access/auth expectations and error behavior for the editor/value modes beyond what the schema already states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, front-loaded with the core action before the caveats. Slightly dense: 'complete_source' and 'next_offset' are introduced without ever being identified as return fields, which costs a little clarity for the space they occupy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A 10-parameter tool with a nested frame object, no output schema, and no annotations needs the description to do more. It never explains the offset/max_chars pagination contract, how selector_type interacts with mode, or what the response contains, leaving the highest-complexity parts of the definition undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, so several parameters (offset, max_chars, tab_handle, frame_id, nth) rely on the schema alone. The description reinforces mode='value' and mentions complete_source/next_offset, but neither appears in the input schema, so the added parameter meaning is partial rather than compensatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (read page/frame text) and scopes it to the visible-text mode by default, which tells an agent what kind of extraction this is. It does not name a sibling to disambiguate against, so an agent still has to infer why it should not use browser_snapshot or browser_evaluate instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is real routing guidance — 'use value for one field or snapshot profile=fields for forms' points at a mode and a different tool. However, there is no explicit when-not-to-use statement versus the other read surfaces (browser_snapshot, browser_evaluate, browser_fetch), and the pagination advice is phrased in terms an agent cannot map to a parameter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_screenshotA

Capture viewport, full_page or one ref/selector element as PNG with image-to-viewport CSS mapping. Element/full_page are exclusive; locator options need selector. Full-page points may need scrolling before input. If background rendering stalls, explicitly activate or use AX/text.

NameRequiredDescriptionDefault
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
full_pageNo
tab_handleYes
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.
include_indicatorsNoInclude transient click feedback.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden, and it does disclose non-obvious behavior: output is a PNG with image-to-viewport CSS coordinate mapping, full-page capture may require scrolling before further input, and background rendering can stall. It omits whether the image is returned inline or as a handle/resource, which matters for a no-output-schema tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly packed sentences, mode and constraint information front-loaded, with no filler. Some phrasing is telegraphic ('image-to-viewport CSS mapping', 'Full-page points') and costs a re-read, which keeps it below top marks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with a nested frame object, no annotations and no output schema, the description covers modes and constraints but leaves major gaps: where 'ref' values originate, what the nested frame selector does versus frame_id, and how the PNG is delivered. An agent could still invoke it, but not confidently in frame or element-targeting scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 70% schema coverage the description contributes real semantics that the schema cannot express: the mutual exclusivity of full_page and element capture, and the rule that locator options (ref/name/nth/frame_id) require selector. Undocumented parameters such as ref and tab_handle are not explained, and the meaning of 'ref' (presumably from browser_snapshot) is left to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Capture ... as PNG') and enumerates the three capture modes (viewport, full_page, single ref/selector element), which is far more than a restatement of the name. It only implicitly separates itself from visual/text siblings via the 'use AX/text' fallback, and never names browser_snapshot or browser_read_text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete selection rules: element vs full_page are exclusive, locator options require selector, and stalled background rendering should be handled by activating the tab or switching to AX/text. It lacks an explicit 'use this when you need visual confirmation' framing, but the exclusions and fallback path are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_scrollA

Scroll one ref/selector container or viewport x/y (default center). DOM emits no wheel events; wheel sends native wheel input. until returns a fresh ref. Stopped searches report stop_reason, scroll_pending and confirmed progress; a boundary/miss does not prove end of data.

NameRequiredDescriptionDefault
xNo
yNo
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
modeNodom
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
untilNoDOM-only search of visible elements' textContent; selector is a CSS filter within the container.
delta_xNo
delta_yNoVertical delta, positive down; required without until.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
max_stepsNo
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and discloses several non-obvious traits: DOM mode emits no wheel events, wheel mode sends native wheel input, stopped searches report stop_reason/scroll_pending/progress, and a boundary/miss does not prove end of data. It does not cover permission requirements or side effects such as lazy-loading triggered by scrolling, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core operation, then adds mode and search behavior without filler. Every sentence provides actionable information, even though the semicolon-heavy style is dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter tool with nested objects, no annotations, and no output schema, the description covers the central scroll action, mode distinction, until/search behavior, and partial return reporting. It omits important context for parameters like observe, frame, selector_type, dialog_policy, max_steps, and timeout_ms, so it is adequate but incomplete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 61%, so the schema already documents a substantial portion of the 18 parameters. The description adds meaning for core behavior: x/y default to center, mode affects whether events are emitted, and until returns a fresh ref. It does not explain many other parameters such as observe, frame, selector_type, max_steps, timeout_ms, or delta handling, leaving a significant parameter-semantics gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and target: 'Scroll one ref/selector container or viewport x/y (default center).' It also distinguishes DOM versus wheel scrolling behavior. It does not explicitly differentiate this tool from sibling alternatives such as browser_press_key or browser_wait, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives useful implied guidance by explaining the two mode behaviors ('DOM emits no wheel events; wheel sends native wheel input') and that 'until returns a fresh ref.' However, it does not explicitly say when to use browser_scroll rather than browser_press_key, browser_wait, or other siblings, nor does it state exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_select_optionA

Set an option on one ref/selector HTML select, including hidden selects, via synthetic input/change (events_trusted=false). Disabled/inert targets fail. Verifies retained selection only.

NameRequiredDescriptionDefault
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
indexNo
labelNo
valueNoExactly one value/label/index; strings match exactly, index is zero-based.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the load and does disclose key traits: events are synthetic and untrusted (events_trusted=false), hidden selects are supported, disabled/inert targets fail, and it verifies only retained selection rather than an expected value. It omits what is returned and how failures are surfaced, but the disclosed behavior is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the action and target, followed by constraints. No filler. Slightly terse in the verification clause, which is ambiguous, but the size is appropriate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A 14-parameter tool with nested objects, no output schema, and no annotations needs more than this. The rich schema covers targeting, but the description does not say what the tool returns, whether an expected option can be asserted, or how the observe parameter relates to the result, leaving an agent to infer the outcome contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 71%, so the schema documents most parameters. The description adds that the target is 'one' select addressed by ref or selector, but says nothing about how the option is identified (value/label/index) or how observe/timeout/dialog_policy interact with delivery — those are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: set an option on one ref/selector HTML select. It adds scope detail (hidden selects supported, synthetic input/change) that makes the operation concrete. It does not name a sibling to distinguish from, e.g. browser_fill/browser_click, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides useful preconditions (disabled/inert targets fail) and notes hidden selects are handled, which implies 'use this when a <select> exists'. However, there is no explicit guidance on when to prefer this over browser_click or browser_fill, or on what to do if selection fails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_snapshotB

Read AX with refs, or profile=fields for DOM/AX field facts, labels, context and native values. Popup/controls/owns facts are browser-observed, not inferred ownership. New observations replace refs and retry one document/context race within 30s; next_cursor continues the captured view.

NameRequiredDescriptionDefault
textNoDefault true; false hides prose, preserving control names and values.
queryNoCase-insensitive literal substring of names, values or nearby context. fields also searches HTML labels, DOM id/name/placeholder and selected options. Zero matches is not an error.
cursorNo
profileNoDefault full; interactive keeps controls/ancestors; fields returns separate DOM/AX values in a fields array.
verboseNoInclude viewport and snapshot_id.
max_charsNo
max_nodesNo
tab_handleYes
text_limitNoProse preview length, marked with …; control names/values stay complete. Default 80 for interactive, unlimited for full.
include_hiddenNofields only, default false: include native fields omitted from AX; ref may be null. Password values omitted.

TDQS

B3.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does real work: it discloses that new observations REPLACE existing refs (a critical staleness/invalidations warning), that it retries exactly one document/context race within 30s, that next_cursor resumes the captured view, and that popup/controls/owns facts are browser-observed rather than inferred. It stops short of describing the response envelope or how truncation via max_chars/max_nodes affects the ref set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with the primary purpose front-loaded and no filler; the replacement/retry sentence in particular earns its place. Density tips into jargon-heavy shorthand ('AX', 'owns facts'), which slightly reduces first-read legibility, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, annotation-free tool with no output schema, the description covers the behavioral semantics well but leaves gaps an agent needs: what a returned 'ref' looks like, what happens to refs when max_nodes truncates the tree, and how tab_handle is obtained. Adequate, not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, so the baseline is 3. The description reinforces profile=fields semantics and adds the next_cursor continuation behavior and the 30s race retry, but max_chars, max_nodes, cursor, tab_handle and include_hidden receive no treatment beyond the schema, and the interplay of truncation with ref validity is unaddressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

It names a specific verb and resource ("Read AX with refs") and distinguishes two output modes via profile=fields, so an agent can tell it is a page-structure snapshot rather than a text dump. However, 'AX' is never expanded and nothing separates it from siblings like browser_read_text, browser_discover or browser_screenshot, so the agent must already know the domain vocabulary to place it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what each mode returns but never says when to choose this tool over browser_read_text, browser_discover, browser_screenshot or browser_evaluate — the most likely alternatives in a 23-tool set. There are no preconditions, no exclusions, and no decision rule beyond the mode labels already present in the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_tab_controlA

Release control and leave the page open, activate the tab, or close it (may discard unsaved state). Release/close invalidate tab_handle.

NameRequiredDescriptionDefault
actionYes
tab_handleYes
focus_windowNoactivate only; default true. False selects the tab without focusing its window.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full load and does disclose two real behavioral traits: close 'may discard unsaved state' and both release and close 'invalidate tab_handle'. That is meaningful side-effect and lifecycle disclosure. It stops short of saying whether the handle stays valid after activate or what the call returns, so it is strong but not complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence that front-loads the action set and appends the two critical caveats (data loss and handle invalidation). No filler, no restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter, annotation-free, no-output-schema tool, the description covers the action semantics and the two hazardous side effects that an agent most needs before calling. Minor gaps remain around what activate returns and whether errors occur on a stale handle, but nothing critical to correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33%, with focus_window the only documented parameter, so the description must compensate — and it largely does by defining the three action enum values and their consequences (release leaves the page open, close may discard state, release/close invalidate the handle). tab_handle is only implicitly characterized via the invalidation note, which is the remaining gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (the browser tab handle's control state) and enumerates the three operations it performs: release, activate, close. It is clearly distinguishable from siblings like browser_click or browser_snapshot, though it never explicitly contrasts itself with browser_claim_tab or browser_open_tab, which are the nearest neighbors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Release control and leave the page open' implies this is the counterpart to claiming a tab, giving an implied when-to-use for one of the three actions. However, there is no explicit guidance on when to prefer release over close, nor on how this relates to browser_claim_tab or browser_open_tab, leaving selection partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_typeA

Type printable characters with trusted keys without clearing. Choose exactly one ref/selector/focused=true; stop on focus loss/detachment. Enter/Tab use press_key; ordinary multiline replacement uses fill.

NameRequiredDescriptionDefault
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
nameNorole only: exact AX name; empty allowed.
textYes
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
focusedNoPin current editable focus without refocusing; exclusive with ref/selector and locator options.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
delay_msNoBetween characters: ms or independent uniform [min,max]; min<=max.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose non-obvious traits: it appends rather than replacing text, uses trusted key events (not synthetic value assignment), and stops on focus loss or detachment — i.e. partial input is possible. It stops short of saying what constitutes success/failure or how much text landed when aborted, which matters for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences with essentially zero waste: scope, target selection, then sibling routing. It is compressed to the edge of cryptic ("focused=true" as a clause fragment) and would benefit from one clause on outcome, but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter tool with nested objects, no annotations, and no output schema, the description covers only targeting and sibling selection. It says nothing about the return value, how timeout_ms/delay_ms affect the write, or how dialog_policy interacts with typing — an agent must infer all of that from the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 79%, so the baseline is 3; the description adds a genuine constraint the schema does not encode — the exclusive-one-of rule across ref/selector/focused. It adds nothing for frame, delay_ms, observe, or dialog_policy, but those already carry schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (type) plus the precise semantics: printable characters, trusted key events, no clearing of existing content. It explicitly distinguishes itself from two siblings, press_key and fill, by naming the exact cases those handle. An agent can identify this tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names both competing alternatives with selecting conditions (Enter/Tab -> press_key; ordinary multiline replacement -> fill) and states the mutual-exclusion rule for the target options (exactly one of ref/selector/focused=true). Nothing about tool choice or target specification is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_upload_fileA

Set browser-host absolute file paths on one file-input/label ref/selector, or omit target for the pending chooser. [] clears/cancels; multiple files need a multiple input; directories unsupported. assignment_acknowledged confirms the command, not event delivery/upload. count_verified compares retained FileList count (null if unreadable); mismatch is not assignment failure. Observe before uploading again.

NameRequiredDescriptionDefault
nthNoSelector only: zero-based DOM index, AX tree order for role.
refNo
nameNorole only: exact AX name; empty allowed.
filesYes
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
observeNoRead this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.
frame_idNoSelector frame; default main.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
tab_handleYes
timeout_msNoTotal preparation/dispatch/verification and optional observation budget.
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does substantial work: it distinguishes assignment_acknowledged from event delivery and from actual upload, and explains that count_verified compares the retained FileList and that a mismatch is not an assignment failure. Still missing: whether paths must exist/be readable by the host, and what happens on timeout or failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action, then the target-omission case, then constraints and result-interpretation. Every clause carries information, but the ack/count_verified sentences are compressed into telegraphic fragments that take a second read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, nested-object mutation tool with no annotations and no output schema, the description covers the essential semantics: targeting, clearing, multi-file eligibility, and how to interpret the acknowledgement and verification fields. Remaining gaps (error/timeout behavior, path validity preconditions) are secondary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, and the description adds semantics the schema does not: files must be host-absolute paths, [] means clear/cancel, >1 file needs a multiple input, directories are rejected, and the target trio (ref/selector/omit) maps to specific behaviors. It says nothing about nth, name, frame/frame_id, timeout_ms or dialog_policy, leaving those to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: set browser-host absolute file paths on one file-input/label ref/selector, or on the pending chooser. That is unambiguous and clearly distinct from browser_click/browser_fill/browser_type siblings, though it never names those siblings to sharpen the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete situational rules: omit target for the pending chooser, pass [] to clear/cancel, multiple files require a multiple input, directories unsupported, and 'observe before uploading again'. It stops short of stating the upstream trigger (e.g. that the chooser must first be opened by a click) or naming an alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_waitA

Read-only wait for condition. State uses native properties/ARIA; missing state is unavailable, not false. Role absence need not mean DOM removal. Prefer a result/status container for text; compares full text, reports a bounded preview with length/truncation. Timeout reports last state; field values are omitted.

NameRequiredDescriptionDefault
nthNoSelector only: zero-based DOM index, AX tree order for role.
nameNorole only: exact AX name; empty allowed.
frameNoChild frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id.
idle_msNonetwork_idle quiet interval.
expectedNoRequired for url (substring), value (exact), checked/selected/expanded (boolean; checked also "mixed"). text: expected substring XOR previous. Omit otherwise.
frame_idNo
previousNotext only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion.
selectorNoQuery by selector_type; role example: selector="link", name="Claim".
conditionYesElement conditions require selector; url/network_idle forbid locator fields.
tab_handleYes
timeout_msNo
dialog_policyNoaccept/dismiss auto-handle dialogs and return their messages.ask
selector_typeNoDefault css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden well: it declares read-only behavior, explains missing state semantics, warns about role absence not implying DOM removal, and describes text comparison, preview truncation, and timeout reporting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by dense but relevant behavioral caveats. Every sentence contributes to correct invocation or interpretation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter tool with no output schema and no annotations, the description covers important caveats but still leaves gaps around normal success return values and how different condition outcomes are reported. It is adequate but not fully complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 77%, so the schema already documents most parameters. The description adds useful behavioral context around text comparison and timeout results, but does not significantly enrich parameter usage beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Read-only wait for condition.' This clearly distinguishes browser_wait from action-oriented siblings such as browser_click or browser_fill, though it does not explicitly mention alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives useful implied guidance, such as preferring a result/status container for text, but does not explicitly state when to use browser_wait instead of browser_read_text, browser_snapshot, or polling via browser_evaluate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.28.2
    • Changedbrowser_batch5 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / start_at / maximum
        Previous value: -19New value: +29
      • changedInput schema / properties / steps / description
        Previous value: -"Element steps require selector; type uses selector XOR focused=true; scroll may omit target, wait follows condition. No refs; coordinates only for scroll x/y. Common locators: selector_type defaults css; label=exact associated HTML label with normalized whitespace; placeholder=exact attribute; role uses selector=\"link\", name=\"Claim\" (exact AX name, empty allowed). nth=zero-based DOM/AX-role order. Locator options need selector; frame/frame_id exclusive. frame needs at least one of exact url/title or nested CSS iframe path (each step unique, e.g. [\"#frame\"]). Steps may override dialog_policy."New value: +"Element steps require selector; type uses selector XOR focused=true; press_key optionally guards focus with selector; scroll may omit target, wait follows condition. Step observe uses a fresh selector; batch observe reads at the end. No refs; coordinates only for scroll x/y. Common locators: selector_type defaults css; label=exact associated HTML label with normalized whitespace; placeholder=exact attribute; role uses selector=\"link\", name=\"Claim\" (exact AX name, empty allowed). nth=zero-based DOM/AX-role order. Locator options need selector; frame/frame_id exclusive. frame needs at least one of exact url/title or nested CSS iframe path (each step unique, e.g. [\"#frame\"]). Steps may override dialog_policy."
      • changedInput schema / properties / steps / items / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "click",
        -        "type": "string"
        -      },
        -      "button": {
        -        "default": "left",
        -        "enum": [
        -          "left",
        -          "middle",
        -          "right"
        -        ],
        -        "type": "string"
        -      },
        -      "click_count": {
        -        "anyOf": [
        -          {
        -            "const": 1,
        -            "type": "number"
        -          },
        -          {
        -            "const": 2,
        -            "type": "number"
        -          }
        -        ],
        -        "default": 1
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "default": "native",
        -        "description": "DOM: left single click, no modifiers.",
        -        "enum": [
        -          "native",
        -          "dom"
        -        ],
        -        "type": "string"
        -      },
        -      "modifiers": {
        -        "default": [],
        -        "items": {
        -          "enum": [
        -            "Alt",
        -            "Control",
        -            "Meta",
        -            "Shift"
        -          ],
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "offset": {
        -        "additionalProperties": false,
        -        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        -        "properties": {
        -          "x_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "y_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x_ratio",
        -          "y_ratio"
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "settle_ms": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "additionalItems": false,
        -            "items": [
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              }
        -            ],
        -            "maxItems": 2,
        -            "minItems": 2,
        -            "type": "array"
        -          }
        -        ],
        -        "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max."
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "fill",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "expected_value": {
        -        "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.",
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "default": "native",
        -        "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.",
        -        "enum": [
        -          "native",
        -          "dom"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "type",
        -        "type": "string"
        -      },
        -      "delay_ms": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "additionalItems": false,
        -            "items": [
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              }
        -            ],
        -            "maxItems": 2,
        -            "minItems": 2,
        -            "type": "array"
        -          }
        -        ],
        -        "default": 0,
        -        "description": "Between characters: ms or independent uniform [min,max]; min<=max."
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "focused": {
        -        "const": true,
        -        "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.",
        -        "type": "boolean"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "hover",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "offset": {
        -        "additionalProperties": false,
        -        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        -        "properties": {
        -          "x_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "y_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x_ratio",
        -          "y_ratio"
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "select_option",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "index": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "label": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "value": {
        -        "description": "Exactly one value/label/index; strings match exactly, index is zero-based.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "scroll",
        -        "type": "string"
        -      },
        -      "delta_x": {
        -        "default": 0,
        -        "type": "number"
        -      },
        -      "delta_y": {
        -        "description": "Vertical delta, positive down; required without until.",
        -        "type": "number"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "max_steps": {
        -        "default": 100,
        -        "maximum": 500,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "mode": {
        -        "default": "dom",
        -        "enum": [
        -          "dom",
        -          "wheel"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "until": {
        -        "additionalProperties": false,
        -        "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.",
        -        "properties": {
        -          "selector": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "text": {
        -            "maxLength": 2000,
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "text"
        -        ],
        -        "type": "object"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "wait",
        -        "type": "string"
        -      },
        -      "condition": {
        -        "description": "Element conditions require selector; url/network_idle forbid locator fields.",
        -        "enum": [
        -          "attached",
        -          "absent",
        -          "visible",
        -          "actionable",
        -          "text",
        -          "value",
        -          "checked",
        -          "selected",
        -          "expanded",
        -          "url",
        -          "network_idle"
        -        ],
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "expected": {
        -        "anyOf": [
        -          {
        -            "maxLength": 100000,
        -            "type": "string"
        -          },
        -          {
        -            "type": "boolean"
        -          }
        -        ],
        -        "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise."
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "idle_ms": {
        -        "default": 500,
        -        "description": "network_idle quiet interval.",
        -        "maximum": 10000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "previous": {
        -        "description": "text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion.",
        -        "maxLength": 100000,
        -        "type": "string"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "condition"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "press_key",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "key": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "key"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "click",
        +        "type": "string"
        +      },
        +      "button": {
        +        "default": "left",
        +        "enum": [
        +          "left",
        +          "middle",
        +          "right"
        +        ],
        +        "type": "string"
        +      },
        +      "click_count": {
        +        "anyOf": [
        +          {
        +            "const": 1,
        +            "type": "number"
        +          },
        +          {
        +            "const": 2,
        +            "type": "number"
        +          }
        +        ],
        +        "default": 1
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "default": "native",
        +        "description": "DOM: left single click, no modifiers.",
        +        "enum": [
        +          "native",
        +          "dom"
        +        ],
        +        "type": "string"
        +      },
        +      "modifiers": {
        +        "default": [],
        +        "items": {
        +          "enum": [
        +            "Alt",
        +            "Control",
        +            "Meta",
        +            "Shift"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "observe": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "frame": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "path": {
        +                "items": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "maxItems": 16,
        +                "minItems": 1,
        +                "type": "array"
        +              },
        +              "title": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "frame_id": {
        +            "type": "string"
        +          },
        +          "max_chars": {
        +            "default": 16000,
        +            "maximum": 64000,
        +            "minimum": 1000,
        +            "type": "integer"
        +          },
        +          "max_options": {
        +            "default": 30,
        +            "maximum": 100,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "maxLength": 10000,
        +            "type": "string"
        +          },
        +          "nth": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "popup_selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector_type": {
        +            "enum": [
        +              "css",
        +              "xpath",
        +              "label",
        +              "placeholder",
        +              "role"
        +            ],
        +            "type": "string"
        +          },
        +          "timeout_ms": {
        +            "default": 1000,
        +            "maximum": 5000,
        +            "minimum": 100,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "offset": {
        +        "additionalProperties": false,
        +        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        +        "properties": {
        +          "x_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "y_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "x_ratio",
        +          "y_ratio"
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "settle_ms": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "additionalItems": false,
        +            "items": [
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            ],
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          }
        +        ],
        +        "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max."
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "fill",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "expected_value": {
        +        "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.",
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "default": "native",
        +        "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.",
        +        "enum": [
        +          "native",
        +          "dom"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "observe": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "frame": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "path": {
        +                "items": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "maxItems": 16,
        +                "minItems": 1,
        +                "type": "array"
        +              },
        +              "title": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "frame_id": {
        +            "type": "string"
        +          },
        +          "max_chars": {
        +            "default": 16000,
        +            "maximum": 64000,
        +            "minimum": 1000,
        +            "type": "integer"
        +          },
        +          "max_options": {
        +            "default": 30,
        +            "maximum": 100,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "maxLength": 10000,
        +            "type": "string"
        +          },
        +          "nth": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "popup_selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector_type": {
        +            "enum": [
        +              "css",
        +              "xpath",
        +              "label",
        +              "placeholder",
        +              "role"
        +            ],
        +            "type": "string"
        +          },
        +          "timeout_ms": {
        +            "default": 1000,
        +            "maximum": 5000,
        +            "minimum": 100,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "type",
        +        "type": "string"
        +      },
        +      "delay_ms": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "additionalItems": false,
        +            "items": [
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            ],
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          }
        +        ],
        +        "default": 0,
        +        "description": "Between characters: ms or independent uniform [min,max]; min<=max."
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "focused": {
        +        "const": true,
        +        "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.",
        +        "type": "boolean"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "observe": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "frame": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "path": {
        +                "items": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "maxItems": 16,
        +                "minItems": 1,
        +                "type": "array"
        +              },
        +              "title": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "frame_id": {
        +            "type": "string"
        +          },
        +          "max_chars": {
        +            "default": 16000,
        +            "maximum": 64000,
        +            "minimum": 1000,
        +            "type": "integer"
        +          },
        +          "max_options": {
        +            "default": 30,
        +            "maximum": 100,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "maxLength": 10000,
        +            "type": "string"
        +          },
        +          "nth": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "popup_selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector_type": {
        +            "enum": [
        +              "css",
        +              "xpath",
        +              "label",
        +              "placeholder",
        +              "role"
        +            ],
        +            "type": "string"
        +          },
        +          "timeout_ms": {
        +            "default": 1000,
        +            "maximum": 5000,
        +            "minimum": 100,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "hover",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "observe": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "frame": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "path": {
        +                "items": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "maxItems": 16,
        +                "minItems": 1,
        +                "type": "array"
        +              },
        +              "title": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "frame_id": {
        +            "type": "string"
        +          },
        +          "max_chars": {
        +            "default": 16000,
        +            "maximum": 64000,
        +            "minimum": 1000,
        +            "type": "integer"
        +          },
        +          "max_options": {
        +            "default": 30,
        +            "maximum": 100,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "maxLength": 10000,
        +            "type": "string"
        +          },
        +          "nth": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "popup_selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector_type": {
        +            "enum": [
        +              "css",
        +              "xpath",
        +              "label",
        +              "placeholder",
        +              "role"
        +            ],
        +            "type": "string"
        +          },
        +          "timeout_ms": {
        +            "default": 1000,
        +            "maximum": 5000,
        +            "minimum": 100,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "offset": {
        +        "additionalProperties": false,
        +        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        +        "properties": {
        +          "x_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "y_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "x_ratio",
        +          "y_ratio"
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "select_option",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "index": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "observe": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "frame": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "path": {
        +                "items": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "maxItems": 16,
        +                "minItems": 1,
        +                "type": "array"
        +              },
        +              "title": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "frame_id": {
        +            "type": "string"
        +          },
        +          "max_chars": {
        +            "default": 16000,
        +            "maximum": 64000,
        +            "minimum": 1000,
        +            "type": "integer"
        +          },
        +          "max_options": {
        +            "default": 30,
        +            "maximum": 100,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "maxLength": 10000,
        +            "type": "string"
        +          },
        +          "nth": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "popup_selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector_type": {
        +            "enum": [
        +              "css",
        +              "xpath",
        +              "label",
        +              "placeholder",
        +              "role"
        +            ],
        +            "type": "string"
        +          },
        +          "timeout_ms": {
        +            "default": 1000,
        +            "maximum": 5000,
        +            "minimum": 100,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "value": {
        +        "description": "Exactly one value/label/index; strings match exactly, index is zero-based.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "scroll",
        +        "type": "string"
        +      },
        +      "delta_x": {
        +        "default": 0,
        +        "type": "number"
        +      },
        +      "delta_y": {
        +        "description": "Vertical delta, positive down; required without until.",
        +        "type": "number"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "max_steps": {
        +        "default": 100,
        +        "maximum": 500,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "mode": {
        +        "default": "dom",
        +        "enum": [
        +          "dom",
        +          "wheel"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "observe": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "frame": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "path": {
        +                "items": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "maxItems": 16,
        +                "minItems": 1,
        +                "type": "array"
        +              },
        +              "title": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "frame_id": {
        +            "type": "string"
        +          },
        +          "max_chars": {
        +            "default": 16000,
        +            "maximum": 64000,
        +            "minimum": 1000,
        +            "type": "integer"
        +          },
        +          "max_options": {
        +            "default": 30,
        +            "maximum": 100,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "maxLength": 10000,
        +            "type": "string"
        +          },
        +          "nth": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "popup_selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector_type": {
        +            "enum": [
        +              "css",
        +              "xpath",
        +              "label",
        +              "placeholder",
        +              "role"
        +            ],
        +            "type": "string"
        +          },
        +          "timeout_ms": {
        +            "default": 1000,
        +            "maximum": 5000,
        +            "minimum": 100,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "until": {
        +        "additionalProperties": false,
        +        "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.",
        +        "properties": {
        +          "selector": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "text": {
        +            "maxLength": 2000,
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "wait",
        +        "type": "string"
        +      },
        +      "condition": {
        +        "description": "Element conditions require selector; url/network_idle forbid locator fields.",
        +        "enum": [
        +          "attached",
        +          "absent",
        +          "visible",
        +          "actionable",
        +          "text",
        +          "value",
        +          "checked",
        +          "selected",
        +          "expanded",
        +          "url",
        +          "network_idle"
        +        ],
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "expected": {
        +        "anyOf": [
        +          {
        +            "maxLength": 100000,
        +            "type": "string"
        +          },
        +          {
        +            "type": "boolean"
        +          }
        +        ],
        +        "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise."
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "idle_ms": {
        +        "default": 500,
        +        "description": "network_idle quiet interval.",
        +        "maximum": 10000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "observe": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "frame": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "path": {
        +                "items": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "maxItems": 16,
        +                "minItems": 1,
        +                "type": "array"
        +              },
        +              "title": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "frame_id": {
        +            "type": "string"
        +          },
        +          "max_chars": {
        +            "default": 16000,
        +            "maximum": 64000,
        +            "minimum": 1000,
        +            "type": "integer"
        +          },
        +          "max_options": {
        +            "default": 30,
        +            "maximum": 100,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "maxLength": 10000,
        +            "type": "string"
        +          },
        +          "nth": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "popup_selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector_type": {
        +            "enum": [
        +              "css",
        +              "xpath",
        +              "label",
        +              "placeholder",
        +              "role"
        +            ],
        +            "type": "string"
        +          },
        +          "timeout_ms": {
        +            "default": 1000,
        +            "maximum": 5000,
        +            "minimum": 100,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "previous": {
        +        "description": "text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion.",
        +        "maxLength": 100000,
        +        "type": "string"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "condition"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "press_key",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "key": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "observe": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "frame": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "path": {
        +                "items": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "maxItems": 16,
        +                "minItems": 1,
        +                "type": "array"
        +              },
        +              "title": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "frame_id": {
        +            "type": "string"
        +          },
        +          "max_chars": {
        +            "default": 16000,
        +            "maximum": 64000,
        +            "minimum": 1000,
        +            "type": "integer"
        +          },
        +          "max_options": {
        +            "default": 30,
        +            "maximum": 100,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "maxLength": 10000,
        +            "type": "string"
        +          },
        +          "nth": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "popup_selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "selector_type": {
        +            "enum": [
        +              "css",
        +              "xpath",
        +              "label",
        +              "placeholder",
        +              "role"
        +            ],
        +            "type": "string"
        +          },
        +          "timeout_ms": {
        +            "default": 1000,
        +            "maximum": 5000,
        +            "minimum": 100,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "key"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / steps / maxItems
        Previous value: -20New value: +30
    • Changedbrowser_click2 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
    • Changedbrowser_drag2 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
    • Changedbrowser_fill2 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
    • Changedbrowser_hover2 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
    • Changedbrowser_logs1 field changed
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "console",
        -  "network"
        -]New value: +[
        +  "console",
        +  "network",
        +  "navigation"
        +]
    • Changedbrowser_press_key9 fields changed
      • addedInput schema / properties / frame
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +  "properties": {
        +    "path": {
        +      "items": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxItems": 16,
        +      "minItems": 1,
        +      "type": "array"
        +    },
        +    "title": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "url": {
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / frame_id
        Added value: +{
        +  "description": "Selector frame; default main.",
        +  "type": "string"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "role only: exact AX name; empty allowed.",
        +  "maxLength": 10000,
        +  "type": "string"
        +}
      • addedInput schema / properties / nth
        Added value: +{
        +  "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / selector
        Added value: +{
        +  "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +  "maxLength": 10000,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / selector_type
        Added value: +{
        +  "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +  "enum": [
        +    "css",
        +    "xpath",
        +    "label",
        +    "placeholder",
        +    "role"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
    • Addedbrowser_read_control
    • Changedbrowser_scroll2 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
    • Changedbrowser_select_option2 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
    • Changedbrowser_type2 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
    • Changedbrowser_upload_file2 fields changed
      • addedInput schema / properties / observe
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.",
        +  "properties": {
        +    "frame": {
        +      "additionalProperties": false,
        +      "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.",
        +      "properties": {
        +        "path": {
        +          "items": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "frame_id": {
        +      "description": "Selector frame; default main.",
        +      "type": "string"
        +    },
        +    "max_chars": {
        +      "default": 16000,
        +      "maximum": 64000,
        +      "minimum": 1000,
        +      "type": "integer"
        +    },
        +    "max_options": {
        +      "default": 30,
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "name": {
        +      "description": "role only: exact AX name; empty allowed.",
        +      "maxLength": 10000,
        +      "type": "string"
        +    },
        +    "nth": {
        +      "description": "Selector only: zero-based DOM index, AX tree order for role.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "popup_selector": {
        +      "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "ref": {
        +      "type": "string"
        +    },
        +    "selector": {
        +      "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".",
        +      "maxLength": 10000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "selector_type": {
        +      "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.",
        +      "enum": [
        +        "css",
        +        "xpath",
        +        "label",
        +        "placeholder",
        +        "role"
        +      ],
        +      "type": "string"
        +    },
        +    "timeout_ms": {
        +      "default": 1000,
        +      "maximum": 5000,
        +      "minimum": 100,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
  2. 3 tool updatesv0.25.2
    • Changedbrowser_batch1 field changed
      • changedInput schema / properties / steps / items / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "click",
        -        "type": "string"
        -      },
        -      "button": {
        -        "default": "left",
        -        "enum": [
        -          "left",
        -          "middle",
        -          "right"
        -        ],
        -        "type": "string"
        -      },
        -      "click_count": {
        -        "anyOf": [
        -          {
        -            "const": 1,
        -            "type": "number"
        -          },
        -          {
        -            "const": 2,
        -            "type": "number"
        -          }
        -        ],
        -        "default": 1
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "default": "native",
        -        "description": "DOM: left single click, no modifiers.",
        -        "enum": [
        -          "native",
        -          "dom"
        -        ],
        -        "type": "string"
        -      },
        -      "modifiers": {
        -        "default": [],
        -        "items": {
        -          "enum": [
        -            "Alt",
        -            "Control",
        -            "Meta",
        -            "Shift"
        -          ],
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "offset": {
        -        "additionalProperties": false,
        -        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        -        "properties": {
        -          "x_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "y_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x_ratio",
        -          "y_ratio"
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "settle_ms": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "additionalItems": false,
        -            "items": [
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              }
        -            ],
        -            "maxItems": 2,
        -            "minItems": 2,
        -            "type": "array"
        -          }
        -        ],
        -        "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max."
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "fill",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "expected_value": {
        -        "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.",
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "default": "native",
        -        "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.",
        -        "enum": [
        -          "native",
        -          "dom"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "type",
        -        "type": "string"
        -      },
        -      "delay_ms": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "additionalItems": false,
        -            "items": [
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              }
        -            ],
        -            "maxItems": 2,
        -            "minItems": 2,
        -            "type": "array"
        -          }
        -        ],
        -        "default": 0,
        -        "description": "Between characters: ms or independent uniform [min,max]; min<=max."
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "focused": {
        -        "const": true,
        -        "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.",
        -        "type": "boolean"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "hover",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "offset": {
        -        "additionalProperties": false,
        -        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        -        "properties": {
        -          "x_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "y_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x_ratio",
        -          "y_ratio"
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "select_option",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "index": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "label": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "value": {
        -        "description": "Exactly one value/label/index; strings match exactly, index is zero-based.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "scroll",
        -        "type": "string"
        -      },
        -      "delta_x": {
        -        "default": 0,
        -        "type": "number"
        -      },
        -      "delta_y": {
        -        "description": "Vertical delta, positive down; required without until.",
        -        "type": "number"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "max_steps": {
        -        "default": 100,
        -        "maximum": 500,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "mode": {
        -        "default": "dom",
        -        "enum": [
        -          "dom",
        -          "wheel"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "until": {
        -        "additionalProperties": false,
        -        "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.",
        -        "properties": {
        -          "selector": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "text": {
        -            "maxLength": 2000,
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "text"
        -        ],
        -        "type": "object"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "wait",
        -        "type": "string"
        -      },
        -      "condition": {
        -        "description": "Element conditions require selector; url/network_idle forbid locator fields.",
        -        "enum": [
        -          "attached",
        -          "absent",
        -          "visible",
        -          "actionable",
        -          "text",
        -          "value",
        -          "checked",
        -          "selected",
        -          "expanded",
        -          "url",
        -          "network_idle"
        -        ],
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "expected": {
        -        "anyOf": [
        -          {
        -            "maxLength": 100000,
        -            "type": "string"
        -          },
        -          {
        -            "type": "boolean"
        -          }
        -        ],
        -        "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise."
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "idle_ms": {
        -        "default": 500,
        -        "description": "network_idle quiet interval.",
        -        "maximum": 10000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "name": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "previous": {
        -        "description": "text only: wait for full rendered innerText to change; exclusive with expected.",
        -        "maxLength": 100000,
        -        "type": "string"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "condition"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "press_key",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "key": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "key"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "click",
        +        "type": "string"
        +      },
        +      "button": {
        +        "default": "left",
        +        "enum": [
        +          "left",
        +          "middle",
        +          "right"
        +        ],
        +        "type": "string"
        +      },
        +      "click_count": {
        +        "anyOf": [
        +          {
        +            "const": 1,
        +            "type": "number"
        +          },
        +          {
        +            "const": 2,
        +            "type": "number"
        +          }
        +        ],
        +        "default": 1
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "default": "native",
        +        "description": "DOM: left single click, no modifiers.",
        +        "enum": [
        +          "native",
        +          "dom"
        +        ],
        +        "type": "string"
        +      },
        +      "modifiers": {
        +        "default": [],
        +        "items": {
        +          "enum": [
        +            "Alt",
        +            "Control",
        +            "Meta",
        +            "Shift"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "offset": {
        +        "additionalProperties": false,
        +        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        +        "properties": {
        +          "x_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "y_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "x_ratio",
        +          "y_ratio"
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "settle_ms": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "additionalItems": false,
        +            "items": [
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            ],
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          }
        +        ],
        +        "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max."
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "fill",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "expected_value": {
        +        "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.",
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "default": "native",
        +        "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.",
        +        "enum": [
        +          "native",
        +          "dom"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "type",
        +        "type": "string"
        +      },
        +      "delay_ms": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "additionalItems": false,
        +            "items": [
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            ],
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          }
        +        ],
        +        "default": 0,
        +        "description": "Between characters: ms or independent uniform [min,max]; min<=max."
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "focused": {
        +        "const": true,
        +        "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.",
        +        "type": "boolean"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "hover",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "offset": {
        +        "additionalProperties": false,
        +        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        +        "properties": {
        +          "x_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "y_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "x_ratio",
        +          "y_ratio"
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "select_option",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "index": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "value": {
        +        "description": "Exactly one value/label/index; strings match exactly, index is zero-based.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "scroll",
        +        "type": "string"
        +      },
        +      "delta_x": {
        +        "default": 0,
        +        "type": "number"
        +      },
        +      "delta_y": {
        +        "description": "Vertical delta, positive down; required without until.",
        +        "type": "number"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "max_steps": {
        +        "default": 100,
        +        "maximum": 500,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "mode": {
        +        "default": "dom",
        +        "enum": [
        +          "dom",
        +          "wheel"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "until": {
        +        "additionalProperties": false,
        +        "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.",
        +        "properties": {
        +          "selector": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "text": {
        +            "maxLength": 2000,
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "wait",
        +        "type": "string"
        +      },
        +      "condition": {
        +        "description": "Element conditions require selector; url/network_idle forbid locator fields.",
        +        "enum": [
        +          "attached",
        +          "absent",
        +          "visible",
        +          "actionable",
        +          "text",
        +          "value",
        +          "checked",
        +          "selected",
        +          "expanded",
        +          "url",
        +          "network_idle"
        +        ],
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "expected": {
        +        "anyOf": [
        +          {
        +            "maxLength": 100000,
        +            "type": "string"
        +          },
        +          {
        +            "type": "boolean"
        +          }
        +        ],
        +        "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise."
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "idle_ms": {
        +        "default": 500,
        +        "description": "network_idle quiet interval.",
        +        "maximum": 10000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "previous": {
        +        "description": "text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion.",
        +        "maxLength": 100000,
        +        "type": "string"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "condition"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "press_key",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "key": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "key"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedbrowser_read_text1 field changed
      • changedInput schema / properties / mode / description
        Previous value: -"value: input/textarea/contenteditable; editor: exposed Monaco/CM5 model. Both require selector."New value: +"value: DOM field text; editor: exposed Monaco/CM5 model, otherwise error with evaluate guidance. Both require selector. Virtualized editor DOM/proxy values are not model text."
    • Changedbrowser_wait1 field changed
      • changedInput schema / properties / previous / description
        Previous value: -"text only: wait for full rendered innerText to change; exclusive with expected."New value: +"text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion."
  3. 1 tool updatev0.25.0
    • Changedbrowser_open_tab1 field changed
      • addedInput schema / properties / claim
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
  4. 17 tool updatesv0.24.2
    • Changedbrowser_batch3 fields changed
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • addedInput schema / properties / steps / description
        Added value: +"Element steps require selector; type uses selector XOR focused=true; scroll may omit target, wait follows condition. No refs; coordinates only for scroll x/y. Common locators: selector_type defaults css; label=exact associated HTML label with normalized whitespace; placeholder=exact attribute; role uses selector=\"link\", name=\"Claim\" (exact AX name, empty allowed). nth=zero-based DOM/AX-role order. Locator options need selector; frame/frame_id exclusive. frame needs at least one of exact url/title or nested CSS iframe path (each step unique, e.g. [\"#frame\"]). Steps may override dialog_policy."
      • changedInput schema / properties / steps / items / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "click",
        -        "type": "string"
        -      },
        -      "button": {
        -        "default": "left",
        -        "enum": [
        -          "left",
        -          "middle",
        -          "right"
        -        ],
        -        "type": "string"
        -      },
        -      "click_count": {
        -        "anyOf": [
        -          {
        -            "const": 1,
        -            "type": "number"
        -          },
        -          {
        -            "const": 2,
        -            "type": "number"
        -          }
        -        ],
        -        "default": 1
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "default": "native",
        -        "enum": [
        -          "native",
        -          "dom"
        -        ],
        -        "type": "string"
        -      },
        -      "modifiers": {
        -        "default": [],
        -        "items": {
        -          "enum": [
        -            "Alt",
        -            "Control",
        -            "Meta",
        -            "Shift"
        -          ],
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "offset": {
        -        "additionalProperties": false,
        -        "description": "Native element only: ratios within its content quad; offscreen/covered points fail.",
        -        "properties": {
        -          "x_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "y_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x_ratio",
        -          "y_ratio"
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "settle_ms": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "additionalItems": false,
        -            "items": [
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              }
        -            ],
        -            "maxItems": 2,
        -            "minItems": 2,
        -            "type": "array"
        -          }
        -        ],
        -        "description": "Pause after target preparation, before dispatch: fixed ms or uniform [min, max]."
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "fill",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "expected_value": {
        -        "description": "Explicit expected retained text after page formatting; default is text. Changes verification only, never the inserted text. No automatic numeric/date normalization or waiting for blur/async formatting.",
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "default": "native",
        -        "enum": [
        -          "native",
        -          "dom"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "type",
        -        "type": "string"
        -      },
        -      "delay_ms": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "additionalItems": false,
        -            "items": [
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              }
        -            ],
        -            "maxItems": 2,
        -            "minItems": 2,
        -            "type": "array"
        -          }
        -        ],
        -        "default": 0,
        -        "description": "Between characters: fixed ms or independently sampled uniform [min, max]."
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "focused": {
        -        "const": true,
        -        "description": "Alternative to ref/selector: pin the currently focused editable element without refocusing it. Stops if focus changes.",
        -        "type": "boolean"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.",
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "hover",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "offset": {
        -        "additionalProperties": false,
        -        "description": "Native element only: ratios within its content quad; offscreen/covered points fail.",
        -        "properties": {
        -          "x_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "y_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x_ratio",
        -          "y_ratio"
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "select_option",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "index": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "label": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "value": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "scroll",
        -        "type": "string"
        -      },
        -      "delta_x": {
        -        "default": 0,
        -        "type": "number"
        -      },
        -      "delta_y": {
        -        "description": "Positive scrolls down.",
        -        "type": "number"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "max_steps": {
        -        "default": 100,
        -        "maximum": 500,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "mode": {
        -        "default": "dom",
        -        "enum": [
        -          "dom",
        -          "wheel"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.",
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "until": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "selector": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "text": {
        -            "maxLength": 2000,
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "text"
        -        ],
        -        "type": "object"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "wait",
        -        "type": "string"
        -      },
        -      "condition": {
        -        "enum": [
        -          "attached",
        -          "absent",
        -          "visible",
        -          "actionable",
        -          "text",
        -          "value",
        -          "checked",
        -          "selected",
        -          "expanded",
        -          "url",
        -          "network_idle"
        -        ],
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "expected": {
        -        "anyOf": [
        -          {
        -            "maxLength": 100000,
        -            "type": "string"
        -          },
        -          {
        -            "type": "boolean"
        -          }
        -        ],
        -        "description": "text/url: substring; value: exact string; checked/selected/expanded: boolean (checked also accepts \"mixed\")."
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "idle_ms": {
        -        "default": 500,
        -        "maximum": 10000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "previous": {
        -        "description": "Text only: wait for full rendered innerText to differ; alternative to expected.",
        -        "maxLength": 100000,
        -        "type": "string"
        -      },
        -      "selector": {
        -        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.",
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "condition"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "press_key",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "key": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "key"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "click",
        +        "type": "string"
        +      },
        +      "button": {
        +        "default": "left",
        +        "enum": [
        +          "left",
        +          "middle",
        +          "right"
        +        ],
        +        "type": "string"
        +      },
        +      "click_count": {
        +        "anyOf": [
        +          {
        +            "const": 1,
        +            "type": "number"
        +          },
        +          {
        +            "const": 2,
        +            "type": "number"
        +          }
        +        ],
        +        "default": 1
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "default": "native",
        +        "description": "DOM: left single click, no modifiers.",
        +        "enum": [
        +          "native",
        +          "dom"
        +        ],
        +        "type": "string"
        +      },
        +      "modifiers": {
        +        "default": [],
        +        "items": {
        +          "enum": [
        +            "Alt",
        +            "Control",
        +            "Meta",
        +            "Shift"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "offset": {
        +        "additionalProperties": false,
        +        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        +        "properties": {
        +          "x_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "y_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "x_ratio",
        +          "y_ratio"
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "settle_ms": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "additionalItems": false,
        +            "items": [
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            ],
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          }
        +        ],
        +        "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max."
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "fill",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "expected_value": {
        +        "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.",
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "default": "native",
        +        "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.",
        +        "enum": [
        +          "native",
        +          "dom"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "type",
        +        "type": "string"
        +      },
        +      "delay_ms": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "additionalItems": false,
        +            "items": [
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            ],
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          }
        +        ],
        +        "default": 0,
        +        "description": "Between characters: ms or independent uniform [min,max]; min<=max."
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "focused": {
        +        "const": true,
        +        "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.",
        +        "type": "boolean"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "hover",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "offset": {
        +        "additionalProperties": false,
        +        "description": "Native element only: ratios within its content quad; hit checks still apply.",
        +        "properties": {
        +          "x_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "y_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "x_ratio",
        +          "y_ratio"
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "select_option",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "index": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "value": {
        +        "description": "Exactly one value/label/index; strings match exactly, index is zero-based.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "scroll",
        +        "type": "string"
        +      },
        +      "delta_x": {
        +        "default": 0,
        +        "type": "number"
        +      },
        +      "delta_y": {
        +        "description": "Vertical delta, positive down; required without until.",
        +        "type": "number"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "max_steps": {
        +        "default": 100,
        +        "maximum": 500,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "mode": {
        +        "default": "dom",
        +        "enum": [
        +          "dom",
        +          "wheel"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "until": {
        +        "additionalProperties": false,
        +        "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.",
        +        "properties": {
        +          "selector": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "text": {
        +            "maxLength": 2000,
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "wait",
        +        "type": "string"
        +      },
        +      "condition": {
        +        "description": "Element conditions require selector; url/network_idle forbid locator fields.",
        +        "enum": [
        +          "attached",
        +          "absent",
        +          "visible",
        +          "actionable",
        +          "text",
        +          "value",
        +          "checked",
        +          "selected",
        +          "expanded",
        +          "url",
        +          "network_idle"
        +        ],
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "expected": {
        +        "anyOf": [
        +          {
        +            "maxLength": 100000,
        +            "type": "string"
        +          },
        +          {
        +            "type": "boolean"
        +          }
        +        ],
        +        "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise."
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "idle_ms": {
        +        "default": 500,
        +        "description": "network_idle quiet interval.",
        +        "maximum": 10000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "name": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "previous": {
        +        "description": "text only: wait for full rendered innerText to change; exclusive with expected.",
        +        "maxLength": 100000,
        +        "type": "string"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "condition"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "press_key",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "key": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "key"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedbrowser_click12 fields changed
      • changedInput schema / properties / coordinate_space / description
        Previous value: -"Coordinates only; document scrolls the top-level page first."New value: +"x+y only; document scrolls the top-level page first."
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / mode / description
        Previous value: -"DOM click requires an element target and a left single click without modifiers."New value: +"DOM: ref/selector, left single click, no modifiers."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / offset / description
        Previous value: -"Native element only: ratios within its content quad; offscreen/covered points fail."New value: +"Native element only: ratios within its content quad; hit checks still apply."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / settle_ms / description
        Previous value: -"Pause after target preparation, before dispatch: fixed ms or uniform [min, max]."New value: +"After preparation, before dispatch: ms or uniform [min,max]; min<=max."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
    • Changedbrowser_drag18 fields changed
      • changedInput schema / properties / destination / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / destination / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / destination / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / destination / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / destination / properties / offset / description
        Previous value: -"Native element only: ratios within its content quad; offscreen/covered points fail."New value: +"Native element only: ratios within its content quad; hit checks still apply."
      • changedInput schema / properties / destination / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / destination / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / settle_ms / description
        Previous value: -"Pause after target preparation, before dispatch: fixed ms or uniform [min, max]."New value: +"After preparation, before dispatch: ms or uniform [min,max]; min<=max."
      • changedInput schema / properties / source / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / source / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / source / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / source / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / source / properties / offset / description
        Previous value: -"Native element only: ratios within its content quad; offscreen/covered points fail."New value: +"Native element only: ratios within its content quad; hit checks still apply."
      • changedInput schema / properties / source / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / source / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
      • changedInput schema / properties / trajectory / description
        Previous value: -"Opt in to curved, variable-speed steps and varied intervals. Signed curve control-point offset in CSS px; duration covers interpolation waits only."New value: +"Opt-in curved, variable-speed steps/intervals; curve_px is signed CSS-pixel offset. Duration covers interpolation waits only."
    • Changedbrowser_evaluate4 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Cached JSON instead of expression; omit frame, frame_id and result_type=element."New value: +"Exactly one of expression/cursor. Cursor reads cached JSON; omit frame/frame_id and result_type=element."
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • addedInput schema / properties / result_type / description
        Added value: +"element: return one connected DOM element as a ref."
    • Changedbrowser_fetch3 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Default text (rendered); html=current DOM with dom=rendered; json=complete validated JSON."New value: +"Default rendered text; html=current DOM (dom=rendered); json=validated JSON."
      • changedInput schema / properties / max_chars / description
        Previous value: -"Text/HTML page budget; JSON ignores this and returns whole, up to 1M chars. capture_truncated means text/HTML loss; oversized JSON errors."New value: +"Text/HTML page budget; capture_truncated marks source loss. JSON returns whole, ignores this budget, errors above 1M chars."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Default 15000; total deadline including creation/cleanup, with time reserved for capture after an unmet wait."New value: +"Default 15000; total including creation/cleanup, reserving capture time after unmet waits."
    • Changedbrowser_fill10 fields changed
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / expected_value / description
        Previous value: -"Explicit expected retained text after page formatting; default is text. Changes verification only, never the inserted text. No automatic numeric/date normalization or waiting for blur/async formatting."New value: +"Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • addedInput schema / properties / mode / description
        Added value: +"native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
    • Changedbrowser_hover9 fields changed
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / offset / description
        Previous value: -"Native element only: ratios within its content quad; offscreen/covered points fail."New value: +"Native element only: ratios within its content quad; hit checks still apply."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
    • Changedbrowser_navigate1 field changed
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
    • Changedbrowser_press_key2 fields changed
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
    • Changedbrowser_read_text6 fields changed
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • addedInput schema / properties / mode / description
        Added value: +"value: input/textarea/contenteditable; editor: exposed Monaco/CM5 model. Both require selector."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
    • Changedbrowser_screenshot6 fields changed
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
    • Changedbrowser_scroll10 fields changed
      • changedInput schema / properties / delta_y / description
        Previous value: -"Positive scrolls down."New value: +"Vertical delta, positive down; required without until."
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
      • addedInput schema / properties / until / description
        Added value: +"DOM-only search of visible elements' textContent; selector is a CSS filter within the container."
    • Changedbrowser_select_option9 fields changed
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
      • changedInput schema / properties / value / description
        Previous value: -"Choose exactly one of value, label or zero-based index; value/label match exactly."New value: +"Exactly one value/label/index; strings match exactly, index is zero-based."
    • Changedbrowser_snapshot2 fields changed
      • changedInput schema / properties / include_hidden / description
        Previous value: -"fields only, default false: also include native fields omitted from AX, such as hidden inputs. These may have ref=null. Password values are omitted."New value: +"fields only, default false: include native fields omitted from AX; ref may be null. Password values omitted."
      • changedInput schema / properties / profile / description
        Previous value: -"Default full; interactive keeps controls and ancestors; fields returns a fields array instead of AX text."New value: +"Default full; interactive keeps controls/ancestors; fields returns separate DOM/AX values in a fields array."
    • Changedbrowser_type10 fields changed
      • changedInput schema / properties / delay_ms / description
        Previous value: -"Between characters: fixed ms or independently sampled uniform [min, max]."New value: +"Between characters: ms or independent uniform [min,max]; min<=max."
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / focused / description
        Previous value: -"Alternative to ref/selector: pin the currently focused editable element without refocusing it. Stops if focus changes."New value: +"Pin current editable focus without refocusing; exclusive with ref/selector and locator options."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
    • Changedbrowser_upload_file8 fields changed
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • changedInput schema / properties / frame_id / description
        Previous value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
    • Changedbrowser_wait10 fields changed
      • addedInput schema / properties / condition / description
        Added value: +"Element conditions require selector; url/network_idle forbid locator fields."
      • changedInput schema / properties / dialog_policy / description
        Previous value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
      • changedInput schema / properties / expected / description
        Previous value: -"text/url: substring; value: exact string; checked/selected/expanded: boolean (checked also accepts \"mixed\")."New value: +"Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise."
      • changedInput schema / properties / frame / description
        Previous value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id."
      • addedInput schema / properties / idle_ms / description
        Added value: +"network_idle quiet interval."
      • changedInput schema / properties / name / description
        Previous value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed."
      • changedInput schema / properties / nth / description
        Previous value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role."
      • changedInput schema / properties / previous / description
        Previous value: -"Text only: wait for full rendered innerText to differ; alternative to expected."New value: +"text only: wait for full rendered innerText to change; exclusive with expected."
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"."
      • changedInput schema / properties / selector_type / description
        Previous value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
  5. 12 tool updatesv0.24.1
    • Changedbrowser_batch1 field changed
      • changedInput schema / properties / steps / items / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "click",
        -        "type": "string"
        -      },
        -      "button": {
        -        "default": "left",
        -        "enum": [
        -          "left",
        -          "middle",
        -          "right"
        -        ],
        -        "type": "string"
        -      },
        -      "click_count": {
        -        "anyOf": [
        -          {
        -            "const": 1,
        -            "type": "number"
        -          },
        -          {
        -            "const": 2,
        -            "type": "number"
        -          }
        -        ],
        -        "default": 1
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "default": "native",
        -        "enum": [
        -          "native",
        -          "dom"
        -        ],
        -        "type": "string"
        -      },
        -      "modifiers": {
        -        "default": [],
        -        "items": {
        -          "enum": [
        -            "Alt",
        -            "Control",
        -            "Meta",
        -            "Shift"
        -          ],
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "offset": {
        -        "additionalProperties": false,
        -        "description": "Native element only: ratios within its content quad; offscreen/covered points fail.",
        -        "properties": {
        -          "x_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "y_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x_ratio",
        -          "y_ratio"
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "settle_ms": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "additionalItems": false,
        -            "items": [
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              }
        -            ],
        -            "maxItems": 2,
        -            "minItems": 2,
        -            "type": "array"
        -          }
        -        ],
        -        "description": "Pause after target preparation, before dispatch: fixed ms or uniform [min, max]."
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "fill",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "expected_value": {
        -        "description": "Explicit expected retained text after page formatting; default is text. Changes verification only, never the inserted text. No automatic numeric/date normalization or waiting for blur/async formatting.",
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "default": "native",
        -        "enum": [
        -          "native",
        -          "dom"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "type",
        -        "type": "string"
        -      },
        -      "delay_ms": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "additionalItems": false,
        -            "items": [
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              {
        -                "maximum": 1000,
        -                "minimum": 0,
        -                "type": "integer"
        -              }
        -            ],
        -            "maxItems": 2,
        -            "minItems": 2,
        -            "type": "array"
        -          }
        -        ],
        -        "default": 0,
        -        "description": "Between characters: fixed ms or independently sampled uniform [min, max]."
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "focused": {
        -        "const": true,
        -        "description": "Alternative to ref/selector: pin the currently focused editable element without refocusing it. Stops if focus changes.",
        -        "type": "boolean"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type.",
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "hover",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "offset": {
        -        "additionalProperties": false,
        -        "description": "Native element only: ratios within its content quad; offscreen/covered points fail.",
        -        "properties": {
        -          "x_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "y_ratio": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x_ratio",
        -          "y_ratio"
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "select_option",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "index": {
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "label": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "value": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "selector"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "scroll",
        -        "type": "string"
        -      },
        -      "delta_x": {
        -        "default": 0,
        -        "type": "number"
        -      },
        -      "delta_y": {
        -        "description": "Positive scrolls down.",
        -        "type": "number"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "max_steps": {
        -        "default": 100,
        -        "maximum": 500,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "mode": {
        -        "default": "dom",
        -        "enum": [
        -          "dom",
        -          "wheel"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "selector": {
        -        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type.",
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "until": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "selector": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "text": {
        -            "maxLength": 2000,
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "text"
        -        ],
        -        "type": "object"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "wait",
        -        "type": "string"
        -      },
        -      "condition": {
        -        "enum": [
        -          "attached",
        -          "absent",
        -          "visible",
        -          "actionable",
        -          "text",
        -          "value",
        -          "checked",
        -          "selected",
        -          "expanded",
        -          "url",
        -          "network_idle"
        -        ],
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "expected": {
        -        "anyOf": [
        -          {
        -            "maxLength": 100000,
        -            "type": "string"
        -          },
        -          {
        -            "type": "boolean"
        -          }
        -        ],
        -        "description": "text/url: substring; value: exact string; checked/selected/expanded: boolean (checked also accepts \"mixed\")."
        -      },
        -      "frame": {
        -        "additionalProperties": false,
        -        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        -        "properties": {
        -          "path": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 16,
        -            "minItems": 1,
        -            "type": "array"
        -          },
        -          "title": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "url": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "frame_id": {
        -        "type": "string"
        -      },
        -      "idle_ms": {
        -        "default": 500,
        -        "maximum": 10000,
        -        "minimum": 100,
        -        "type": "integer"
        -      },
        -      "name": {
        -        "description": "role only: exact accessible name; may be empty.",
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "nth": {
        -        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "previous": {
        -        "description": "Text only: wait for full rendered innerText to differ; alternative to expected.",
        -        "maxLength": 100000,
        -        "type": "string"
        -      },
        -      "selector": {
        -        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type.",
        -        "maxLength": 10000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "selector_type": {
        -        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        -        "enum": [
        -          "css",
        -          "xpath",
        -          "label",
        -          "placeholder",
        -          "role"
        -        ],
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "condition"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "action": {
        -        "const": "press_key",
        -        "type": "string"
        -      },
        -      "dialog_policy": {
        -        "enum": [
        -          "ask",
        -          "accept",
        -          "dismiss"
        -        ],
        -        "type": "string"
        -      },
        -      "key": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "maximum": 30000,
        -        "minimum": 100,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "key"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "click",
        +        "type": "string"
        +      },
        +      "button": {
        +        "default": "left",
        +        "enum": [
        +          "left",
        +          "middle",
        +          "right"
        +        ],
        +        "type": "string"
        +      },
        +      "click_count": {
        +        "anyOf": [
        +          {
        +            "const": 1,
        +            "type": "number"
        +          },
        +          {
        +            "const": 2,
        +            "type": "number"
        +          }
        +        ],
        +        "default": 1
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "default": "native",
        +        "enum": [
        +          "native",
        +          "dom"
        +        ],
        +        "type": "string"
        +      },
        +      "modifiers": {
        +        "default": [],
        +        "items": {
        +          "enum": [
        +            "Alt",
        +            "Control",
        +            "Meta",
        +            "Shift"
        +          ],
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "name": {
        +        "description": "role only: exact accessible name; may be empty.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "offset": {
        +        "additionalProperties": false,
        +        "description": "Native element only: ratios within its content quad; offscreen/covered points fail.",
        +        "properties": {
        +          "x_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "y_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "x_ratio",
        +          "y_ratio"
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "settle_ms": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "additionalItems": false,
        +            "items": [
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            ],
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pause after target preparation, before dispatch: fixed ms or uniform [min, max]."
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "fill",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "expected_value": {
        +        "description": "Explicit expected retained text after page formatting; default is text. Changes verification only, never the inserted text. No automatic numeric/date normalization or waiting for blur/async formatting.",
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "default": "native",
        +        "enum": [
        +          "native",
        +          "dom"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "role only: exact accessible name; may be empty.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "type",
        +        "type": "string"
        +      },
        +      "delay_ms": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "additionalItems": false,
        +            "items": [
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "maximum": 1000,
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            ],
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          }
        +        ],
        +        "default": 0,
        +        "description": "Between characters: fixed ms or independently sampled uniform [min, max]."
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "focused": {
        +        "const": true,
        +        "description": "Alternative to ref/selector: pin the currently focused editable element without refocusing it. Stops if focus changes.",
        +        "type": "boolean"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "role only: exact accessible name; may be empty.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.",
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "hover",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "role only: exact accessible name; may be empty.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "offset": {
        +        "additionalProperties": false,
        +        "description": "Native element only: ratios within its content quad; offscreen/covered points fail.",
        +        "properties": {
        +          "x_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "y_ratio": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "x_ratio",
        +          "y_ratio"
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "select_option",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "index": {
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "role only: exact accessible name; may be empty.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "value": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "selector"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "scroll",
        +        "type": "string"
        +      },
        +      "delta_x": {
        +        "default": 0,
        +        "type": "number"
        +      },
        +      "delta_y": {
        +        "description": "Positive scrolls down.",
        +        "type": "number"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "max_steps": {
        +        "default": 100,
        +        "maximum": 500,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "mode": {
        +        "default": "dom",
        +        "enum": [
        +          "dom",
        +          "wheel"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "role only: exact accessible name; may be empty.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "selector": {
        +        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.",
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "until": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "selector": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "text": {
        +            "maxLength": 2000,
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "wait",
        +        "type": "string"
        +      },
        +      "condition": {
        +        "enum": [
        +          "attached",
        +          "absent",
        +          "visible",
        +          "actionable",
        +          "text",
        +          "value",
        +          "checked",
        +          "selected",
        +          "expanded",
        +          "url",
        +          "network_idle"
        +        ],
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "expected": {
        +        "anyOf": [
        +          {
        +            "maxLength": 100000,
        +            "type": "string"
        +          },
        +          {
        +            "type": "boolean"
        +          }
        +        ],
        +        "description": "text/url: substring; value: exact string; checked/selected/expanded: boolean (checked also accepts \"mixed\")."
        +      },
        +      "frame": {
        +        "additionalProperties": false,
        +        "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.",
        +        "properties": {
        +          "path": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 16,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "title": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "url": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "frame_id": {
        +        "type": "string"
        +      },
        +      "idle_ms": {
        +        "default": 500,
        +        "maximum": 10000,
        +        "minimum": 100,
        +        "type": "integer"
        +      },
        +      "name": {
        +        "description": "role only: exact accessible name; may be empty.",
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "nth": {
        +        "description": "Zero-based match index: DOM order, or AX tree order for role.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "previous": {
        +        "description": "Text only: wait for full rendered innerText to differ; alternative to expected.",
        +        "maxLength": 100000,
        +        "type": "string"
        +      },
        +      "selector": {
        +        "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.",
        +        "maxLength": 10000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "selector_type": {
        +        "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.",
        +        "enum": [
        +          "css",
        +          "xpath",
        +          "label",
        +          "placeholder",
        +          "role"
        +        ],
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "condition"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "press_key",
        +        "type": "string"
        +      },
        +      "dialog_policy": {
        +        "enum": [
        +          "ask",
        +          "accept",
        +          "dismiss"
        +        ],
        +        "type": "string"
        +      },
        +      "key": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "maximum": 30000,
        +        "minimum": 100,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "key"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedbrowser_click1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_drag2 fields changed
      • changedInput schema / properties / destination / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
      • changedInput schema / properties / source / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_fill1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_hover1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_read_text1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_screenshot1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_scroll1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_select_option1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_type1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_upload_file1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
    • Changedbrowser_wait1 field changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
  6. 23 tool updatesv0.24.0
    • First observedbrowser_batch
    • First observedbrowser_claim_tab
    • First observedbrowser_click
    • First observedbrowser_discover
    • First observedbrowser_drag
    • First observedbrowser_evaluate
    • First observedbrowser_fetch
    • First observedbrowser_fill
    • First observedbrowser_handle_dialog
    • First observedbrowser_hover
    • First observedbrowser_logs
    • First observedbrowser_navigate
    • First observedbrowser_open_tab
    • First observedbrowser_press_key
    • First observedbrowser_read_text
    • First observedbrowser_screenshot
    • First observedbrowser_scroll
    • First observedbrowser_select_option
    • First observedbrowser_snapshot
    • First observedbrowser_tab_control
    • First observedbrowser_type
    • First observedbrowser_upload_file
    • First observedbrowser_wait

TDQS

B3.4/5.0

Scored across 24 tools

Disambiguation4/5

Most tools target a clearly distinct action (click, hover, drag, scroll, press_key, screenshot, upload, dialog), and the tab-lifecycle group (discover, claim_tab, open_tab, tab_control) is well separated. The main ambiguity is in the read/input clusters: browser_type vs browser_fill, and browser_read_text vs browser_snapshot vs browser_read_control overlap in purpose, though descriptions do draw explicit boundaries (fill replaces, type appends; snapshot=AX refs, read_text=visible text, read_control=single control).

Naming Consistency4/5

All 24 tools use a uniform browser_ prefix with snake_case, which is highly predictable. The pattern is verb-first (browser_click, browser_fill, browser_navigate, browser_read_text) with one structural outlier, browser_tab_control, which reads as noun_verb and slightly breaks the convention.

Tool Count4/5

At 24 tools this sits at the top of the reasonable band, and it is on the heavy side. However, browser automation genuinely spans input primitives, reading modes, tab lifecycle, dialogs, uploads, logs, batch and evaluate, so nearly every tool covers a real capability rather than padding.

Completeness4/5

Coverage is broad and lifecycle-complete: discover/claim/open/navigate/tab_control for tabs, a full input set, multiple read modes, screenshots, dialogs, uploads, logs and batch orchestration. Gaps are minor — no download handling, cookie/storage or network interception tools, and no dedicated frame-switching tool (frames are only implied in read_text), which agents must work around via evaluate.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables any MCP client to drive the user's real Chrome profile through a Chrome extension bridge, with tools for navigation, accessibility snapshots, ref-based interactions, console/network reading, screenshots, tab management, and restricted script evaluation.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI coding tools to drive your real, already-logged-in Chrome browser through an extension-based local MCP bridge, with no debugging port or headless setup required. It provides tools for navigating pages, reading content, clicking, typing, screenshots, tabs, cookies, network inspection, and more.
    1 npm
    ISC
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI coding tools to drive the user's real, already-logged-in Chrome through an MCP stdio interface, exposing 25 tools for navigating, clicking, typing, reading pages, taking screenshots, capturing network traffic, and accessing cookies and storage. The bundled Chrome extension talks to a local bridge instead of an open remote-debugging port, so logged-in sessions and bot-detection-proof human browsing work without extra setup.
    1 npm
    ISC
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables MCP-compatible AI assistants to drive the user's real, already-logged-in Chrome browser locally, so they can read and summarize pages, click, type, fill and submit forms, navigate tabs, and capture screenshots with full access to existing sessions. It also exposes cookies, storage, console, network capture, and emulation capabilities without opening a remote-debugging port or sending data off the machine.
    1 npm
    ISC